您的当前位置:首页正文

McBSP模拟UART通信

2023-12-08 来源:步旅网
基于TMS320C6416T DSK的McBSP和EDMA实现串口通信

针对TI公司的DSP芯片TMS320C6416T DSK,利用片上同步多通道缓冲串行口(McBSP)和增强型直接存储器存取(EDMA)实现了串口通信功能。该方案解决了芯片只有同步串口而不能进行异步传输的问题,丰富了接口功能。

数字信号处理器因其高性能及强大的数据处理能力,而在通信和信号处理、自动控制等领域得到越来越广泛的应用。TMS320C6416T(简称C6416T)作为TI公司TMS320C6000系列的DSP,经常被用于图像、语音处理等方面。在大多数应用系统中,往往需要实现DSP与PC机或者其他外设之间的异步串行通信。但C6416T所提供的串口是同步串口,并不支持通用异步串行收发器标准。本文设计了一种利用C6416T已有的同步串口McBSP与EDMA实现异步串口通信的方法。

1. 硬件接口电路设计

C6416T有三个McBSP(McBSP0,McBSP1,McBSP2)口,每个端口有7 个引脚,除数据收发引脚(DX、DR) 之外,还包括发送时钟(CLKX)、接收时钟(CLKR)、发送帧同步(FSX)、接收帧同步(FSR)和外部输入时钟(CL KS)等引脚,分别用于传送数据、时钟和帧同步,实现同步串行通信。

当McBSP工作在串行口方式时,McBSP与串口的连接图如图1所示。对于McBSP 而言,不论外部如何连接,始终认为工作在同步方式下。当串口发送的数据中有帧信息和数据信息时,串口的TxD与McBSP的DR、FSR相连,就可以将数据线上的电平跳变直接引入到FSR端;当FSR检测到数据线上一帧的第一个下跳沿时,McBSP认为帧同步信号到来。

图1. C6416T与UART设备的连接 由于PC的串口输出输入电压与DSP的电压不同,所以我们需要一个转换电路接口。这里我们使用APC220-43进行电平的转换。其中4号管脚连接DR和FSR,5号管脚连接DX。6416T DSK中的McBSP0的FSR0和DR0的为J3中的29和30号管脚,24号管脚为DX0管脚。最后注意需要将DSP与APC220-43进行共地。

2. UART协议标准

异步串口通信协议作为UART的一种,工作原理是将传输数据的每个字符一位接一位地传输。

其中各位的意义如下:

起始位:先发出一个逻辑“0”的信号,表示传输字符的开始。

数据位:紧接着起始位之后。数据位的个数可以是4、5、6、7、8等,构成一个字符。通常采用ASCII码。从最低位开始传送,靠时钟定位。本文中数据位个数为8。

奇偶校验位:数据位加上这一位后,使得“1”的位数应为偶数(偶校验)或奇数(奇校验),以此来校验资料传送的正确性。

停止位:它是一个字符数据的结束标志。可以是1位、1.5位、2位的高电平。 由于数据是在传输线上定时的,并且每一个设备有其自己的时钟,很可能在通信中两台设备间出现了小小的不同步。因此停止位不仅仅是表示传输的结束,并且提供计算机校正时钟同步的机会。适用于停止位的位数越多,不同时钟同步的容忍程度越大,但是数据传输率同时也越慢。 本文中停止位使用1位。

空闲位:处于逻辑“1”状态,表示当前线路上没有资料传送。

波特率:是衡量资料传送速率的指针。表示每秒钟传送的二进制位数。例如数据传送速率为120字符/秒,而每一个字符为10位,则其传送的波特率为10×120=1200位/秒=1200波特。下图所示为本文中UART通信的时序图,波特率为115200Baud。

图2. UART协议通信时序图

3. C6416T上的程序设计

为了实现 McBSP与UART通信,本文使用过采样的方法将同步串口模拟成异步串口进行通信,即将 McBSP发送接收数据的时钟频率设置为UART发送接收波特率的16倍。当McBSP发送数据时,软件将每一位扩展为16 bit发送出去,即1被编码为Oxffff,0被编码为0x0000;当McBSP接收数据时,软件同样也要将接收到的每个16 bit字解码还原为1 bit。这样做使同步串口以比特为单位发送数据,可以很方便地模拟出异步串口的数据格式。同时,为了让DSP不需要频繁地对McBSP进行读/写操作,采用EDMA方式发送接收数据,提高了DSP的工作效率。McBSP0与数据缓存之间的数据传送由EDMA的通道12和通道13完成。通道12完成数据发送,通道13完成数据接收。 2.1 初始化程序

初始化程序流程如图2所示。在初始化程序中主要对McBSP及EDMA的一些参数进行设置。

图3. 初始化程序流程图

假设传输以8IN1的格式,发送接收都设为双相帧模式,第一相是开始位和8个数据位,第二相是停止位。停止位编码为8 bit字,以便于调整为1.5 bit停止位。应该对McBSP相关寄存器位的值初始化,以及EDMA进行相应操作。

使用MCBSP的内部波特率进行同步,MCBSP可以被配置以16b字发送和接收每个UART位。软件必须将每个要发送的位扩展成16b,并将输入的16b数据压成单个 bit。同时要处理必要的同步数据,如起始位,停止位。 1) McBSP Setup: Serial Port Implementation

C6000将每个UART位当作16b数据。内部采样率发生器被配置为产生一个16倍于串口波特率的时钟。由于UART起始位是一个下降沿,因这个下降沿可心作为帧同步的输入,这就是为什么FSR和DR都被连接到UART的输出。为了防止MCBSP被重复触发,在开始接收数据后需要忽略所有的帧同步信号。为了使用8N1(8数据位1停止位,无校验)方式发送UART数据,

将MCBSP配置为UART输入输出,要设置几个参数。

MCBSP_Config mcbspCfg0 = {

/* SPCR Setup */ MCBSP_SPCR_RMK( ),

/* RCR Setup */

MCBSP_SPCR_FREE_YES,

MCBSP_SPCR_SOFT_DEFAULT, MCBSP_SPCR_FRST_DEFAULT, MCBSP_SPCR_GRST_DEFAULT, MCBSP_SPCR_XINTM_XRDY,

MCBSP_SPCR_XSYNCERR_DEFAULT, MCBSP_SPCR_XRST_DEFAULT, MCBSP_SPCR_DLB_OFF,

MCBSP_SPCR_RJUST_RZF,

MCBSP_SPCR_CLKSTP_DISABLE, MCBSP_SPCR_DXENA_OFF, MCBSP_SPCR_RINTM_RRDY,

MCBSP_SPCR_RSYNCERR_DEFAULT, MCBSP_SPCR_RRST_DEFAULT

MCBSP_RCR_RMK(

MCBSP_RCR_RPHASE_DUAL,

//双相位传输

//第二个相位传输数据长度为1

MCBSP_RCR_RFRLEN2_OF(0), ),

MCBSP_RCR_RWDLEN2_8BIT,

//传输字长为8bit

//延时为0

MCBSP_RCR_RCOMPAND_MSB, MCBSP_RCR_RFIG_YES,

MCBSP_RCR_RDATDLY_0BIT, MCBSP_RCR_RFRLEN1_OF(8), MCBSP_RCR_RWDLEN1_16BIT,

//第一个相位传输数据长度为9 //传输字长为16bit

MCBSP_RCR_RWDREVRS_DISABLE

/* XCR Setup */ MCBSP_XCR_RMK(

MCBSP_XCR_XPHASE_DUAL, MCBSP_XCR_XFRLEN2_OF(0),

//双相位传输

//第二个相位传输数据长度为1 //传输字长为16bit

//延时为0

MCBSP_XCR_XWDLEN2_16BIT, MCBSP_XCR_XCOMPAND_MSB, MCBSP_XCR_XFIG_YES,

MCBSP_XCR_XDATDLY_0BIT, MCBSP_XCR_XFRLEN1_OF(8),

//第一个相位传输数据长度为9 //传输字长为16bit

MCBSP_XCR_XWDLEN1_16BIT, MCBSP_XCR_XWDREVRS_DISABLE ),

/* SRGR Setup */ MCBSP_SRGR_RMK( MCBSP_SRGR_GSYNC_FREE, MCBSP_SRGR_CLKSP_RISING,

MCBSP_SRGR_CLKSM_INTERNAL, MCBSP_SRGR_FSGM_DXR2XSR, MCBSP_SRGR_FPER_DEFAULT, MCBSP_SRGR_FWID_DEFAULT,

/************************************************/ /* CLKGDV 控制波特率,计算方法如下: */ /* 6416 McBSP的输入时钟CLKmcbsp为CPU CLK的1/4 /* CLKGDV = (CLKmcbsp) / (16 * baudrate) -1 */ /************************************************/

*/

MCBSP_SRGR_CLKGDV_OF(135) //对传输波特率的控制 ),

/* MCR Setup */

MCBSP_MCR_DEFAULT,

/* RCER Setup */

MCBSP_RCERE0_DEFAULT, MCBSP_RCERE1_DEFAULT, MCBSP_RCERE2_DEFAULT, MCBSP_RCERE3_DEFAULT,

/* XCER Setup */

MCBSP_XCERE0_DEFAULT, MCBSP_XCERE1_DEFAULT, MCBSP_XCERE2_DEFAULT, MCBSP_XCERE3_DEFAULT,

)

/* PCR Setup */ MCBSP_PCR_RMK( MCBSP_PCR_XIOEN_SP, MCBSP_PCR_RIOEN_SP,

MCBSP_PCR_FSXM_INTERNAL, MCBSP_PCR_FSRM_EXTERNAL, MCBSP_PCR_CLKXM_OUTPUT, MCBSP_PCR_CLKRM_OUTPUT, MCBSP_PCR_CLKSSTAT_0, MCBSP_PCR_DXSTAT_0,

MCBSP_PCR_FSXP_ACTIVELOW, MCBSP_PCR_FSRP_ACTIVELOW, MCBSP_PCR_CLKXP_RISING, MCBSP_PCR_CLKRP_FALLING

};

其中6416T DSK的CPU时钟为1GHz,其McBSP的时钟频率为1/4的CPU频率,为250MHz。当波特率为115200时,分频比CLKGDV = (CLKmcbsp) / (16 * baudrate) -1=135,若要改变UART的数据传输的波特率,可以根据上式算出分频比CLKGDV,再McBSP中的MCBSP_SRGR_CLKGDV_OF(value)进行设置,更改波特率。

2) Receiving/Transmitting UART Data

发送时,发送转换程序将需要被发送的数据按位转换16b。发送转换程序将扩展好的数据加上起始位0x0000及停止位0xFFFF放入发送缓冲器中。EDMA被设置为将数据从发送缓冲器传送到MCBSP,因为数据在发送缓冲区中已经是正确的UART格式,MCBSP帧同步产生器能连续地传送这些数据。

图4. 发送缓存对块数据的处理

void ProcessTransmitData(Uint8 *data)

接收时,EDMA将数据将被扩展的数据从MCBSP中读出,并写到接收缓冲区中,软件将禁止数据处理,直到EDMA完成一个段数据的传送。我们并使用一个EDMA的中断,对接收到的数据进行打印处理,方便调试工作。一个压缩程序被调用将数据还原成正确的数据。 void ProcessReceiveData(Uint8* recv_data)

其中,通过逻辑判断函数 short VoteLogic(unsigned short value) 实现过采样数据的容错处理,具体方法是:每解码一个字时该函数先屏蔽掉高6 位和低6 位,只检测中间的 4 位数据中 “1” 的个数,当大于等于3 时对应解码为 “1” ,否则为 “0” 。 /* Open the McBSP channel 1 */

hMcbsp1 = MCBSP_open(MCBSP_DEV1, MCBSP_OPEN_RESET); 使用CLS库,如果使用上述函数将打开McBSP1 如果改为MCBSP_DEV0将打开McBSP0

C6x的多通道缓冲串行口(McBSP) 可以运行在不同的模式,由不同的应用要求,为了保证正确工作,串行口必须在特定的顺序进行初始化。 当EDMA或CPU被用于处理McBSP数据,典型情况下,EDMA用于读/写数据从/到McBSP。EDMA传送是读/写同步的,McBSP提供这些同步状态。如可使用CPU从DRR读数据,或向DXR写数据,查询或中断的方式都可以使用。

3) McBSP Introduction

发送器:发送器将写入DXR寄存器中的数据发送出去。DXR中的内容被拷贝XSR。当发送帧同步信号(FSX)被检测到时,传送立即开始。每一个CLKX时钟下,一个XSR中数据位将被传送。新的数据可以被写入DXR使用CPU或DMA。

接收器:在每个CLKR时钟下,DR引脚上的数据被移位至RSR寄存器。真正的数据移位开始于接收帧同步信号(FSR)。RSR中的数据被拷贝至接收缓冲寄存器(RBR),然后到数据接收寄存器(DRR)。 DRR可以被CPU或EDMA读取。

采样率产生器: As the name implies, 这个模块产生控制发送/接收的时钟信号以及必须的帧同步信号。时钟产生电路允许使用者通过CLKS选择CPU时钟或外部时钟作为源产生CLK(R/X)。帧同步信号的特性,如帧周期,帧宽也可编程。FS(R/X), CLK(R/X) 是双向引脚。

事件/中断产生: McBSP 产生为EDMA产生帧事件告知数据已经在DRR中准备好。或者DXR已经准备好接受新的数据。这些都是读同步事件REVT和写同步事件XEVT。同理CPU也可以通过中断(RINT and XINT)读/写数据到McBSP。

4. EDMA 的设置

EDMA 是TMS320C64x系列的一种重要的数据访问方式,有 64个通道,每个通道都有一个事件与之关联,每个事件相当于一个同步信号,由事件触发相应通道的数据传输。在没有 CPU 参与的情况下,EDMA 控制器可以在后台完成片内存储器和外设之间的数据搬移。为了实现高效的UART ,利用 EDMA 来实现 McBSP 与存储器之间的数据传输是一种理想的选择。 以 McBSP0 为例,其发送和接收事件分别映射到 EDMA 的12 和13 通道。 由于 McBSP中每一个字到来时都会产生 REVT0 事件,每发送一个字会产生 XEV T0 事件,与 McBSP 关联的 EDMA 的通道必须设置为1D21D的传输方式,实现单个字的传输请求。对于负责接收的12 通道,源地址设置为 McBSP 的数据接收寄存器(DRR)地址,目的地址设置为存放数据的内存区起始地址。由于DRR是固定的,源地址更新模式( SUM)设置为不变,而目的地址更新模式(DUM)设为增长方式;对于负责发送数据传输的 13 通道,源地址设置为存放待发数据的内存区起始地址,目的地址设置为 McBSP 的数据发送寄存器(DXR)地址,由于

DXR 是固定的,其 SUM 设置为增长方式,而DUM 设为不变。

5. 调试过程及结果

连接好硬件电路,并利用串口助手打开串口,设定波特率为115200Baud的速率,传输字符串”123456789”,可以在DSP中的调试串口中看到接收并打印出的字符串,随后程序自动发送11个16进制数字0x01—0x09,可以在串口助手中看到接收到DSP传输过来的数字。如下两幅图所示。

图5. 串口助手调试窗口结果

图6. DSP接收数据打印结果

温剑雄 2012-3-24

因篇幅问题不能全部显示,请点此查看更多更全内容