基于F28379D的串行通信接口SCI的学习

0 前言

什么时候需要用到SCI?

假设做电机控制时需要显示 ADC 采样之后得到的电机电压、电流、转速等数据,可以在为系统设计液晶屏来显示,也可以将这些数据通过协议将其上传给计算机,然后通过计算机上的软件进行显示和监测。

例如在某些项目中需要计算机发送预先设定的指令来控制DSP 中程序的运行方式。等等..

最简单最常用的方法就是使用DSP内部的串行通信接口 SCI。


1 通讯

通信的方式可以分为多种,按照 数据传送方式可分为 串行通信并行通信。按照 通信的数据同步方式可分为 异步通信同步通信。按照 数据传输方向又可分为 单工半双工全双工通信。

1.1 串行通信和并行通信

串行通信是指使用一条数据线,将数据一位一位地依次传输,特别适用于计算机与计算机、计算机与外设之间的远距离通信。
串行通信的特点:传输线少,长距离传送时成本低,且可以利用电话网等现成的设备,但数据的传送控制比并行通信复杂。

并行通信通常是将数据字节的各位用多条数据线同时进行传送,通常是 8 位、16 位、32 位等数据一起传输。
并行通信的特点:控制简单、传输速度快;由于传输线较多,长距离传送时成本高且接收方的各位同时接收存在困难,抗干扰能力差。

1.2 异步通信和同步通信

异步通信是指通信的发送与接收设备使用各自的时钟控制数据的发送和接收过程。
异步通信是以字符(构成的帧)为单位进行传输,字符与字符之间的间隙(时间间隔)是任意的,但每个字符中的各位是以固定的时间传送的。
异步通信的特点:不要求收发双方时钟的严格一致,实现容易,设备开销较小,但每个字符要附加2~3 位用于起止位,各帧之间还有间隔,因此传输效率不高。
同步通信时要建立发送方时钟对接收方时钟的直接控制,使双方达到完全同步。此时,传输数据的位之间的距离均为“位间隔”的整数倍,同时传送的字符间不留间隙,即保持位同步关系,也保持字符同步关系。

1.3 单工、半双工和全双工通信

单工是指数据传输仅能沿一个方向,不能实现反向传输。

半双工是指数据传输可以沿两个方向,但需要分时进行,某一时间只能进行发送或者接收。

全双工是指数据可以同时进行双向传输。

1.4 通信速率

衡量通信性能的一个非常重要的参数就是通信速率,通常以比特率(Bitrate)来表示。比特率是每秒钟传输二进制代码的位数,单位是:位/秒( bps)。

如 每秒钟传送 240 个字符(帧),而每个字符(帧)格式包含 10 位(1 个起始位、1 个停止位、
8 个数据位),这时的比特率为:
10 位×240 个/秒 = 2400 bps

波特率常常直接以比特率来表示(想具体了解的小伙伴可以网上查阅一下)。


2 F28379D中SCI模块简述

SCI是 Serial Communication lnterface 的简称,即串行通信接口。SCI 是一个双线异步串口,接收和发送有各自独立的信号线,但不是同一个时钟,所以是进行串行异步通信接口,一般可以看作是 UART(通用异步接收/发送装置,51单片机叫UART,32单片机叫USART)。

设计时,SCI使用 MAX3232 芯片可设计成串口RS232,SCI使用 MAX3485 芯片可设计成串口RS485,那么F28379D就能够和其他使用 RS232 接口或RS485的设备进行通信。比如F28379D内部的两个SCI之间,或者F28379D的 SCI 同其他 DSP 的SCI之间均能实现通信。

F28379D内部具有四个串行通信接口 (SCI/UART)模块,SCIA,SCIB,SCIC,SCID.每一个SCI模块都各有一个接收器和发送器,接收器用于实现数据的接收功能,发送器用于实现数据的发送功能。F28379D具有通信速率自动检测和 FIFO 缓冲等,SCI的接收器和发送器各自都具有一个 16 级深度的 FIFO 队列,接收器和发送器也都有各自独立的中断和使能位,因此可以在半双工通信中进行独立的操作,或者在全双工通信中同时进行操作。

2.1 SCI模块特点

F28379D中4个SCI模块的功能是相同的,只是寄存器命名不同,下面全以SCIA为例进行学习,SCI与CPU接口如下图所示:

SCI 模块主要特点有:

1.SCI具有两个外部引脚:SCITXD 是 SCI 数据发送引脚,SCIRXD 是 SCI 数据接收引脚。两个引脚为多功能复位引脚,如果不使用可以作为通用数字量 IO。F28379D有多组SCIA的复位引脚可以选择。

(以上找了好久,也可能有遗漏的,可以仔细查找F28379D的复用引脚表格)

在给的例程程序中(sci的三个例程中Example_2837xd_Scixxxxxxxxxx),主函数定义的是84  85 引脚 和28  29引脚,只是8485引脚用了条件定义,当没有宏定义这个条件时默认是不用的(变灰了),也就是默认为是用的28 29引脚的SCIA功能,,当然根据自己的电路和想用的引脚可以自行修改和配置。

2.外部晶振通过F28379D的 PLL模块倍频之后产生了CPU 的系统时钟SYSCLK,然后 SYSCLK 经过低速时钟预定标器之后输出低速外设时钟 LSPCLK 提供给SCI模块。要保证 SCI的正常运行,系统控制模块必须使能 SCI时钟,只有使能了,LSPCLK 才供给 SCI,也就是在系统初始化函数中需要将外设时钟控制寄存器PCLKCR7的 SCI_A 位置1。

这段程序是在InitSysCtrl()里,按快捷键F3可直接进入查看

3.可编程通信速率,可以设置 64K 种通信速率

每个SCI模块都具有2个8位的波特率寄存器:SCIHBAUD和SCILBAUD,所以一共有16位。通过程序可以设置2^16中不同的速率,即可以设置 64K 种通信速率。

4.数据格式:一个启动位,1~8位可编程数据位(最低位LSB,最高位MSB),一个可选择奇/偶校验,1~2个结束位。

上图为一帧数据的格式,通常将带有格式信息的每一个数据字符称作一帧,在通信中,常常以为单位。

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

SCI异步通信的每一条数据帧中每个位占用8个SCICLK时钟周期,也就是LSPCLK,如下图所示:

SCI的接收器在收到一个起始位后开始工作,如果SCIRXD引脚检测到连续的4个SCICLK 周期的低电平,SCI就认为接收到了一个有效的起始位否则就需要寻找新的起始位。对于每个顿中起始位后面的数据位,CPU 采用多数表决的机制来确定该位的值,具体的做法是:在每个数据位第 4,5,6个SCICLK 周期进行采样,如果 3 次采样中有 2 次以上的值相同,那么这个值就作为该数据位的值。

5.具有4种错误检验标志位:极性错误(奇偶校验)超时错误帧错误间断检测

6.具有2种唤醒多处理方式:空闲线唤醒地址位唤醒

SCI模块可以工作于空闲线方式或者地址位方式。而在平常使用时,一般都是两个处理器之间进行通信,例如F28379D与 PC 机之间,或者两个F28379D之间,这时更适合使用空闲线方式;而地址位方式一般用于多处理器之间的通信。平时空闲线方式比较常见

7.SCI模块具有双缓冲接收和发送功能接收缓冲寄存器为SCIRXBUF发送缓冲寄存器为 SCITXBUF。独立的发送器和接收器使得 SCI既能工作于半双工模式,也能工作于全双工模式

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

9.独立的发送和接收中断使能控制(BRKDT 除外)。

SCI模块可以产生两个中断:SCIRXINTSCITXINT接收中断发送中断。SCI模块具有独立的发送中断使能位和接收中断使能位。

10.NRZ(非归零)通信格式。其数据格式在上述第4条。

11.每个SCI模块具有13 个寄存器,每个寄存器占用16位,起始地址为 7200H。

在程序中的定义(F2837XD_sci.h):

(F2837XD_Headers_nonBIOS_cpu1.cmd):

增强的功能包括:

1.自动通信速率检测。

2.16 级发送/接收 FIFO。

2.2 SCI 工作原理

F28379D的SCI 模块能够有这么多功能,取决于它的内部结构。其内部结构框图如下图所示:
SCI模块主要功能单元如下:
1.一个发送器(TX)及相关寄存器: SICTXBUF和TXSHF。
SICTXBUF:发送数据缓冲寄存器,存放由CPU装载的需要发送的数据所要发送的数据。
TXSHF 寄存器:发送移位寄存器,从 SCITXBUF 寄存器接收数据,然后将数据逐位移到 SCITXD引脚上,每次移一位数据。
2.一个接收器(RX)及相关寄存器: SICRXBUF和RXSHF。
SCIRXBUF:接收数据缓冲寄存器,存放 CPU 要读取的数据。从其他处理器传输过来的数据逐位移入寄存器 RXSHF。当装满 RXSHF 时将数据装人接收数据缓冲寄存器SXIRXBUF和接收仿真缓冲寄存器SCIRXEMU中。

RXSHF:接收移位寄存器,从SCIRXD引脚移入数据,每次移1位数据。

3.一个可编程的波特率发生器。

4.数据存储器映射的控制和状态寄存器。

2.2.1 发送和接收数据的工作原理

结合SCI模块的内部结构框图可知,SCI模块具有独立的数据发送器和数据接收器,这样能够保证 SCI 既能同时进行,也能够独立进行发送和接收的操作。

1.SCI接收数据的过程(RX)

>>标志位 RXENA(SCICTL1 位 0)为 1,使能接收器接收数据。

>>数据达到 SCIRXD 引脚后,检测起始位。检测到起始位后开始逐位将数据移至RXSHF 寄存器。

>>数据从 RXSHF 寄存器移位到接收缓冲器(SCIRXBUF),产生一个中断申请,标志位 RXRDY(SCIRXST 位 6)为 1,表示已接收一个新字符。

>>CPU通过程序读取SCIRXBUF 寄存器中的数据后,RXRDY标志位被自动清除。至此,完成了一个数据的读取。

>>数据的下一个字节达到 SCIRXD 引脚时,检测启动位后清除。

>>如果使能了 SCI的 FIFO 功能,则 RXSHF 会将数据直接加载到 RX FIFO队列中,CPU再从 FIFO 队列读取数据,这样减少了 CPU 的开销,提高了效率。

2.SCI发送数据的过程(TX)

>>位 TXENA(SCICTL1 位 1)为 1,使能发送器发送数据。

>>CPU通过程序将数据写入 SCITXBUF 寄存器,这时发送器不再为空发送缓冲寄存器就绪标志位TXRDY 被清除,TXRDY 为低。

>>如果使能了 SCI的 FIFO 功能,发送移位寄存器 TXSHF 将直接从 TX FIFO队列中获取需要发送的数据。

>>SCI将数据从SCITXBUF 发送到TXSHF寄存器,这时SCITXBUF 寄存器为空,可以将下一个数据写入该寄存器了,发送缓冲寄存器就绪标志位 TXRDY 被置位并发出发送中断请求信号求(使能中断,位 TXINTENA,SCICTL2 中的第 0 位置 1)。

>>由于SCI控制寄存器SCICTL1的位TXENA 为1,当数据移入发送移位寄存器TXSHF 后,将数据逐位逐位的移到引脚 TXRDY上。至此,完成一个数据的发送。

>>在 TXRDY 被置位后,程序写第 2 个字符到 SCITXBUF 寄存器(在第 2 个字节写入到 SCITXBUF 后,TXRDY 又变低)。
>>发送完第 1 个字符,开始将第 2 个字符移位到寄存器 TXSHF。
>>第 2 个字符发送完成,发送器变空(TXRDY变高)再准备发送下一个字符。

2.2.2 16级FIFO缓冲描述

F28379D的 SCI可以工作在标准 SCI模式,也可以工作在增强的 FIFO模式

1.当DSP上电复位时,SCI模块工作在标准 SCI模式,此时 FIFO 功能是被禁止的,相应的和 FIFO 功能相关的寄存器 SCIFFTXSCIFFRX SCIFFCT 都是无效的。

2.在标准SCI模式下:TXINT/RXINT 中断作为 SCI 的中断源。

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

4.寄存器有效:所有 SCI 寄存器和 SCI FIFO 寄存器(SCIFFTX、SCIFFRX 和 SCIFFCT)有效。

5.中断:FIFO 模式有两个中断,一个是发送 FIFO 中断 TXINT,另一个是接收 FIFO 中断RXINT。FIFO 接收、接收错误和接收 FIFO 溢出共用 RXINT 中断。标 准 SCI 的 TXINT 将被禁止,该中断将作为 SCI 发送 FIFO 中断使用。

6.缓冲:在标准SCI模式下,发送只有发送缓冲器 SCITXBUF,接收也只有接收缓冲器SCIRXBUF。在 FIFO模式下,发送缓冲器和接收缓冲器都是2个16 级的FIFO队列,发送 FIFO 队列的寄存器是 8 位,而接收 FIFO 队列的寄存器是 10 位。标准 SCI 的一个字的发送缓冲器作为发送 FIFO 和移位寄存器间的发送缓冲器。只有移位寄存器的最后一位被移出后,一个字的发送缓冲才发送 FIFO 装载。使能 FIFO 后,经过一个可选择的延迟 (SCIFFCT),TXSHF 被直接装载而不再使用 TXBUF。

7.延迟发送:FIFO 中的数据传送到发送移位寄存器的速率是可编程的,可以 通过 SCIFFCT 寄存器的位 FFTXDLY(7~0)设置发送数据间的延迟。FFTXTDLY(7~0) 确定延迟的 SCI 波特率时钟周期数,8 位寄存器可以定义从 0 个波特率时钟周期的最小延迟到 256 个波特率时钟周期的最大延迟。当使用 0 延迟时,SCI 模块的 FIFO 数据移出时,数据间没有延时,一位紧接一位的从 FIFO 移出,实现数据的连续发送。当选择 256 个波特率时钟的延迟时,SCI 模块工作在最大延迟模式, FIFO 移出的每个数据字之间有 256 个波特率时钟的延迟。在慢速 SCI/UART 的通 信时,可编程延迟可以减少 CPU。

8.FIFO状态位:发送和接收 FIFO 都有状态位 TXFFST 或 RXFFST(位 12~0), 这些状态位显示当前FIFO内数据的个数。当状态位为0时,发送FIFO复位TXFIFO 和接收复位位 RXFIFO 会被设置为 1,会将 FIFO 指针复位为 0,FIFO 重新开始运行。

9.可编程的中断级:发送和接收 FIFO 都能产生 CPU 中断,只要发送 FIFO 状态位 TXFFST(位 12-8)与中断触发优先级 TXFFIL(位 4-0)相匹配,就产生一个中断触发,从而为 SCI 的发送和接收提供一个可编程的中断触发逻辑。接收FIFO 的默认触发优先级为 0x11111,发送 FIFO 的默认触发优先级为 0x00000。

2.2.3 SCI通讯的波特率

波特率就是指设备每秒能发送的二进制数据的位数。F28379D的4个SCI模块都具有2个8位的波特率寄存器SCIHBAUD和SCILBAUD(存放BRR十六进制的值),通过编程可以实现达到 64K 种不同的速率。

SCI模块通信波特率与波特率选择寄存器之间的关系如下式所示:

BRR=\frac{LSPCLK}{SCI Asynchronous Baud*8}-1

其中,BRR为SCI波特率选择寄存器中的值,从十进制转换成十六进制后,其高8 位赋值给 SCIHBAUD,低8位赋值给 SCILBAUD。

波特率公式仅适用于1<=BRR<=65 535 的情况。并且BRR约大,波特率就越小。

F28379D例程( Example_2837xDSci_Echoback.c)中计算过程是:例程中设置的是9600的波特率和50MHZ的低速外设时钟:

(50 000000/(9600*8))-1=650.0416....取整为650,化成16进制为0x028A;

只是有个疑问是例程中没有减去1,给的是0X028B,但是给的寄存器说明里面确实是减去一的(正常算出来的应该是0X028A),也有一种可能是小数点后直接进一了,所以有弄明白的小伙伴可以留个言解释一下,万分感谢!!!

注意:在进行串口通信时,双方设备都必须以相同的数据格式和波特率进行通信,否则通信就会失败。例如F28379D的 SCI和计算机上的串口调试软件进行通信时,SCI采用什么样的数据格式和波特率,那么串口调试软件也需要设定成相同的数据格式和波特率,反之也一样。这是SCI通信不成功时最简单然而也最容易忽视的一个问题。

2.2.4 SCI模块的中断

F28379D可以看到SCI模块可以产生两种中断:接收中断 RXINT 发送中断 TXINT。SCI可以工作在标准的SCI模式下,也可以工作在增强的 FIFO模式下,无论工作于哪种模式SCI都能产生接收中断和发送中断;但是不同的模式下,这两种中断信号产生的情况会有所不同。

1.在标准SCI模式下:

当SCIFFTX寄存器的 SCIFFENA 位为0,也就是 FIFO功能未使能时,SCI工作于标准 SCI模式。

第一个可产生的接收中断:

对于接收操作,当 RXSHF 将接收到的数据写入SCIRXBUF,等待CPU 来读取时,接收缓冲器就绪标志位 RXRDY被置位,表示已经接收了一个数据,同时产生了一个接收中断 RXINT 的请求信号。如果 SCI 控制寄存器SCICTL2的位 RX/BKINTENA (SCICTL2的第1位)为1,也就是接收中断已经使能,那么SCI将向 PIE控制器提出中断请求。

通过接收中断的中断使能位 RX/BKINTENA 可以看出其实RXINT 是一个复用的中断。当 SCI接收出现错误(RX ERROR)时,或者当SCI 接收出现间断(RXBREAK)时,都会产生接收中断 RXINT的请求信号。

第二个可产生的接收中断:

错误:当极性错误(parity)、超时错误(overrun)、顿错误(framing)、间断(break)检测这4种错误检测标志位中任何一个标志位被置 1,SCI的接收错误标志 RX ERROR就会被置1同时产生一个接收中断 RXINT 的请求信号。如果SCI 控制寄存器SCICTL1的位 RX ERRINT ENA(SCICTL1的第6位)为1,也就是接收中断已经使能,那么 SCI将向 PIE 控制器提出中断请求。

第三个可产生的接收中断:

间断:当SCI从丢失第一个停止位开始,如果 SCIRXD引脚上连续地保持至少 10 位的低电平,则 SCI认为接收产生了一次间断此时 SCI 接收状态寄存器 SCIRXST的位BRKDT 被置位,即间断检测标志位被置位,同时产生一个接收中断 RXINT 的请求信号。如果 SCI控制寄存器SCICTL2的位 RX/BKINTENA(SCICTL2的第1位)为1也就是接收中断已经使能,那么SCI将向 PIE 控制器提出中断请求。

从上面的介绍可以看到,SCI 接收时,接收完一个数据、接收出现错误或者接收出现间断,都可以作为 SCI接收中断 RXINT 的中断事件。如果使能相应的中断使能位,当这些事件发生时,都会产生一个 RXINT 的中断请求。不过,平时使用最多接触最多的还是当SCI接收完一个数据后产生接收中断的情况(第一个可产生的接收中断的情况居多)。

一个可产生的发送中断:

对于发送操作,当发送缓冲寄存器 SCITXBUF将数据写入发送移位寄存器TXSHF后,SCITXBUF 为空,发送缓冲器就绪标志位 TXRDY 被置位,表示CPU 可以将下一个需要发送的数据写到SCITXBUF 中,同时产生一个发送中断TXINT的请求信号。如果 SCI控制寄存器SCICTL2的位TXINTENA(SCICTL2的第0位)为1也就是发送中断已经使能,那么SCI将向 PIE 控制器提出中断请求。

2.在FIFO模式下:

当SCIFFTX 寄存器的 SCIFFENA 位为1也就是 FIFO 功能被使能时,SCI工作于增强的 FIFO 模式。

对于接收操作,接收 FIFO 队列有状态位 RXFFST,表示接收 FIFO 中有多少个接收到的数据。同时,SCI FIFO接收寄存器SCIFFRX还有一个可编程的中断级位 RXFFIL。当RXFFST的值与预设好的 RXFFIL相等时,接收 FIFO就会产生接收中断 RXINT 信号,如果SCIFFRX 寄存器的位RXFFIENA(SCIFFRX第5位)为1,也就是 FIFO 接收中断已经使能,那么SCI将向 PIE 控制器提出中断请求。

例如,假设通过编程将 RXFFIL 位设置为8,那么当 FIFO 队列中接收到8个数据时,RXFFST的值也为 8,正好和 RXFFIL的值相等,这时接收 FIFO就产生了接收中断匹配事件,通过程序使能RXFFIENA(SCIFFRX第5位)便向 PIE 控制器提出中断请求。复位后,接收 FIFO 的中断触发级位 RXFFIL 默认的值为0x1111,即16,也就是说 FIFO 队列中接收到 16 个数据时产生接收中断请求。

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

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

例如,假设通过编程将TXFFIL位设置为 8,那么当 FIFO 队列中还剩8 个数据需要发送时,TXFFST 的值也为8正好和TXFFIL的值相等,这时发送 FIFO 就产生了发送中断匹配事件,通过程序使能TXFFIENA(SCIFFTX第5位)便向 PIE 控制器提出中断请求。复位后,发送 FIFO的中断触发级位 TXFFIL 默认的值为 0x0000,即0也就是说 FIFO 队列中数据全部发送完毕后产生发送中断请求。

综上所述SCI的中断表如下:

SCI自动波特率检测功能和多处理器的通讯模式先不学习,后续若用到再更新,有需要用的小伙伴可以参考文章结束参考文献的书籍。

到这SCI模块的基本原理已描述完成。


3 SCI串口通讯程序配置步骤

对于SCI程序,在上面学习SCI特点和基本原理的时候就已经对程序进行了学习,接下来主要是将程序按照配置步骤一步一步的来配置。

(1)初始化系统,使能 SCI 外设时钟,处理看门狗电路等:

在主程序里面进行配置(对应例程中的 Example_2837xDSci_Echoback.c):

按F3可进入查看配置的程序(对应例程中的 F2837xD_SysCtrl.c,例程中打开了所有外设的时钟,为减少CPU的负荷,自己在配置过程中用到什么外设就打开什么外设时钟。

(2)初始化GPIO,将SCIA的引脚SCITXDA和SCIRXDA设定为功能引脚(对应例程中的 Example_2837xDSci_Echoback.c):

在上面2.1学习引脚的时候列出了SCIA对应的好多复用引脚,想用哪个引脚作为SCIA的功能就对其复用功能进行配置:

(3)初始化SCIA模块,设定SCI工作方式及参数设置,包括数据格式、波特率、使能发送、接收功能等(对应例程中的 Example_2837xDSci_Echoback.c):

(3)循环查询 SCIA 发送和接收的状态,若状态被置位,则相应进行数据接收或发送工作:

通过前面的配置就已经初始化 SCI 了,下面就可以开始使用 SCI 进行数据收发。

发送:SCI 发送数据前,先查询发送完成标志,如果发送完成就开始发送下面数据,否则一直等待(对应例程中的 Example_2837xDSci_Echoback.c):

上面是 SCI 发送单字节函数,实际应用中我们需要发送多个字节,这就需要对 SCI 单字节发送函数再次封装,代码如下:

注意:函数参数是一个字符指针类型,函数内当遇到字符串结尾“\0’自动停止发送。

接收:有发送就会有接收数据,SCI 在接收数据之前,同样需要先判断接收完成标然后在开始接收下面数据。代码如下:

(对应例程中的 Example_2837xDSci_Echoback.c)

变量 ReceivedChar 是我们自定义的,其内部存储的就是 SCI 接收的数据,该部分一次只能接收一个字节数据,要想接收多字节,可定义一个数组存储其中。

整体的FOR循环函数如下(对应例程中的 Example_2837xDSci_Echoback.c):能够实现和电脑PC的接收,发送功能:

至此我们就将 SCI 的程序配置步骤学习完了,按照上面的操作步骤配置 SCI,可以实现简单的 SCI 串口通信功能,更为复杂的也就是增加或修改寄存器的值而已。


4 硬件层串口通信RS232和RS485简单介绍(仅供学习)

F28379D 内部含有非常多的通信接口,其中串口是通信接口中应用 非常广泛之一,开发板上可以集成RS232模块,串口接在 F28379D 芯片的 SCIA 接口。也可以集成RS485模块,串口可接在 F28379D 芯片的 SCIB 接口等等。
RS232,485等,这些都是通讯的硬件层基础,就比如高速路上开车,建立硬件层就是把高速路给建立起来才可以跑车,所以硬件层是基础。至于软件层就是高速路的交通规则,通讯的软件层包括有MODBUS、TCP/IP等协议。目前先只学习硬件层的构建,软件层协议先不考虑。
串口通信(Serial Communication),是指外设和计算机间通过数据信号线、 地线等按位进行传输数据的一种通信方式,属于串行通信方式。串口是一种接口标准,它规定了接口的电气标准,没有规定接口插件电缆以及使用的协议。
接口标准:串口通信的接口标准有很多,有 RS-232C、RS-232、RS-422A、RS-485 等。 常用的就是 RS-232 和 RS-485RS-232 其实是 RS-232C 的改进,原理是一样的。

4.1 RS232

RS-232C 接口规定使用 25 针连接器,简称 DB25,连接器的尺寸及每个插针的排列位置都有明确的定义,如下图所示:

RS-232C 还有一种 9 针的非标准连接器接口,简称 DB9。 串口通信使用的大多都是 DB9 接口(是我们目前最常见到的) 。DB25 和 DB9 接头有公头和母头之分,其中带针状的接头是公头,而带孔状的接头是母头。9 针串口线的外观图如下图所示:

从上图中可以看到公头和母头的管脚定义顺序是不一样,这一点需要特别注意。这些管脚都有什么作用呢?9 针串口和 25 针串口常用管脚的功能说明如下图所示:

在串口通信中,通常只使用 2、3、5 三个管脚,即 TXD、RXD、SGND, 其他管脚功能大家看不明白也没关系。
逻辑电平:RS-232C 对逻辑电平也做了规定,如下:
在 TXD 和 RXD 数据线上: 逻辑 1 为-3~-15V 的电压;逻辑 0 为 3~15V 的电压。
在 RTS、CTS、DSR、DTR 和 DCD 等控制线上:信号有效(ON 状态)为 3~15V 的电压;信号无效(OFF 状态)为-3~-15V 的电压。
由此可见,RS-232C 是用正负电压来表示逻辑状态,与晶体管-晶体管逻辑集成电路(TTL)以高低电平表示逻辑状态的规定正好相反。比如 51 单片机使用的就是 TTL 电平,所以要实现 51 单片机与计算机的串口通信,需要进行 TTL与 RS-232C 电平转换,通常使用的电平转换芯片是 MAX232
在串口通信中通常 PC 机(台式)的 DB9 为公头,单片机上使用的串口 DB9 为母头, 通过一根直通串口线进行相连:在 9 针串口线实物图即为直通型串口线,串口线(COM)母头连接计算机 DB9 的公头,串口线公头连接单片机上使用的 DB9 母头,这样就是将 2、3、5 管脚直接相连(PC、单片机、直通串口线)。
如果你要实现两台计算机串口通信,那么就需要一根交叉串口线,将 2 对 3、3 对 2、5 对 5 连接,交叉串口线一般两头都是母头。(PC机A、PC机B、 交叉串口线)
串口通信中还需要注意的是,串口数据收发线要交叉连接,计算机的 TXD要对应单片机的 RXD,计算机的 RXD 要对应单片机的 TXD,并且共 GND,如下图:

在计算机与单片机进行串口通信时,使用的是直通线,这时候怎么让 TXD 与 RXD 交叉连接?前面我们说了单片机处理的是 TTL电平,需要使用 RS232 电平转换芯片,将 RS232 电平转换芯片串行数据输出管脚交叉连接在 DB9 母头上即可。下面硬件电路设计部分会介绍。

通信协议:RS232 的通信协议比较简单,通常遵循 96-N-8-1 格式。

“96”表示的是通信波特率为 9600。串口通信中通常使用的是异步串口通信,即没有时钟线,所以两个设备要通信,必须要保持一致的波特率,当然,波特率常用值还有 4800、 115200 等等。

“N”表示的是无校验位,由于串口通信相对更容易受到外部干扰导致传输 数据出现偏差,可以在传输过程加上校验位来解决这个问题。校验方法有奇校验 (odd)、偶校验(even)、0 校验(space)、1 校验(mark)以及无校验(noparity)。 

“8”表示的是数据位数为 8 位,其数据格式在前面介绍异步通信中已讲过。当然数据位数还可以为 5、6、7 位长度。

“1”表示的是 1 位停止位,串口通讯的一个数据包从起始信号开始,直到停止信号结束。数据包的起始信号由一个逻辑 0 的数据位表示,而数据包的停止信号可由 0.5、1、1.5 或 2 个逻辑 1 的数据位表示,只要双方约定一致即可。

硬件电路:SCIA对应到芯片的 2 个管脚 SCITXDA 和 SCIRXDA,通过软件配置即可使用,但是该引脚是 TTL 电平,要让其与电脑串口通信,还需要一个电平转换芯片,可以用MAX3232 芯片

RS232 模块电路如下(本电路图借鉴的是普中的开发板,其实选用相同的转换芯片硬件电路都差不多):

普中的使用的 SCIA 是在F28335芯片的 GPIO35 和 GPIO36 脚,这里换成F28379D对应的引脚即可。上面说过 SCI串口通信需要将串口交叉连接,即 F28379D的 SCI 的 TXD 与 PC 机的 RXD 连接,SCI的 RXD 与 PC 机的 TXD 连接。在 DB9 接口处,本来 2 脚是 TXD,3 脚是 RXD 的,这
里我们将 SP3232 的串口输出 PCRXA 脚连接到 DB9 的 2 脚,串口输出的 PCTXA 脚连接到DB9的3脚,这里就将串口进行交叉了。
原理图上的SP3232芯片与MAX3232 是兼容的,所以使用哪一种都可以。
开发板上用的 DB9 接口是母头,母头可作为下位机和上位机 PC 进行串口通信,公头可作为上位机和其他母头设备进行串口通信,当然也可以和计算机的公头进行通信,需使用交叉型串口线。要和笔记本电脑进行串口通信,需要一根 USB 转 232 线,线的一端与开发板 DB9 母头连接,另一端USB 口与电脑 USB 连接。

RS232软件程序部分和第3节配置一样。

4.2 RS485

典型的串口通信标准有 RS232 和 RS485,RS232 是 全双工 点对点的通信,而 RS485 是 半双工通信(2 线制),可以一点对多点进行组网,而且 RS485 是用缆线两端的电压差值来表示传递信号,这与 RS232 电气特性大不一样。RS485仅仅规定了接受端和发送端的电气特性,并没有规定或推荐任何数据协议,因此RS485 的协议层可以和 RS232 一样。

RS485 的特点:

(1)接口电平低,不易损坏芯片。RS485 的电气特性:逻辑“1”以两线间的电压差为+(2~6)V 表示;逻辑“0”以两线间的电压差为-(2~6)V 表示。接口信号电平比 RS232 降低了,不易损坏接口电路的芯片,且该电平与 TTL 电平兼容,可方便与 TTL 电路连接。
(2)传输速率高。10 米时,RS485 的数据最高传输速率可达 35Mbps,在1200m 时,传输速度可达 100Kbps。
(3)抗干扰能力强。RS485 接口是采用平衡驱动器和差分接收器的组合,抗共模干扰能力增强,即抗噪声干扰性好。
(4)传输距离远,支持节点多。RS485 总线最长可以传输 1200m 以上(速率≤100Kbps)一般最大支持 32 个节点,如果使用特制的 485 芯片,可以达到128 个或者 256 个节点,最大的可以支持到 400 个节点。
RS485 推荐使用在点对点,线型,总线型网络中,不能使用在星型和环型网络。理想情况下RS485 需要 2 个终端匹配电阻,其阻值要求等于传输电缆的特性阻抗(一般为 120Ω)。没有特性阻抗的话,当所有的设备都静止或者没有能 量的时候就会产生噪声,而且线移需要双端的电压差。没有接电阻的话,会使得较快速的发送端产生多个数据信号的边缘,导致数据传输出错。RS485 推荐的连接方式如下图所示:

在 RS485 通信网络中,通常会使用 485 收发器来转换 TTL 电平和 RS485 电平。节点中的串口控制器使用 RX 与 TX 信号线连接到 485 收发器上,而收发器通过差分线连接到网络总线,串口控制器与收发器之间一般使用 TTL 信号传输,收发器与总线则使用差分信号来传输。发送数据时,串口控制器的 TX 信号经过收发器转换成差分信号传输到总线上,而接收数据时,收发器把总线上的差分信号转化成 TTL 信号通过 RX 引脚传输到串口控制器中。通常在这些节点中只能有一个主机,剩下的全为从机。在总线的起止端分别加了一个 120 欧的匹配电阻。
开发板采用 MAX3485 作为收发器,该芯片支持 3.3V 供电,最大传输速度可达 10Mbps,支持多达 32 个节点,并且有输出短路保护。该芯片的框图如下图所示:

图中 A、B 为 RS485 总线接口,用于连接 485 总线。RO 是接收输出端,DI是发送数据输入端,RE 是接收使能信号(低电平有效),DE 是发送使能信号(高电平有效)。因为 RS485 为半双工通信,通过 RE 和 DE 就能控制发送与接收。
使用 F28379D的 SCIB 串口与 MAX3485 收发器串口进行连接,这里要特别注意,因为 PC 机(台式)不具有 RS485 接口,所以我们需要使用一个 RS232/RS485的转换器,DB9 接口连接 PC 机,RS485 总线接口连接我们开发板上 RS485 模块的 A 和 B。RS232/RS485 转换器如下图所示:

只要配置好 F28335 的 SCIB 串口即可实现 RS485 通信,SCI 串口配置与前面 RS232 串口通信章节是一样的。
硬件电路:本次在F28379D芯片外围集成一个 RS485 模块,采用SCIB端口,开发板上 RS485 模块电路,如下图所示:
从上图中可以看出,RS485 收发芯片的串口通信管脚以及发送接收选择管脚接在 F28335 芯片的 GPIO18、GPIO19 和 GPIO61 上,芯片的 RS485 输出管脚 A、B接到 P3 端子上(这里我们换成F28379D的SCIB的两个复用引脚和一个空闲GPIO引脚)。图中的 R23 电阻为匹配电阻,大小为 120 欧。图中另外 2 个电阻 R21 和 R27 为偏置电阻,用来保证总线空闲时,A、B 之间的电压差都会大于 2V(逻辑 1),从而避免因总线空闲时,A、B 压差不定,引起逻辑错乱导致出现乱码。
使用过程中需要使用 2 根导线将开发板上 485 模块的 A 和 B 与RS232/RS485 转换器的 A 和 B 对应连接,这里一定要注意不能交叉,否则通信异常。
RS485软件程序部分和第3节配置一样。

5.参考文献

以上学习借鉴了顾卫钢老师的《手把手教你学DSP——基于TMS320X281x》第三版;

普中科技技术有限公司的《普中 DSP28335 开发攻略》;

上面讲的更清楚,想学习DSP的小伙伴可以参考一下!!!

本文到这就结束了,若上述有问题请多多指教,本人也是刚开始学习DSP,多多讨论有助于我们的共同成长,感谢大家。

  • 26
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值