使用ADuCM3027/ADuCM3029串行端口实现UART
异步SPORT接收器(SPORT_B模块)
接收端相比发送端更为复杂,因为SPORT_B模块接收的是过采样数据。对于8-N-1传输格式,由于数据的过采样系数为3,因此必须对串行端口进行编程将其设定为接收27位,从而可以丢弃三个采样的起始位。在进行帧同步(SPORT_BFS)时需要考虑到这一点。接收到的27位代表UART器件发送的数据包以及8个数据位和1个停止位(过采样系数为3)。
随后,通过位操作运算将实际数据从过采样数据中提取出来。UART器件每发送一位,就会从已接收数据的3位序列中提取出值正确的中间位。提取出来的位会被汇编成一个字节的数据。
图3.预期的UART帧和SPORT接收帧的数据格式
驱动程序函数原型
下列函数适用于8位异步数据,但也可以轻松更改为支持其他数据宽度。在"SPORT_UART_Emulator专用代码"一节中对该用例专用的C函数进行了详细介绍。
SPORT_UART_Tx_Initialise函数用于在ADuCM3029/ADuCM3027 处理器上配置并部署SPORT_A模块以便进行UART发送仿真。SPORT_A内部时钟来自时钟频率配置为6.5 MHz(默认值)的PCLK。发送所需的波特率已设定,另外还使用SPORT_CTL_A寄存器对发送进行了配置。对发送数据缓冲区为空时产生的中断信号使用SPORT_IEN_A寄存器进行配置。在使能SPORT_A模块之前,使用SPORT_ NUMTRAN_A寄存器对要传输的字数进行编程设定。
SPORT_UART_Tx_Initialise函数用于在ADuCM3029/ADuCM3027 处理器上配置并部署SPORT_B模块以便进行UART接收仿真。SPORT_B模块配置为对输入数据流进行过采样(过采样系数为3)。帧同步配置用于外部低电平有效状态。对接收数据缓冲区已满时产生的中断信号使用SPORT_IEN_B寄存器进行配置。另外,在使能SPORT_B模块之前,对SPORT_CTL_B寄存器的SLEN字段进行配置,具体情况如下:
3 × (字大小 + 停止位数)– 1
SPORT_UART_Tx_Transfer函数通过修改缓冲区中位置指向的数据来创建UART发送数据格式。修改后的数据随后在SPORT_A_TX寄存器上输出用于发送。该函数使用位掩码和位移位运算。
SPORT_UART_Rx_Transfer函数接收来自SPORT_B_RX寄存器的过采样数据。位操作运算提取SPORT_B_RX数据每个3位序列的中间位(UART器件每发送1位会接收到3位)。提取出来的位被汇编成按字节计算大小的数据。该函数会返回表示实际已接收数据的汇编字节。下列代码示例显示如何从27位SPORT寄存器中提取数据并将其转换为8位UART数据:
软件流程图
SPORT_A模块发送
SPORT_A模块仿真UART Tx端口。要使用SPORT_A模块仿真UART Tx端口,必须对SPORT模块进行发送初始化并将其使能。使能后,如果有待处理数据要发送,则检查SPORT_STAT寄存器。如果有数据要发送,则根据待处理数据创建UART数据包,然后将该数据包写入SPORT发送寄存器。
图4.SPORT_A模块发送流程图
SPORT_B模块接收
SPORT_B模块仿真UART Rx端口。要将SPORT_B用作UART Rx端口,必须首先对SPORT_B模块进行接收初始化并将其使能。SPORT使能后,在SPORT_B数据寄存器中检查SPORT_STAT寄存器是否存在待处理数据。如果存在数据,则检索该数据并提取8位UART数据。
图5.SPORT_B模块接收流程图
波形
图6显示SPORT_A模块的发送波形和UART器件的接收波形(比特率:9600 bps,单帧8位数据(0x96))以及UART发送仿真所需的其他格式化位。
图7显示UART器件的发送波形和SPORT_B模块的接收波形(比特率:9600 bps,单帧8位数据(0x96),带一个起始位和一个停止位,采样速率是发送波特率的3倍,可正确进行UART接收仿真)。
图6.SPORT_A模块发送和UART器件接收( 单帧)
图7.UART器件发送和SPORT_B模块接收( 单帧)
这些图中的红色走线表示单帧传输。
SPORT_UART_EMULATOR专用代码
本节中所示的代码为典型代码,适用于下列情形:
lSPORT_A模块发送和UART接收
lUART发送和SPORT_B模块接收
单帧传输使用的数据格式为8-N-1(1个起始位、8位数据、0奇偶校验位和1个停止位)采用PCLK = 26 MHz和多个波特率对这些情形进行了测试。
SPORT_UART_EMULATOR.H
SPORT_UART_EMULATOR_TRANSMIT.C
SPORT_UART_EMULATOR_RECEIVE.C
SPORT_UART_EMULATOR_RECEIVE.C
结语
本应用笔记介绍如何使用ADuCM3029/ADuCM3027处理器的SPORT通信协议来仿真全双工UART通信,以便与任何标准的UART器件实现接口。
本应用笔记所述用例在内核模式和直接存储器访问(DMA)模式下针对所有标准波特率进行了测试。根据可靠的测试结果,SPORT发送周期的波特率高达115,200 bps,SPORT接收周期的波特率高达57,600 bps。经过测试,两个方向上传输5到8位数据大小可用于正确运算。