一种基于MAX3232的TMS320F2812异步串行通信系统研究和实现
3 软件设计
3.1 SCI模块的初始化
对DSP芯片的控制是通过对它的寄存器的读写来完成的,TMS320F2812的SCI模块包括13个寄存器。要使SCI模块能够正常工作,必须对它进行初始化。其中设置主要包括:运行模式、协议、波特率、字符长度、奇/偶校验、停止位个数、中断使能及级别确定等。下面为本设计中对SCI模块的初始化程序:
void InitSciA ()
{
//配置SCITXD和SCIRXD
EALLOW:
GpioMuxRegs.CPFMUX.bit.SCITXDA_GPIOF4=1;
GpioMuxRegs.CPFMUX.bit.SCIRXDA_GPIOF5=1;
EDIS:
//软件复位SCI
SciaRegs.SCIGTL1.bit.SWRESET=0;
//设置字符格式、通信协议、通信模式
SciaRegs.SCICCR. bit. SCICHAR=7;
SciaRegs.SCICCR.bit.PARITYENA=0;
SciaRegs.SCICCR.bit.LOOPBKENA=0;
SciaRegs.SCICCR.bit.STOPBITS=0;
SciaRegs.SCICCR. bit.ADDRIDLE. MODE=0;
//设置波特率为9600,LSPCLK=30MHz
SciaRegs.SCIHBAUD=0x0001;
SciaRegs.SCILBAUD=0x0085;
//使能发送和接收器
SciaRegs.SCICTL1.bit.TXENA=1;
SciaRegs.SCICTL1.bit.RXENA=1;
//使能中断
PieCtrl.PIEIER9. bit.INTx1=1;
PieCtrl.PIEIER9. bit.INTx2=1;
//退出复位状态
SciaRegs.SCICTL1.bit.SWRESET=1;
}
3.2 SCI模块发送和接收数据的机制
SCI模块发送和接收数据有两种方式:一种是查询方式,另一种是中断方式。
查询方式:就是程序不断去查询各自的状态标志位。对于发送数据,需要查询的是TXRDY位,如果该位为1,说明SCITXBUF已经准备好接收下一个发送数据。当数据写入SCITXBUF后,该位会自动清零,此时如果TXENA=1,发送移位寄存器就会将SCITXBUF中的数据发送出去。而接收数据时需要查询RXRDY位,当SCIRXBUF已经准备好一个等待CPU读取的数据时,就会将该位置1,当数据被CPU读走后,RXRDY会自动清零。
中断方式:在该种方式下,需要我们首先使能外设级、PIE级和CPU级中断。此时TXRDY和RXRDY变成了中断标志位,当TXRDY为1时,就会产生中断事件,如果各级中断都已经使能,则程序会进入相应的中断处理函数,完成数据的发送。而当RXRDY置位时,就会产生接收中断,如果各级中断都已经使能,则程序进入相应的中断处理函数,完成数据的接收。这里值得注意的是,2812的外设的中断标志位一定要手动复位,但是SCI模块是个例外,它的中断标志位会在响应中断后自动复位。
通过对查询和中断方式程序的分析可以看出,查询函数位于主函数的for循环内,通过for循环不断查询TXRDY和RXRDY的状态,因此,程序的运行效率比较低,但是程序比较简单,易于实现。对于中断方式,只要相应的中断标志位置位,并且所有中断级都已被使能,就能直接进入中断处理函数,实现相应的功能。因此,程序的运行效率高,但程序比较复杂。综合考虑,最终选取数据接收采用中断方式,数据发送采用查询方式。图2和图3分别为查询方式和中断方式的程序流程图。本文引用地址:https://www.eepw.com.cn/article/155198.htm
评论