F28335第十二篇——串口拓展(XR16C854)

本文介绍一种串口拓展方法。硬件上基于DSP28335和XR16C854。实现最XR16C854最简单的使用方法。XR16C854有更多强大的功能,大家可以参考其技术手册。

硬件设计

F28335第十二篇——串口拓展(XR16C854)_第1张图片
XR16C854是一款4通道的串口拓展芯片,最大的传输速率可以达到2Mb/s。其原理图如上图所示。本例程使用最简单的查询发送方法。与DSP的外部接口模块(XINTF)实现数据交换。所以只用到以下几个管脚:

  • XTAL1与XTAL2:外接晶振。本例程接入的是7.3728Mhz的外部无源晶振。
  • D0~D7:与F28335连接的数据8位数据并口。连接到F28335的XD0到XD7(GPIO79到GPIO72)。
  • IOR和IOW:读选通与写选通,低电平有效。分别连接到F28335的XRD与XWE0(GPIO38)管脚相连接。
  • TXA到TXD:串口数据发送A通道到D通道。
  • RXA到RXD:串口数据接收A通道到D通道。
  • A0到A2:寄存器地址选择位。连接到F28335的XA0(GPIO40)到XA2(GPIO42)。
  • CSA到CSD:通道A到通道D的选择信号(低电平有效)。将F28335高位地址位通过与非门编址,如:
    • CSA 0x1001xx
    • CSB 0x1002xx
    • CSC 0x1003xx
    • CSD 0x1004xx

16C854使用简介

在16C854中寄存器的选择通过A0到A2的编址实现。下面所述地址即将A2到A0置位。用[r/w-0x00]代表寄存器为可读写,且初始值为0x00.

串口传送数据格式设置

LCR(Line Control Register)

  • 地址:011b
  • 描述:r/w=0x00
  • 功能:用于描述串口数据的格式。

LCR[1:0]:接收和发送数据的长度选择

BIT-1 BIT-0 字长
0 0 5(默认)
0 1 6
1 0 7
1 1 8

LCR[2]:发送和接收停止位字长

BIT-2 字长 停止位字长
0 5,6,7,8 1
1 5 1-1/2
1 6,7,8 2

LCR[5:3] :奇偶校验

BIT-5 BIT-4 BIT-3 奇偶校验
x x 0 无校验
0 0 1 奇校验
0 1 1 偶校验
1 0 1 强制校验位置位1
1 1 1 强制校验位清零0

LCR[6]:发送中断使能

0:禁止
1:使能。强制输出数据为0,直到此位禁止。

LCR[7]:寄存器选择位

16C854中,除了通过A0到A2编址来区别寄存器外,另外重要的一项区分就是LCR的值。LCR的值决定了该器件的寄存器类型。根据LCR的值,寄存器类型可以分成三种情况。

  • LCR[7]=0:数据寄存器
  • LCR=0xBF:高级功能寄存器
  • LCR[7]=1且LCR≠0xBF:波特率设置寄存器。

波特率设置

F28335第十二篇——串口拓展(XR16C854)_第2张图片
如上图所示,在XR16C854中,波特率的值与两组寄存器相关:MCR以及DLL和DLM。其具体的计算公式为:

d i v i s o r = X T A L 1 _ c l o c k p r e s c a l e r × ( 16 × B a u d R a t e G e n e r a t o r ) divisor = \frac{XTAL1\_clock}{prescaler\times(16\times BaudRateGenerator)} divisor=prescaler×(16×BaudRateGenerator)XTAL1_clock
其中:
p r e s c a l e r = { 1 M C R [ 7 ] = 0 4 M C R [ 7 ] = 1 prescaler= \begin{cases} 1&MCR[7]=0\\ 4&MCR[7]=1 \end{cases} prescaler={14MCR[7]=0MCR[7]=1

DLL和DLM

  • 地址:000b(DLL)和001b(DLM)
  • 条件:LCR[7] = 1, LCR ≠0xBF
  • 描述:r/w
  • 功能:DLM和DLL分别为波特率分频系数( Baud Rate Generator)的高8位和低8位。

MCR(Modem Control Register)

  • 地址:100b
  • 条件:LCR[7]=0
  • 描述:r/w-0x00

MCR[0]:DTR#输出

0:强制DTR#输出为1(默认)
1:强制DTR#输出为0

MCR[1]:RTS#输出

0:强制RTS#输出为1(默认)
1:强制RTS#输出为0

MCR[2]:保留

MCR[3]:中断输出使能

  • 0:中断输出禁止
  • 1:中断输出使能

MCR[4]:内部回送使能

  • 0:禁止回送功能
  • 1:使能回送功能

MCR[5]:Xon-Any 使能

  • 0:禁止Xon-Any功能
  • 1:使能Xon-Any

MCR[6]:红外编码/解码使能

  • 0:使能标准调制解调器接收发送数据
  • 1:使能红外接收传送。

MCR[7]:时钟预分频选择

  • 0:不分频
  • 1:4分频

查询状态

LSR( Line Status Register )

  • 地址:101b
  • 条件:LCR[7]=0
  • 描述:r-0x60

LSR[0]:接收数据(RHR)就绪

  • 0: 接收保持寄存器为空
  • 1: 数据已经接收且保持在接收保持寄存器中

LSR[1]:接收器溢出标志

  • 0:无溢出标志
  • 1:溢出错误

LSR[2]:接收数据校验错误

  • 0:没有校验出错
  • 1:奇偶校验出错

LSR[3]:接收数据帧错误

  • 0:没有帧错误
  • 1:帧错误标记。没有有效停止位。

LSR[4]: 接收中断标志

  • 0:无中断条件发生
  • 1:接收器接收到中断标志。(接收端0维持至少一个字节帧长度)

LSR[5]:发送保持寄存器(THR)空标志

  • 0:发送保持寄存器中有数据未被传送到移位寄存器中。
  • 1:发送保持器为空。

LSR[6]:THR(发送保持寄存器)和TSR(发送移位寄存器)空标志

  • 0:THR或者TSR并非为空。
  • 1:发送器处于闲置状态。

LSR[7]:接收FIFO数据错误标志

  • 0:没有接收FIFO错误
  • 1:在接收FIFO中,至少有一个数据帧有错误。

发送/接收数据

RHR(Receive Holding Register)和THR(Transmit Holding Register)

  • 地址:000b
  • 条件:LCR[7]=0
  • 描述:
    • RHR:r
    • THR:w

软件设计

主要功能

通过D通道为例,以查询的方式实现数据的收和发功能。

源代码

#define CSA (Uint16 *)0x100100
#define CSB (Uint16 *)0x100200
#define CSC (Uint16 *)0x100300
#define CSD (Uint16 *)0x100400

Uint16 rx = 0x00;
Uint16 tx = 0x00;
int main(void)
{

    //1.系统初始化
    InitSysCtrl();
    //2.关闭中断
    DINT;
    IER = 0x0000;
    IFR = 0x0000;
    InitPieCtrl();
    //3.初始化GPIO
    InitXintf();
    
    //4.自定义程序
    //LCR[7]=1
    *(CSD + 3) = 0x80;  //LCR
    *(CSD ) = 0x04; //DLL:波特率为7.3728M/(4*16)=115200
    *(CSD + 1) = 0x00; //DLM

    //LCR[7]=0
    *(CSD + 3) = 0x03; //LCR:8位数据,无校验,一位停止位。

    while (1)
    {
        tx++;
        //发送数据
        while ((*(CSD + 5) & 0x0020) == 0);
        *CSD = tx & 0x00FF;
        //接收数据
        if ((*(CSD + 5) & 0x0001) == 1)  //LSR:RX Data Ready
        {
            rx = *(CSD ) & 0x00FF;
        }
    }
}

你可能感兴趣的:(#,F28335)