EDN首页   博客首页

日志档案

发表于 2007-4-23 14:57:16

5

标签: McBSP  UART  

McBSP用于查询方式的UART

以下部分内容来自spra633b "TMS320C6000 McBSP UART"颜色为兰色

 

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

McBSP Setup: Serial Port Implementation

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

MCBSP配置为UART输要设置几个参数。

Pin Control Register (PCR)        PCR = 0x00000B0C

Receive Control Registers (RCR) RCR = 0x81050840

Transmit Control Registers (XCR) XCR = 0x81040840

Sample Rate Generator Register (SRGR) SRGR = 0x2000006C

CLKGDV= (CPU Clock frequency) / (16 * baud rate) -1.

       MCBSP_SRGR_CLKGDV_OF(216) /* CLKGDV 57600  */

如果DSP时钟为200Mhz,当波特率为115200时,分频比为0x6C,实际波特率偏差为:0.4%。当分频比为216时,波特率为57600。没有办法使用更低频率的时钟,除非为MCBSP外接一个同步时钟。

Receiving/Transmitting UART Data

 

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

 

 

接收时,EDMA将数据将被扩展的数据从MCBSP中读出,并写到接收缓冲区中,软件将禁止数据处理,直到EDMA完成一个段数据的传送。一个压缩程序被调用将数据还原成正确的数据。void ProcessReceiveData(void);

/* Open the McBSP channel 1 */

hMcbsp1 = MCBSP_open(MCBSP_DEV1, MCBSP_OPEN_RESET);

使用CLS库,如果使用上述函数将打开McBSP1

如果改为MCBSP_DEV0将打开McBSP0

 

 

C6x的多通道缓冲串行口(McBSP) 可以运行在不同的模式,由不同的应用要求,为了保证正确工作,串行口必须在特定的顺序进行初始化。

EDMACPU被用于处理McBSP数据,典型情况下,EDMA用于读/写数据从/McBSPEDMA传送是读/写同步的,McBSP提供这些同步状态。如可使用CPUDRR读数据,或向DXR写数据,查询或中断的方式都可以使用。

McBSP Introduction

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

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

采样率产生器: 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

Servicing the McBSP

C6000可以通过CPUEDMA操作McBSP。所有控制寄存器只能通过CPU编程。但DXRDRR可以通过CPUEDMA访问。通常EDMA通过用于读写数据,这样可以减轻CPU处理低速外围的压力。TMS320C6000 DMA Applications(SPRA529) and TMS320C6000 Enhanced DMA: Example Applications (SPRA636).

EDMA方式:EDMA使用写同步事件XEVTDXR,使用读同步事件REVTDRR。在每个EDMA在每个串口单元传送时读或写McBSP,当EDMA完成需要的单元数目后,如果需要可以产生一个通道结束中断。

CPU方式: CPU可以用中断或查询方式操作McBSP,查询时,SPCR中的(R/X)RDY位被查询检查McBSP是否可以发送新的数据或有新的数据需要接收。在中断方式,CPU处理McBSP产生的中断。中断模式寄存器(R/X)INTM = 00b 缺省值产生McBSP中断。当CPU中断允许时McBSP在每个数据单元发送/接收时通过(R/X)INT产生中断。其它中断模式用于诊断和跟踪功能。

Initialization Requirements

McBSP中的控制信号如:时钟、帧同步、时钟源都是可以编程。模块被编程激活的顺序对正确操作McBSP是非常重要的。

查询方式UART的实现:

需要实现下列函数

void ConfigMcBSP(void);

short* ProcessTransmitData(char xmitchar);

char ProcessReceiveData(short*);

short VoteLogic(unsigned short);

void McBSP_UART_OutChar(char);

char McBSP_UART_InChar(void);

 

初始化过程:

      CSL_init(); /* initialize the CSL library */

       IRQ_nmiEnable();/* enable NMI and GI */

       IRQ_globalEnable();

       hMcbsp1 = MCBSP_open(MCBSP_DEV0, MCBSP_OPEN_RESET); /* Open the McBSP channel 0 */

       ConfigMcBSP();/* Setup for McBSP */

       MCBSP_enableSrgr(hMcbsp1); /* Start Sample Rate Generator: set /GRST = 1 */

       /* inserted wait time for McBSP to get ready */

       for (waittime=0; waittime<0xF; waittime++);

       /* Wake up the McBSP as transmitter and receiver */

       MCBSP_enableRcv(hMcbsp1);

       MCBSP_enableXmt(hMcbsp1);

       /* Enable Frame Sync Generator for McBSP 1: set /FRST = 1 */

       MCBSP_enableFsync(hMcbsp1);

 

发送时不使用帧同步,直接将数据加上起始位和停止位,并将这10b数据按扩充为1016b的数据。扩充方式为当数据位为1时扩充为0xFFFF 数据位为0时扩充为0x0000。检测xrdy的状态将数据写入MCBSP即可。

接收时需要使用输入数据的起始位作为帧同步信号,启动接收。接收过程中数据的下降沿被忽略。

附:查询方式代码

/*******************************************************************/
/* Sinovee Microsystems */
/* Date Created: 03/31/2007 */
/* Date Last Modified: 03/31/2007 */
/* Source File: uart.c */
/* Original Author: Todd Hiers */
/* Author: 罗昊 */
/* */
/* 被始化C6000 McBSP 与UART通信 */
/* communicate with a . By modifying the CHIP definition, */
/* On 6x0x devices, DMA channels 1 and 2 are used to service */
/* McBSP 1 transmit and receive operations, respectively. On */
/* 6x1x/64x devices, EDMA channels 14 and 15 are used to service */
/* McBSP 1 transmit and receive operations, respectively. */
/* */
/* For this example, a data string is being transmitted from McBSP */
/* transmit (DX) to McBSP receive (DR). Each bit of the 8.bit */
/* ASCII character is expanded into 16.bit UART transmission word. */