引言
本文主要介绍如何使用TI公司的DSP芯片实现串口收发的功能。更多精彩欢迎关注公众号:物联网知识
介绍
串口收发功能概述
DSP 包含了多个 SCI 模块,每个 SCI 模块都能独立地进行串口数据的收发。SCI 模块提供了灵活的配置选项,可适应不同的串口通信需求。通过配置 SCI 模块,可以实现串口通信的波特率、数据位、停止位、校验位等参数的设置。
主要特性:
-
多个 SCI 模块:DSP 包含了多个 SCI 模块,通常被称为 SCI-A、SCI-B 等,每个 SCI 模块都能独立地进行串口通信。
-
灵活的配置选项: SCI 模块提供了丰富的配置选项,可以设置波特率、数据位、停止位、校验位等参数,以满足不同应用场景的需求。
-
中断支持: SCI 模块支持中断功能,可以在接收到数据或发送完成时触发中断,以实现数据的及时处理和响应。
-
FIFO 缓冲区: SCI 模块通常包含发送 FIFO 和接收 FIFO 缓冲区,用于临时存储待发送和已接收的数据,提高数据传输的效率。
-
环回模式: SCI 模块通常支持环回模式,用于将发送的数据直接反馈到接收端口,以用于测试和调试。
串口收发步骤:
一般而言,使用 DSP 进行串口收发的基本步骤如下:
- 初始化 SCI 模块:配置波特率、数据位、停止位、校验位等参数,并启用 SCI 模块。
- 发送数据:使用 SCI 模块提供的发送函数发送数据,数据将被放入发送 FIFO 缓冲区,并通过串口发送出去。
- 接收数据:通过轮询或中断方式检查接收 FIFO 缓冲区中是否有新的接收数据,并使用接收函数读取数据。
- 处理数据:对接收到的数据进行处理,例如解析、存储、回复等操作。
实现
前期准备
- CCS(TI的开发IDE):公众号《物联网知识》:回复CCS获取。
- 一块TMS320F28XXX开发板
- 串口调试工具:可在资料或公众号中获取
- USB转TTL
程序开发
- 初始化设备及外设
调用 Device_init() 初始化设备的时钟和外设。
调用 Device_initGPIO() 初始化 GPIO,并设置 SCI-A 的接收管脚和发送管脚。 - 初始化中断和中断向量表:
调用 Interrupt_initModule() 初始化中断模块。
调用 Interrupt_initVectorTable() 初始化中断向量表。
通过 Interrupt_register() 将 SCI-A 接收中断 ISR(Interrupt Service Routine)注册到对应的中断号。 - 初始化 SCI-A 模块及 FIFO:
调用 initSCIAFIFO() 对 SCI-A 模块进行初始化配置。
在 initSCIAFIFO() 函数中设置了 SCI-A 的参数(波特率、数据位、停止位、校验位等),并启用了 SCI-A 模块和 FIFO 功能。 - 使能中断和全局中断:
调用 Interrupt_enable() 使能 SCI-A 的接收中断。
调用 Interrupt_clearACKGroup() 清除中断的应答组。 - 初始化 SCI-A 模块及其 FIFO
void initSCIAFIFO()
{
//
// 8 char bits, 1 stop bit, no parity. Baud rate is 115200.
//
SCI_setConfig(SCIA_BASE, DEVICE_LSPCLK_FREQ, 115200, (SCI_CONFIG_WLEN_8 |
SCI_CONFIG_STOP_ONE |
SCI_CONFIG_PAR_NONE));
SCI_enableModule(SCIA_BASE);//启用SCI
SCI_disableLoopback(SCIA_BASE);//禁用环回
SCI_resetChannels(SCIA_BASE);//复位SCI
SCI_enableFIFO(SCIA_BASE);//启用FIFO
//
// RX and TX FIFO Interrupts Enabled
//
SCI_enableInterrupt(SCIA_BASE, SCI_INT_RXFF|SCI_INT_RXERR );//使能接收中断和错误中断
SCI_disableInterrupt(SCIA_BASE, SCI_INT_TXFF);//失能发送中断
SCI_setFIFOInterruptLevel(SCIA_BASE, SCI_FIFO_TX1, SCI_FIFO_RX1);//设置SCI模块的FIFO中断级别
SCI_performSoftwareReset(SCIA_BASE);//执行SCI的软件复位
SCI_resetTxFIFO(SCIA_BASE);//执行SCI发送FIFO的复位
SCI_resetRxFIFO(SCIA_BASE);//执行SCI接收FIFO的复位
}
- 接收中断
__interrupt void sciaRXFIFOISR(void)
{
receivedCharA = SCI_readCharBlockingFIFO(SCIA_BASE);//接收一个字节
rxStatus_A = SCI_getRxStatus(SCIA_BASE);//获取状态
if((rxStatus_A & SCI_RXSTATUS_ERROR) != 0)//错误状态
{
SCI_clearInterruptStatus(SCIC_BASE, SCI_INT_RXERR);//清除错误中断标志位
}
SCI_writeCharBlockingFIFO(SCIA_BASE, receivedCharA);//发送接收的这个字节
SCI_clearOverflowStatus(SCIA_BASE);//清除SCI模块的溢出状态
SCI_clearInterruptStatus(SCIA_BASE, SCI_INT_RXFF);//清除SCI模块的接收FIFO满中断标志
//
// Issue PIE ack
//
Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP9);
}
- 主函数中,我们循环发送0x02
for(;;)
{
SCI_writeCharBlockingFIFO(SCIA_BASE, test);//发送
DEVICE_DELAY_US(500000);//延时500ms
};
编译运行
我们通过串口调试助手可以看到,DSP会循环发送0x02.
当我们发送0x01时,DSP也会回复0x01。
后续
完整程序可以关注公众号《物联网知识》,回复DSP串口收发获取。