【F28335】第15章 串行通讯接口SCI


前言

实际开发时,经常会遇到这样的情况,例如,做电机控制时需要显示查看ADC采样之后的电机电压、电流、转速等数据。当然可以为系统设计液晶屏来显示,还有一种不错的方法,就是将这些数据通过协议将其上传给计算机,然后通过计算机上的软件来显示和监测。又例如,在某些项目中,需要计算机发送预先设定的指令来控制DSP程序的运行方式。

那么DSP怎样才能和PC之间实现数据的传输呢?
最简单、最经常使用的方法是使用其内部的串行通信接口SCI

江南目前参与的项目中使用的芯片是28377D,共使用了它的4个SCI串口,可以实现DSP与PC上位机软件、串口软件、液晶屏等的通信,本模块简单实用,建议大家好好学习掌握。

本章主要介绍以下内容: SCI的结构、特点及其工作原理。


15.1 SCI模块的概述

SCI是Serial Communication Interface的简称,即串行通信接口。所谓串行和并行就像是单车道和多车道。

SCI是具有接收和发送两根信号线的异步串口,一般可看做UART(通用异步接收/发送装置)。

F28335的SCI支持与采用NRZ(Non-Return-to-Zero)标准格式的异步外围设备之间进行数据通信。即用正负电平表示二进制值,不使用0电平,高电平表示二进制1,低电平表示二进制0。

例如设置是使用MAX3232芯片,将SCI设计成串口RS232,那么F28335就能够和其他使用RS232接口的设备进行通信。

比如,F28335内部的两个SCI之间,或者F28335的SCI与其他DSP的SCI之间均能实现通信。当然F28335的SCI还可以设计成其他电平形式的串口,例如RS424、RS485等。

F28335内部有3个相同的SCI模块:SCI-A、SCI-B、SCI-C。每个SCI模块都各有一个接收器和发送器,接收器用于实现数据的接收功能,发送器用于实现数据的发送功能。SCI的接收器和发送器都各自有一个16级深度的FIFO队列,它们还都有自己独立使能位和中断位,可以在半双工通信中进行独立操作,或者在全双工通信中同时进行操作。

根据数据的传送方向,串行通信可以分为单工、半双工和全双工3种。

  1. 单工通信:设备A只能发送,设备B只能接收。
  2. 半双工通信:设备A和B都能够接收和发送,但是同一时间只能接收或者发送。
  3. 全双工通信:在任意时刻,设备A和B都能够同时接收和发送。串行通信的3种方式
    因为F28335的SCI具有能够独立使能和工作的接收器和发送器,所以其既可以工作在半双工方式,也可以工作在全双工方式。

15.1.1 SCI模块的特点

F28335的3个SCI模块的功能是相同的,只是寄存器的命名有所不同,下面介绍中以SCI-A为例进行讲解。
SCIA与CPU的接口
从上图中可以看到:

  1. SCI具有2个引脚,发送引脚SCITXD、接收引脚SCIRXD。SCITXD可以实现数据发送,SCIRXD可以实现数据接收。
  2. 外部晶振通过F28335的PLL模块倍频后产生了CPU的系统时钟SYSCLKOUT,然后SYSCLKOUT经过低速时钟预定标器之后输出低速外设时钟LSPCLK提供给SCI模块。要保证SCI模块的正常运行,系统控制模块必须使能SCI时钟,只有使能了时钟,LSPCLK才能提供给SCI模块,也就是在系统初始化函数中需要将外设时钟控制寄存器PCLKCR0[SCIAENCLK]位置1。即SCI模块采用的时钟信号是LSPCLK,低速时钟。
  3. SCI模块具有4种错误检测标志,分别是极性错误parity、超时错误overrun、帧错误framing、间断break检测。
  4. SCI模块具有双缓冲接收和发送功能,接收缓冲寄存器为SCIRXBUF,发送缓冲寄存器为SCITXBUF。独立的发送器和接收器使得SCI既可以工作于半双工模式,也可以工作于全双工模式。
  5. SCI模块可以产生两个中断:SCIRXINT和SCITXINT,即接收中断和发送中断。
  6. SCI模块具有独立的发送中断使能位和独立的接受中断使能位。发送和接收可以通过中断方式实现,也可以通过查询方式实现。
  7. 在多处理器模式下,SCI模块具有两种唤醒方式:空闲线方式和地址位方式。平时在使用SCI时很少使用到多处理器的情况,通常就是在两个处理器之间进行通信,这时SCI通信采用空闲线方式
  8. SCIA模块具有13个寄存器,注意SCI寄存器都是8位的。当某个寄存器被访问时,数据位于低8位,高8位为0,因此,如果将数据写入高8位将是无效的。
  9. SCI具有增强的16级深度的发送/接收FIFO以及自动通信速率检测的功能。

15.1.2 SCI模块信号总结

在这里插入图片描述


15.2 SCI模块的工作原理

SCI模块能够工作于全双工模式,主要由于具有以下的功能单元。

  1. 1个发送器及相关寄存器
    • SCITXBUF:发送数据缓冲寄存器,存放由CPU装载的要发送的数据
    • TXSHF:发送移位寄存器,从SCITXBUF寄存器接收数据,并将数据移位到SCITXD引脚上,每次移一位数据
  2. 1个接收器及相关寄存器
    • RXSHF:接收移位寄存器,从SCIRXD引脚移入数据,每次移一位
    • SCIRXBUF:接收数据缓冲寄存器,存放CPU要读取的数据,来自远程处理器的数据装入RXSHF,当装满RXSHF的时候,然后装入接收数据缓冲寄存器SCIRXBUF和接收仿真缓冲寄存器SCIRXEMU中
  3. 1个可编程的波特率产生器
  4. 数据存储器映射的控制和状态寄存器

15.2.1 SCI模块发送和接收数据的工作原理

SCI模块的工作原理
SCI接收数据的过程如图15-3左半部分所示:

  1. 当其他处理器发出的数据达到SCITXD引脚后,SCI开始检测数据的起始位。
  2. 当SCIRXD检测到起始位,便开始将随后的数据逐位的移至RXSHF寄存器。
  3. 如果SCI控制寄存器SCICTL1的位RXENA为1,也就是使能了SCI的接收操作,当RXSHF寄存器中的数据满后,便将这8位数据并行移入接收缓冲寄存器SCIRXBUF中,接收缓冲寄存器就绪标志位RXRDY被置位,表示已经接收了一个新的数据,等待CPU来读取,此时还会产生一个SCI的接收中断申请信号。
  4. CPU通过程序读取SCIRXBUF寄存器中的数据后,RXRDY标志位被自动清除。
  5. 至此,完成了一个数据的读取。
  6. 如果SCI控制器SCICTL1的位RXENA为0,也就是如果没有使能SCI的接收操作。当外部数据到达引脚SCIRXD时,数据还是会被逐位的移入RXSHF寄存器,但是不会从RXSHF寄存器移入SCIRXBUF中。
  7. 如果使能了SCI的FIFO功能,则RXSHF会将数据直接加载到RX FIFO队列中,CPU再从FIFO队列读取数据,这样减少了CPU的开销,提高了效率。

SCI发送数据的过程如图15-3右半部分所示:

  1. CPU通过程序将数据写入SCITXBUF寄存器,这时候发送器不在为空,发送缓冲寄存器就绪标志位TXRDY被清除。
  2. 如果使能了SCI的FIFO功能,发送移位寄存器TXSHF直接从TX FIFO队列中获取需要发送的数据。
  3. SCI将数据从SCITXBUF发送到TXSHF寄存器,这是SCITXBUF寄存器为空,可以将下一个数据写入该寄存器了,发送缓冲寄存器就绪标志TXRDY被置位,并发出发送中断请求信号。
  4. 当数据移入发送移位寄存器TXSHF后,如果SCI控制寄存器SCICTL1的位TXENA为1,也就是使能了SCI的发送操作,则移位寄存器将数据逐位移出到引脚SCITXD上。
  5. 至此,完成了一个数据的发送。
  • 当接收缓冲寄存器SCIRXBUF内有数据是,表示接收缓冲寄存器已经就绪,等待CPU来读取数据,其标志位RXRDY为高,当CPU将数据从SCIRXBUF中读取后,RXRDY被清除,变为低。
  • 当发送缓冲寄存器SCITXBUF为空时,表示发送缓冲寄存器就绪,等待CPU写入下一个需要发送的数据,其标志位TXRDY为高,当CPU将数据写入SCITXBUF后,TXRDY被清除,变为低。

15.2.2 SCI通信的数据格式

处理器在通信的时候,一般都会涉及协议。所谓协议,就是值通信双方预先约定好的数据格式,以及每位数据所代表的具体含义。这就像情报工作一样,情报人员将一份情报传给了上级,上级可以根据事先约定好的规则进行翻译,获取该份情报的具体内容。如果情报被敌人截获了也不怕,由于敌人不知道情报中每个文字所代表的含义,对于敌人来说,这份情报是无效的。这种事先约定好的规则,在通信中就叫做通信协议。

在SCI中,通信协议体现在了SCI的数据格式上。通常将SCI的数据格式称为可编程的数据格式,原因是可以通过SCI的通信控制寄存器SCICCR来进行设置,规定了通信过程中所使用的数据格式。F28335的SCI模块使用的是NRZ数据格式,其中包括了:

  • 1个起始位
  • 1~8个数据位
  • 1个奇偶/非极性位
  • 1~2个结束位
  • 在多处理器通信时的地址位模式下,有一个用于区别数据或者地址的特殊位。

在一个NRZ格式的数据中,真正的数据内容是1~8位,最多为1个字符的长度。通常,将带有格式信息的每一个数据字符叫做一帧。在通信中,常常是以帧为单位的。
LSB为数据的最低位,MSB为数据的最高有效位。
空闲线模式下SCI一帧的数据格式
可以看到,SCI的数据帧包括了1个起始位,1~8个数据位,1个可选奇偶校验为和1或2个结束位。每个数据位占用8个SCI的时钟周期SCICLK,也就是LSPCLK。
SCI异步通信格式
SCI的接收器在收到一个起始位后开始工作,如果SCIRXD引脚检测到连续4个SCICLK周期的低电平,SCI就认为接收到了一个有效的起始位,否则就需要寻找新的起始位。对于每个帧中起始位后面的数据位,CPU采用多数表决的机制来确定该位的值,具体的做法是:在每个数据位第4~6个SCICLK周期进行采样,如果3次采样中有2次以上的值相同,那么这个值就作为该数据位的值。

15.2.3 SCI通信的数据传输速率

过去邮寄一封信或者包裹通常需要一周甚至更久的时间,而现在使用快递大多只需要一两天,说明传输和派送的速度大大加快了。

SCI通信其实也是在运输物品,只不过这些物品是由1或者0组成的数字信息。那么SCI是以什么样的速度去运输这些数据的呢?这个速度是由SCI的数据传输速率来决定的。所谓数据传输速率,就是设备每秒所能发送的二进制数据的位数。

F28335的每个SCI模块都具有2个8位的数据传输速率寄存器,SCIHBAUD和SCILBAUD,通过编程,可以实现达到64K种不同的速率。

SCI模块通信的数据传输速率与数据传输速率选择寄存器之间的关系如下:

  • BRR = (LSPCLK / (SCI Asynchronous Baud * 8))- 1
  • 其中BRR为SCI数据传输速率选择寄存器中的值,从十进制转换为十六进制后,其高8位赋值给SCIHBADU,低8位赋值给SCILBAUD。
    上述传输速率仅适用于1≤BRR≤65535时的情况,当BRR=0时,SCI模块的数据传输速率为:
  • SCI Asynchronous Baud = LSPCLK / 16
    波特率对应表
    在进行串口通信的时候,双方设备都必须以相同的数据格式和数据传输速率进行通信,否则通信就会失败。
    例如使用F28335的SCI和计算机上的串口调试软件进行通信时,SCI采用了什么样的数据格式和数据传输速率,那么串口调试软件也需要设置成相同的数据格式和数据传输速率,反之一样。

15.2.4 SCI模块的FIFO队列

F28335的SCI可以工作在标准的SCI模式,也可以工作在增强的FIFO模式。当DSP上电复位时,SCI模块工作在标准SCI模式,此时增强的FIFO模式是禁止的,相应的,和FIFO功能相关的寄存器SCIFFTX、SCIFFRX和SCIFFCT都是无效的。

通过将SCI FIFO发送寄存器SCIFFTX的位SCIFFEN置1,使能FIFO模式。将SCIFFTX的位SCIRST置1,可以在任何状态下复位FIFO模式,SCI FIFO将重新开始发送和接收数据。

在标准的SCI模式下,发送只有发送缓冲寄存器SCITXBUF,接收也只有接收缓冲寄存器SCIRXBUF。

在FIFO模式下,发送缓冲器和接收缓冲器都是两个16级的FIFO队列,发送FIFO队列的寄存器宽度是8位,而接收FIFO队列的寄存器是10位。

以发送为例:

  • 在标准SCI模式下,8位的SCITXBUF作为发送FIFO和发送移位寄存器TXSHF之间的缓冲器,当移位寄存器的最后一位被移出后,SCITXBUF才从FIFO加载CPU写好的需要发送的数据。
  • 在FIFO模式下,SCITXBUF将不被使用,发送移位寄存器TXSHF将直接从FIFO中加载需要发送的数据,而加载数据的速度是可以编程的。

通过SCI FIFO控制寄存器SCIFFCT的位FFTXDLY[7:0]可以确定TXSHF从FIFO加载数据的速度,或者说加载数据的延时,就是隔多久加载一个数据。这种延时是以SCI模块数据传输速率的时钟周期为基本单元的,8位的FFTXDLY可以定义最小延时0个数据传输速率时钟周期到最大延时256个数据传输速率时钟周期。

如果将延时设定为最小延时,也就是0个数据传输速率时钟周期,则SCI模块的FIFO加载数据没有延时,实现连续的发送数据。

如果将延时设定为N个数据传输速率时钟周期,则SCI模块发送完一个数据后,TXSHF将隔N个数据传输速率时钟周期再从FIFO加载数据进行发送。

这种可编程延时功能的好处是协调和慢速设备之间的串行通信,同时减少CPU的干预。

发送和接收FIFO都有状态位TXFFST和RXFFST。TXFFST位于寄存器SCIFFTX[12:8],共5位。RXFFST位于寄存器SCIFFRX[12:8],共5位。这两个状态位的作用是在任何时间可以标识FIFO队列中有用数据的个数。当TXFFST被清零时,发送FIFO队列的复位位TXFIFO RESET也被清零,发送FIFO的指针复位为0,可以通过将TXFIFO RESET置位来重新启动FIFO队列的发送操作。同样,当RXFFST被清零时,接收FIFO队列的复位位RXFIFO RESET也被清零,接收FIFO的指针复位为0,可以通过将RXFIFO RESET置位来重新启动FIFO队列的接收操作。

15.2.5 SCI模块的中断

下图是SCI中断标志和中断使能逻辑汇总。SCI模块可以产生两种中断:接收中断RXINT和发送中断TXINT。由于SCI可以工作在标准SCI模式和FIFO模式,无论在哪种模式下,SCI都能产生接收中断和发送中断,但是在不同的模式下,两种中断信号产生的情况有所不同。
SCI中断标志和中断使能逻辑

1.在标准SCI模式下

当SCIFFTX寄存器的SCIFFENA位为0时,也就是FIFO功能未被使能时,SCI工作于标准SCI模式。对于接收操作,当RXSHF将接收到的数据写入SCIRXBUF,等待CPU来读去时,接收缓冲器就绪标志位RXRDY被置位,表示已经接收了一个数据,同时产生了一个接收中断RXINT的请求信号。如果SCI控制寄存器SCICTL2的位RX/BKINTENA为1,也就是接收中断已经使能,那么SCI将向PIE控制器提出中断申请。
由接收中断的中断使能位RX/BKINTENA可以看出,RXINT时一个复用的中断。当SCI接收出现错误(RX ERROR)时,或者SCI接收出现间断(RX BREAK)时,都会产生接收中断RXINT的请求信号。
当极性错误、超时错误、帧错误、间断监测这4种错误检测标志位中任何一个标志位被置1,SCI的接收错误标志RX ERROR就会被置1,同时产生一个接收中断RXINT的请求信号。如果SCI控制寄存器SCICTL1的位RX ERR INT ENA为1,也就是接收中断已经使能,那么SCI将向PIE控制寄存器提出中断请求。
当SCI从丢失第一个结束位开始,如果SCIRXD引脚上连续的保持至少10位的低电平,即SCI认为接收产生了一次间断,此时SCI接收状态寄存器SCIRXST的位BRKDT被置位,即间断检测标志位被置位,同时产生了一个接收中断RXINT的请求信号。如果SCI控制寄存器SCICTL2的位RX/BKINTENA为1,也就是中断已经使能,那么SCI将向PIE控制器提出中断请求。
从以上描述可以看出,SCI接收时,接收完一个数据,接收出现错误或者接收出现间断,都可以作为SCI接收中断RXINT的中断事件,如果使能相应的中断使能位,当这些事件发生时,都会产生一个RXINT中断请求。不过,平时使用最多的还是当SCI接收完一个数据后产生接收中断的情况。
对于发送操作,当发送缓冲寄存器SCITXBUF将数据写入发送移位寄存器TXSHF后,SCITXBUF为空,发送缓冲器就绪标志位TXRDY被置位,表示CPU可以将下一个需要发送的数据写入SCITXBUF中,同时产生一个发送中断TXINT的请求信号。如果SCI控制寄存器SCICTRL2的位TXINTENA为1,也就是发送中断已经使能,那么SCI将向PIE控制器提出中断请求。

2.在FIFO模式下

当SCIFFTX寄存器的SCIFFENA位为1时,也就是FIFO功能被使能时,SCI工作于增强的FIFO模式。对于接收操作,接收FIFO队列有状态位RXFFST,表示接收FIFO中有多少个接收到的数据。同时,SCI FIFO接收寄存器SCIFFRX还有一个可编程的中断级位RXFFIL。当RXFFST的值与RXFFIL相等时,接收FIFO就会产生接收中断RXINT信号,如果SCIFFRX寄存器的位RXFFIENA为1,也就是FIFO接收中断已经使能,那么SCI将向PIE控制器提出中断请求。比如,假设通过编程,将RXFFIL位设置为8,那么当FIFO队列中接收到8个数据时,RXFFST的值也为8,正好和RXFFIL的值相同,这时候接收FIFO就产生了接收中断匹配事件。复位后,接收FIFO的中断触发级位RXFFIL默认为0x1111,即16,也就是说,FIFO队列中接收到16个数据的时候产生接收中断请求。

同工作于标准SCI模式类似,接收FIFO的接收中断RXINT也是复用的,当SCI接收出现错误时,也会产生接收中断RXINT的请求信号。

对于发送操作,发送FIFO队列有状态位TXFFST,表示发送FIFO中还有多少个数据需要发送。同时SCI FIFO发送寄存器SCIFFTX也有一个可编程的中断级位TXFFIL。当TXFFST的值与TXFFIL相同时,发送FIFO就会产生发送中断TXINT信号,如果SCIFFTX寄存器的位TXFFIENA为1,也就是FIFO发送中断已经使能,那么SCI将向PIE控制器提出中断请求。

比如,通过编程,TXFFIL设置为8,那么当FIFO队列中还剩8个数据需要发送时,TXFFST的值也是8,正好和TXFFIL的值相等,这时候发送FIFO就产生了发送中断匹配事件。复位后,发送FIFO的中断触发级位TXFFIL默认为0x0000,即0,也就是说,FIFO队列中数据全部发送完毕后产生发送中断请求TXINT。
SCI的中断


15.3 SCI多处理器通信模式

对处理器通信,就是多个处理器之间进行数据通信。
当多个处理器间进行通信时,如果给处理器A、B、C、D都预先分配好地址,然后A发出去的信息里含有接收放的地址信息,接收处理器B或者C或者D,在接收到这个数据信息时,首先进行地址的核对,如果地址不符合,则不予响应;如果地址符合,则立即读取数据。这就是SCI多处理器通信的基本原理。

SCI在进行多处理器通信时,根据地址信息识别方法的不同,多处理器通信方式分为空闲线模式和地址位模式。

15.3.1 地址位多处理器通信模式

地址位多处理器通信模式
当处理器A发出一连串数据信息时,将这串数据叫做数据块,数据块是由一个个帧构成的。从扩展后的数据格式可以看出,某一个数据块中的第一帧时地址信息,接下去的帧时数据信息,然后,在一些空闲周期之后,又有一个数据块,块中的第一帧也是地址信息,后面的时数据信息。在块内,第一帧地址信息后面的一个位是1,代表此帧时地址信息,而第二帧数据信息后面的的一个位是0,代表此帧是数据信息。这个位就叫做地址位,用于表示某个帧的数据是地址信息还是数据信息。

像这样在通信格式中加入专门的地址位来判断帧是数据信息还是地址信息的方式叫做多处理器通信的地址位模式。

15.3.2 空闲线多处理器通信模式

空闲线多处理器通信模式
在空闲线模式中,没有专门表示帧时数据或者地址的地址位。块与块之间有一段比较长的空闲周期,这段时间要明显长于块内帧与帧之间的空闲周期。如果某个帧之后又一段10位或者更长的空闲周期,那么表明新的数据块开始了。

在某一个数据块中,第一帧代表地址信息,后面的帧代表数据信息。可见,在空闲线模式下,地址信息还是数据信息是通过帧与帧之间的空闲周期来判断的。当帧与帧之间的空闲周期超过10位的时候,就表示新的数据块开始了,而且块中的第一帧时地址信息。

空闲线模式中数据格式里没有提供额外的地址位,在处理10字节以上的数据块时比地址位模式更为有效,被应用于典型的非多处理器SCI通信场合。地址位模式由于有专门的位来识别地址信息,所以数据块之间不需要空闲周期等待,所以这种模式在处理一些小的数据块的时候更位有效,当然,当传输数据的速度比较快,而程序执行速度不够快时,很容易块与块之间产生10位以上的空闲,这样其优势就不明显了。平时接触比较多的还是双处理器之间的通信。


15.4 SCI模块的寄存器

SCI的功能都是可以通过软件进行配置的,可以通过对寄存器的设置来实现SCI通信格式的初始化,包括工作模式和协议、数据传输速率、数据格式和中断使能等。


15.5 SCI发送和接收例程

SCI实现数据的接收和发送可以采用查询的方式,也可以采用中断的方式。

查询方式:就是通过查询发送缓冲寄存器的就绪标志位TXRDY和接收缓冲寄存器的就绪标志位RXRDY来判断SCI是否已经做好了发送准备或者接收准备。

当发送缓冲寄存器SCITXBUF将数据发送给发送移位寄存器TXSHF后,SCITXBUF为空,这是发送缓冲器的就绪标志位TXRDY被置1,意思是通知CPU可以发送新的数据了,因此,通过不断的查询,当TXRDY为1的时候,就可以发送新的数据了。

当接收移位寄存器RXSHF将接收到的字符发送给接收缓冲寄存器SCIRXBUF后,SCIRXBUF内有数据,这时候接收缓冲器的就绪标志位RXBUF被置1,意思是通知CPU已经接收好了一个数据,让CPU赶紧来读取,因此,通过不断的查询,当RXRDY为1的时候,就可以读取新的数据了。


15.6 习题

15-1 F28335有几个SCI模块?SCI有哪些引脚?

15-2 SCI能产生哪些中断?分别位于PIE的哪个位置?

15-3 简述SCI寄存器和PWM、AD等外设寄存器的不同之处。

15-4 SCI通信格式包括了哪些位?

15-5 设LSPCLK=37.5MHz,若要配置数据传输速率为9600bps,则BRR应设置为多少?

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值