DSP28335使用FIFO的串口中断总结

本文介绍了DSP28335处理器中的SCI接口,特别是其FIFO功能在串行通信中断中的应用。通过SCI,可以实现全双工或半双工通信,并具有丰富的数据格式和错误检测功能。使用FIFO可以降低CPU的开销,提高通信效率。文章详细讲解了SCI的工作原理、特点、主要功能单元和寄存器配置,并通过仿真结果分析了中断触发机制及其可能的问题。
摘要由CSDN通过智能技术生成

一、串行通信与并行通信

DSP控制器间,DSP控制器与外部设备间交换信息,通信,可采取的通信方式主要两大类1、串行通信 2、并行通信。

并行通信一般包括多条数据线、多条控制线和状态线,传输速度快,传输线路多,硬件开销大,不适合远距离传输。一般用在系统内部,如XINTF接口或者控制器内部如DMA控制器。

串行通信则在通信线路上既传输数据信息也传输联络控制信息,硬件开销小,传输成本低,但是传输速度慢,且收发双方需要通信协议,可用于远距离通信。串行通信可以分为两大类1、同步通信 2、异步通信

同步通信:发送器和接收器通常使用同一时钟源来同步。方法是在发送器发送数据时同时包含时钟信号,接收器利用该时钟信号进行接收。典型的如I²C、SPI。

异步通信:收发双方的时钟不是同一个时钟,是由双方各自的时钟实现数据的发送和接收。但要求双方使用同一标称频率,允许有一定偏差。典型的如SCI。

二、28335SCI介绍

F28335处理器共提供3个SCI接口,相对TI的C240X系列DSP的SCI接口,功能上有很大的改进,在原有功能基础上增加了通信速率自动检测和FIFO缓冲等新的功能,为了减小串口通信时CPU的开销,F28335的串口支持16级接收和发送FIFO。也可以不使用FIFO缓冲。SCI接收器和发送器有各自独立的中断和使能位,可以独立地操作实现半双工通信,或者同时操作实现全双工通信。为了保证数据完整,SCI模块对接收到的数据进行间断、极性、超限和帧错误的检测。为了减少软件的负担,SCI采用硬件对通信数据进行极性和数据格式检查。通过对16位的波特率控制寄存器进行编程,可以配置不同的SCI通信速率。

所谓的FIFO就是先进先出的意思。SCI工作在FIFO模式下一般是因为所传输的信息并不是以一个帧为单位,而是以多个帧组成的一个包为信息单位的。比如说我的一个数据包由5个帧组成,第一个为控制字节,后四个字节共同组成一个浮点数。这时你可以设置FIFO接收中断为5个字节时产生中断。设置以后,每接收到5个字节后才会产生一次中断,而不是每接收一次产生一次中断。这样可以大幅减小CPU的开销。而先进先出的意思就是:在中断中,你读FIFO接收寄存器读到的数据是首先接收到的数据,再读一次的话读到的是接收到的第二个数据。而16深度的话就是最多能保存最近的16个接收数据,如果接收数据超过16个的话会产生相应的溢出,可以软件编程对溢出进行处理。
对于发送FIFO也是一样,你可以一次将多个数据放到发送FIFO中,然后DSP按先后顺序依次发送数据。

三、SCI模块的特点如下(通过相应的寄存器可以对这些功能进行设置)

   (1)2个外部引脚:SCITXD为SCI数据发送引脚;SCIRXD为SCI数据接收引脚。两个引脚为多功能复用引脚,如果不使用可以作为通用数字量I/O。

   (2)可编程通信速率,可以设置64K种通信速率。

   (3)数据格式:

        ◇ 1个启动位;

        ◇ 1~8位可编程数据字长度;

        ◇可选择奇校验、偶校验或无效校验位模式;

        ◇ 1或2位的停止位。

   (4)4种错误检测标志位:奇偶错误、超越错误、帧错误和间断检测。

   (5)2种唤醒多处理器方式:空闲线唤醒(Idle-line)和地址位唤醒(AddressBit)。

   (6)全双工或者半双工通信模式。

   (7)双缓冲接收和发送功能。

   (8)发送和接收可以采用中断和状态查询2种方式。

   (9)独立地

以下是DSP28335串口通信的步骤和示例代码: 1. 配置SCI控制器 ```c void InitSci(void) { // 1. 使能SCI时钟 EALLOW; SysCtrlRegs.PCLKCR0.bit.SCIAENCLK = 1; EDIS; // 2. 复位SCI控制器 SciaRegs.SCICCR.all = 0x0007; // 1位停止位,无奇偶校验,8位数据位 SciaRegs.SCICTL1.all = 0x0003; // 使能SCI接收和发送 SciaRegs.SCICTL2.all = 0x0000; // 禁用FIFO SciaRegs.SCICTL2.bit.TXINTENA = 1; // 使能发送中断 SciaRegs.SCICTL2.bit.RXBKINTENA = 1; // 使能接收中断 // 3. 配置波特率 SciaRegs.SCIHBAUD = 0x0000; SciaRegs.SCILBAUD = 0x0026; // 波特率为9600 // 4. 配置GPIO管脚 EALLOW; GpioCtrlRegs.GPAPUD.bit.GPIO28 = 0; // 使能GPIO28上拉 GpioCtrlRegs.GPAMUX2.bit.GPIO28 = 1; // 配置GPIO28为SCITXDA GpioCtrlRegs.GPAPUD.bit.GPIO29 = 0; // 使能GPIO29上拉 GpioCtrlRegs.GPAQSEL2.bit.GPIO29 = 3; // 配置GPIO29为双边沿触发 GpioCtrlRegs.GPAMUX2.bit.GPIO29 = 1; // 配置GPIO29为SCIRXDA EDIS; } ``` 2. 发送数据 ```c void SendData(char *data, int len) { int i; for (i = 0; i < len; i++) { while (SciaRegs.SCICTL2.bit.TXRDY == 0); // 等待发送缓冲区就绪 SciaRegs.SCITXBUF = data[i]; // 发送数据 } } ``` 3. 接收数据 ```c __interrupt void SciaRxIsr(void) { while (SciaRegs.SCIRXST.bit.RXRDY != 0) { // 判断是否有数据可读 char data = SciaRegs.SCIRXBUF.all; // 读取数据 // 处理接收到的数据 } PieCtrlRegs.PIEACK.all |= PIEACK_GROUP9; // 清除中断标志 } ``` 注意:在使用SCI控制器进行串口通信时,需要注意波特率的配置和GPIO管脚的配置。同时,需要在中断服务函数中读取接收到的数据,并进行相应的处理。
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值