DSP使用串口收发

本文详述了如何利用TI公司的DSP芯片实现串口收发功能,包括SCI模块配置、中断支持、FIFO缓冲区及环回模式,并提供了初始化、发送、接收数据的步骤。通过CCS开发环境和中断服务程序,实现串口通信的交互。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

引言

本文主要介绍如何使用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 缓冲区中是否有新的接收数据,并使用接收函数读取数据。
  • 处理数据:对接收到的数据进行处理,例如解析、存储、回复等操作。

实现

前期准备

  1. CCS(TI的开发IDE):公众号《物联网知识》:回复CCS获取。
  2. 一块TMS320F28XXX开发板
  3. 串口调试工具:可在资料或公众号中获取
  4. USB转TTL

程序开发

  1. 初始化设备及外设
    调用 Device_init() 初始化设备的时钟和外设。
    调用 Device_initGPIO() 初始化 GPIO,并设置 SCI-A 的接收管脚和发送管脚。
  2. 初始化中断和中断向量表:
    调用 Interrupt_initModule() 初始化中断模块。
    调用 Interrupt_initVectorTable() 初始化中断向量表。
    通过 Interrupt_register() 将 SCI-A 接收中断 ISR(Interrupt Service Routine)注册到对应的中断号。
  3. 初始化 SCI-A 模块及 FIFO:
    调用 initSCIAFIFO() 对 SCI-A 模块进行初始化配置。
    在 initSCIAFIFO() 函数中设置了 SCI-A 的参数(波特率、数据位、停止位、校验位等),并启用了 SCI-A 模块和 FIFO 功能。
  4. 使能中断和全局中断:
    调用 Interrupt_enable() 使能 SCI-A 的接收中断。
    调用 Interrupt_clearACKGroup() 清除中断的应答组。
  5. 初始化 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的复位
}
  1. 接收中断
__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);
}
  1. 主函数中,我们循环发送0x02
    for(;;)
        {
        SCI_writeCharBlockingFIFO(SCIA_BASE, test);//发送
                DEVICE_DELAY_US(500000);//延时500ms
        };

编译运行

我们通过串口调试助手可以看到,DSP会循环发送0x02.
在这里插入图片描述
当我们发送0x01时,DSP也会回复0x01。

后续

完整程序可以关注公众号《物联网知识》,回复DSP串口收发获取。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

跋扈洋

编写不易,打赏支持一下我吧

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值