我是靠谱客的博主 隐形电灯胆,最近开发中收集的这篇文章主要介绍串行通信接口SCI图解SCI模块总览SCI模块架构数据帧格式多机通信空闲线多机通信模式地址位多机通信模式SCI通信格式,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

结合DSP的SCI章节,详细讲解SCI通信原理。

参考资料:

TMS320F28xx 技术参考手册:Serial Communications Interface (SCI)

SCI模块总览

说明:

  • SCI模块有两路时钟输入(图中红色箭头)。一路是工作时钟(SYSCLK),另一路是位时钟,用于产生波特率时钟。位时钟来源于系统低速外设时钟(LSPCLK),并由外设时钟控制寄存器控制(PCLKCR7)。工作时钟频率比位时钟要高得多,要不然怎么能够对每一个bit通信位进行多次检测呢? (有些单片机里为了滤波,对接收到的数据位进行3次检测,以2次或以上的检测结果决定最终是高电平还是低电平)
  • SCI模块对外只有一对管脚接口,即RXD和TXD
  • SCI模块有两个中断信号送至PIE模块:接收中断RXINT和发送中断TXINT

SCI模块架构

 分为以下几个部分。

波特率发生器

相关寄存器:PCLKCR7、SCIHBAUD、SCILBAUD。

功能:低速外设时钟LSPCLK通过BAUD寄存器的配置,产生合适的波特率。分别送给接收模块和发送模块。

 帧格式

用于确定通信帧的格式:是否校验。如果是,是奇校验还是偶校验。

注:这里的“帧Frame”指的是一个字节完整的接收(或者发送)的过程,包括:起始位、数据位、地址位、校验位、停止位。

串行发送

 说明:

  • 最上面的TXSHF是串行移位器,即把一个字节的N个位通过移位的方式,把它从TXD上发送发去。
  • 发送数据是由发送使能(TXENA = SCICTL1.1)决定的
  • 要发送的数据先写入到SCITXBUF中
  • FIFO使能位SCIFFENA决定TXBUF中的数据是直接写入TXSHF还是先保存到FIFO中
  • 发送中断源有3个:
  1. TXEMPTY:所有数据都已经移位输出,TXSHF为空
  2. TXRDY:TXBUF为空,可以往里面放数据。由发送中断使能位TXINTENA控制。
  3. 发送FIFO中断:由FFTX寄存器中的TXFFIENA和TXFFIL控制。TXFFIENA是中断使能,TXFFIL是中断级别。当TXFIFO中的数据数量小于或者等于TXFFIL的值时产生中断,表示现在TXFIFO有空余,可以继续往里面写数据了。

串行接收

 说明:

自动波特率检测

 接收使能

控制是否从RXD管脚上接收数据,并送入到RXBUF。

 接收FIFO

 也是由FFENA使能位控制。不使能时,收到的数据直接送给RXBUF;使能后,先送到FIFO中缓存。

错误检测和中断逻辑

 检测以下错误和状态:

  • 帧错误FE:未检测到停止位
  • OVERRUN错误OE:RXFIFO已满又接收到数据。此时,RXBUF中的数据被覆盖。
  • 校验错误PE:校验位不对
  • 检测到break信号。

关于串口通信中的break信号:

uart协议中有break 规定:
Break character is interpreted on receiving “0”s for a frame period. At the end of the
break frame the transmitter inserts either 1 or 2 stop bits (logic “1” bit) to acknowledge the
start bit.

 

串口有一个 break 信号:正常情况下,安静的 UART 信号应该是高电平;如果连续低电平超过一个字符长度,这就叫做一个 break 信号。

接收中断源有以下4个:

  1. 收到数据RXRDY:表示RXBUF中已经有数据了
  2. 接收错误中断RXERROR:上述3种错误以及break状态,“或”的结果送给RXERROR,再经过使能位RXERRINTENA送给中断逻辑;
  3. 接收FIFO中断:当RXFIFO中的数据大于或者等于RXFFIL的数值时,表示已经收到部分数据,可以通知CPU去读取。
  4. 接收FIFO溢出RXFFOVF。

发送唤醒

多机通信时用到。 

数据帧格式

有两种典型的数据帧:

  • 空闲线模式:以通信线上一段时间的空闲为标志,区分不同的数据块。
  • 地址位模式:数据帧中多了一个位:数据/地址位。0代表是数据字节,1表示是寻址字节。

其他的都相同:一个完整的数据帧包括1个起始位,N个数据位(最低有效位在前,最高有效位在后),0个或者1个校验位,1个停止位。

平时没有数据通信的时候,通信线为高电平(逻辑1),起始位为低电平,停止位为高电平。

多机通信

寻址字节

多机通信中,第1个字节为寻址字节。只有被寻址的设备才需要继续接收余下的数据字节。未被寻址的设备不需要被余下的数据所打断,直到下一个寻址字节。

Sleep位

串行链路上的所有处理器都将 SCI SLEEP 位(SCICTL1 的第 2 位)设置为 1,以便仅在检测到地址字节时才中断它们。 当处理器读取与应用软件设置的 CPU 设备地址相对应的块地址时,程序必须清除 SLEEP 位以启用 SCI 以在接收到每个数据字节时产生中断。

虽然接收器在 SLEEP 位为 1 时仍然工作,但它不会将 RXRDY、RXINT 或任何接收器错误状态位设置为 1,除非检测到地址字节并且接收帧中的地址位为 1(适用于地址 -位模式)。 SCI 不会改变 SLEEP 位; 需要软件更改它。

控制RX和TX

多处理器模式可通过 ADDR/IDLE MODE 位(SCICCR,位 3)通过软件进行选择。 两种模式都使用 TXWAKE 标志位(SCICTL1,bit 3)、RXWAKE 标志位(SCIRXST,bit1)和 SLEEP 标志位(SCICTL1,bit 2)来控制这些模式的 SCI 发送器和接收器功能。

接收顺序

在两种多处理器模式下,接收顺序如下:
1. 在收到地址块时,SCI 端口唤醒并请求中断(必须使能 SCICTL2 的位号 1 RX/BK INT ENA-才能请求中断)。 它读取块的第一帧,其中包含目标地址。
2. 通过中断进入一个中断服务程序并检查输入地址。 该地址字节根据其存储在存储器中的设备地址字节进行检查。
3. 如果检查显示块寻址到设备 CPU,则 CPU 清除 SLEEP 位并读取块的其余部分。 如果不是,则软件例程退出,SLEEP 位仍然设置,并且在下一个块开始之前不接收中断。

空闲线多机通信模式

 说明:

  • 总线上以空闲时间来区分不同的数据块(应用层协议)
  • 数据块内部,每个字节帧的帧间间隔小于10个“位时间”。位时间的长短与波特率相关。
  • 数据块与数据块之间,每个字节帧的帧间间隔为10个“位时间”或者更多。
  • 通常,数据块的第一个字节为地址字节,用于设备之间寻址。

空闲线通信模式的步骤

  1. SCI在接收到数据块起始信号后唤醒
  2. 处理器识别下一个SCI中断
  3. 中断服务程序中比较地址,看接收到的地址是否与本机匹配
  4. 如果匹配,则清除SLEEP位,接收数据块中的其他数据
  5. 如果不匹配,则继续保持SLEEP位。这将让CPU继续执行主循环的程序,而不被串口中断,直到再检测到下一个数据块的开始。

数据块起始信号

  • 发送完一个数据块后,特意等待一段时间,再发送下一个数据块的寻址字节
  • 在写入TXBUF前,将TXWAKE置1.这将发送11个位的空闲状态。
  1. 写1到TXWAKE位
  2. 写一个字的数据到TXBUF。这个字的内容无所谓,只是用于产生空闲状态,启动下一个数据块。
  3. 往TXBUF中写入地址值。

地址位多机通信模式

 说明:

  • 数据块以数据帧中的地址位来区分
  • 数据块中第一个字节帧的地址位为1,表示寻址命令;其他字节帧的地址位为0,表示数据。
  • 字节帧之间的间隔时间没有要求。

通信方法:

  1. SCICCR寄存器中的ADDRIDLE_MODE位(bit3)设置为1,表示选择“地址位模式协议”
  2. 设置SCICTL1.TXWAKE位为1,再往TXBUF中写入地址值。则此时TXD上发送的字节帧中的地址位就是1。TXWAKE位会在传输给WUT位后由硬件清零。
  3. 保持TXWAKE位为0,继续发送其他数据字节。

SCI通信格式

说明:

  • 数据帧中的每个位(比如起始位、数据位等)对应8个SCI模块时钟。
  • 有效的起始位(start bit)需要连续检测到4个低电平。
  • 其他位的检测:在数据位的中间检测3次,然后“投票”确定当前数据位是0还是1 

最后

以上就是隐形电灯胆为你收集整理的串行通信接口SCI图解SCI模块总览SCI模块架构数据帧格式多机通信空闲线多机通信模式地址位多机通信模式SCI通信格式的全部内容,希望文章能够帮你解决串行通信接口SCI图解SCI模块总览SCI模块架构数据帧格式多机通信空闲线多机通信模式地址位多机通信模式SCI通信格式所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(49)

评论列表共有 0 条评论

立即
投稿
返回
顶部