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) 可以运行在不同的模式,由不同的应用要求,为了保证正确工作,串行口必须在特定的顺序进行初始化。
当EDMA或CPU被用于处理McBSP数据,典型情况下,EDMA用于读/写数据从/到McBSP。EDMA传送是读/写同步的,McBSP提供这些同步状态。如可使用CPU从DRR读数据,或向DXR写数据,查询或中断的方式都可以使用。
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。
Servicing the McBSP
C6000可以通过CPU或EDMA操作McBSP。所有控制寄存器只能通过CPU编程。但DXR和DRR可以通过CPU或EDMA访问。通常EDMA通过用于读写数据,这样可以减轻CPU处理低速外围的压力。TMS320C6000 DMA Applications(SPRA529) and TMS320C6000 Enhanced DMA: Example Applications (SPRA636).
EDMA方式:EDMA使用写同步事件XEVT写DXR,使用读同步事件REVT读DRR。在每个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数据按扩充为10个16b的数据。扩充方式为当数据位为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. */