admin管理员组

文章数量:1544740

【USART串口】

         全双工、异步通讯方式.。接下来说单片机中最常用的USART串口,USART串口的协议相比于I2C要简单很多,它没有地址的概念,也没有主设备、从设备的区别,用户可以自己定义地址和主从,不定义也可以,完全自由开放。正因为USART本身的协议简单,硬性规定少,所以它有很好的扩展性。如【图3】所示,USART串口可以有3种常用的通信方式。最基本的是TTL电平直接连接,多用于单片机与带有USART串口的模块通信。比如WIFI模块、GPS模块、蓝牙模块都支持USART串口。另外它还常用于单片机与电脑的通信,今后我们要用电脑给单片机下载程序,就是通过USART串口。

        还有一种基于USART串口的扩展接口,叫RS232。它用于工业控制类设备的通信接口,常见于电脑和工控设备之间的通信。比如电脑与PLC(工控常用的可编程控制器)之间的通信就是RS232。RS232接口并没有改变USART串口的协议规范,而是通过专用的RS232转换芯片,把TTL的5V电平转换成了正负12V电平。因为电平电压的升高,通信的距离和稳定性都有所提高。RS232的连接线可达20米长,在干扰众多的工业场合使用依然稳定。但是随着工业技术的发现,20米的距离已经满足不了需要,于是市场上又出来了性能更好的RS485接口。

        RS485的通信线长度可达1000米,而且传输速度还要比RS232快很多。虽然RS232和RS485都可以挂接多个设备,可是因为RS232的通信距离太短,20米的距离内挂多个设备的意义不大。所以RS232多用于一对一通信,而RS485被用于多个设备挂接的总线,当然也可以一对一通信。

        RS485的应用非常广泛,高层住宅和商场里的电梯直梯就是用RS485连接各楼层,控制叫梯和显示楼层信息。是属于非常成熟的通信接口之一。但不论如何,RS232和RS485的协议还是USART,本质上是一个功能的不同扩展。STM32单片机内部只有支持USART协议的TTL电平的接口,如果想使用RS232或RS485需要外接一个芯片才能实现。【图3】所示是USART串口的三种通信形式。

        STM32F103单片机上有3个USART串口,都支持DMA功能。其中USART1的速度可达4.5MB/S,其他可达2.5MB/S,算是相当快的速度。在8051单片机中也有一种叫UART的串口,少了一个S,它们是什么关系呢?其实USART的全称是同步/异步收发器,而UART是异步收发器,它们之间差了一个“同步”,USART接口比UART多了一个“USART_CK”的同步时钟线,可以同步时钟通信,但这个功能很少用到,所以它们在应用上并没有什么差别。

【图3】USART串口电路连接示意图

 

 

RS-232、RS422 和 RS-485 区别

一、串口简介
        RS-232、RS-422 与 RS-485 都是串行数据接口标准,最初都是由电子工业协会(EIA)制订并发布的,RS-232 在1962 年发布,命名为 EIA-232-E,作为工业标准,以保证不同厂家产品之间的兼容。RS-422 由 RS-232 发展而来,它是为弥补 RS-232 之不足而提出的。为改进 RS-232 通信距离短、速率低的缺点,RS-422 定义了一种平衡通信接口,将传输速率提高到 10Mb/s,传输距离延长到 4000 英尺(速率低于 100kb/s 时),并允许在一条平衡总线上连接最多 10 个接收器。RS-422 是一种单机发送、多机接收的单向、平衡传输规范,被命名为 TIA/EIA-422-A 标准。为扩展应用范围,EIA 又于 1983 年在 RS-422 基础上制定了 RS-485标准,增加了多点、双向通信能力,即允许多个发送器连接到同一条总线上,同时增加了发送器的驱动能力和冲突保护特性,扩展了总线共模范围,后命名为 TIA/EIA-485-A 标准。由于 EIA 提出的建议标准都是以“RS”作为前缀,所以在通讯工业领域,仍然习惯将上述标准以 RS 作前缀称谓。

        RS-232、RS-422 与RS-485 标准只对接口的电气特性做出规定,而不涉及接插件、电缆或应用层通信协议,在此基础上用户可以建立自己的高层通信协议。因此在视频界的应用,许多厂家都建立了一套高层通信协议,或公开或厂家独家使用。如录像机厂家中的Sony 与松下对录像机的 RS-422 控制协议是有差异的,视频服务器上的控制协议则更多了,如 Louth、Odetis协议是公开的,而ProLINK 则是基于 Profile 上的。

二、RS-232 串行接口标准
        目前 RS-232 是 PC 机与通信工业中应用最广泛的一种串行接口。RS-232 被定义为一种在低速率串行通讯中增加通讯距离的单端标准。RS-232 采取不平衡传输方式,即所谓单端通讯。
        收、发端的数据信号是相对于信号地,如从 DTE 设备发出的数据在使用 DB25 连接器时是 2 脚相对 7 脚(信号地)的电平。典型的 RS-232 信号在正负电平之间摆动,在发送数据时,发送端驱动器输出正电平在+5~+15V,负电平在-5~-15V 电平。当无数据传输时,线上为 TTL,从开始传送数据到结束,线上电平从 TTL 电平到 RS-232 电平再返回 TTL 电平。接收器典型的工作电平在+3~+12V 与-3~-12V。由于发送电平与接收电平的差仅为 2V至 3V 左右,所以其共模抑制能力差,再加上双绞线上的分布电容,其传送距离最大为约 15米,最高速率为 20kb/s。RS-232 是为点对点(即只用一对收、发设备)通讯而设计的,其驱动器负载为 3~7kΩ。所以RS-232 适合本地设备之间的通信。其有关电气参数参见下表。

三、RS-422 与 RS-485 串行接口标准

1. 平衡传输
       RS-422、RS-485 与 RS-232 不一样,数据信号采用差分传输方式,也称作平衡传输,使用一它对双绞线,将其中一线定义为 A,另一线定义为 B。通常情况下,发送驱动器A、B 之间的正电平在+2~+6V,是一个逻辑状态,负电平在-2~6V,是另一个逻辑状态。另有一个信号地C,在RS-485 中还有一“使能”端,而在RS-422中这是可用可不用的。“使能”端是用于控制发送驱动器与传输线的切断与连接。当“使能”端起作用时,发送驱动器处于高阻状态,称作“第三态”,即它是有别于逻辑“1”与“0”的第三态。
       接收器也作与发送端相对的规定,收、发端通过平衡双绞线将A-A 与B-B 对应相连,当在收端AB 之间有大于+200mV 的电平时,输出正逻辑电平,小于-200mV 时,输出负逻辑电平。接收器接收平衡线上的电平范围通常在200mV 至6V 之间。

2.RS-422 电气规定
        RS-422 标准全称是“平衡电压数字接口电路的电气特性”,它定义了接口电路的特性。实际上还有一根信号地线,共5 根线。由于接收器采用高输入阻抗和发送驱动器比RS232更强的驱动能力,故允许在相同传输线上连接多个接收节点,最多可接10 个节点。即一个主设备(Master),其余为从设备(Salve),从设备之间不能通信,所以RS-422 支持点对多的双向通信。接收器输入阻抗为4k,故发端最大负载能力是10×4k+100Ω(终接电阻)。RS-422 四线接口由于采用单独的发送和接收通道,因此不必控制数据方向,各装置之间任何必须的信号交换均可以按软件方式(XON/XOFF 握手)或硬件方式(一对单独的双绞线)实现。
        RS-422 的最大传输距离为4000 英尺(约1219 米),最大传输速率为10Mb/s。其平衡双绞线的长度与传输速率成反比,在100kb/s 速率以下,才可能达到最大传输距离。只有在很短的距离下才能获得最高速率传输。一般100 米长的双绞线上所能获得的最大传输速率仅为1Mb/s。
        RS-422 需要一终接电阻,要求其阻值约等于传输电缆的特性阻抗。在矩距离传输时可不需终接电阻,即一般在300 米以下不需终接电阻。终接电阻接在传输电缆的最远端。
RS-422 有关电气参数见表 1

3.RS-485 电气规定
       由于RS-485 是从RS-422 基础上发展而来的,所以RS-485 许多电气规定与RS-422 相仿。如都采用平衡传输方式、都需要在传输线上接终接电阻等。RS-485 可以采用二线与四线方式,二线制可实现真正的多点双向通信。而采用四线连接时,与RS-422 一样只能实现点对多的通信,即只能有一个主(Master)设备,其余为从设备,但它比RS-422 有改进,无论四线还是二线连接方式总线上可多接到32 个设备。
        RS-485 与RS-422 的不同还在于其共模输出电压是不同的,RS-485 是-7V 至+12V 之间,而RS-422 在-7V 至+7V 之间,RS-485 接收器最小输入阻抗为12k,RS-422 是4k;RS-485满足所有RS-422 的规范,所以RS-485 的驱动器可以用在RS-422 网络中应用。
RS-485 有关电气规定参见表1。
        RS-485 与RS-422 一样,其最大传输距离约为1219 米,最大传输速率为10Mb/s。平衡双绞线的长度与传输速率成反比,在100kb/s 速率以下,才可能使用规定最长的电缆长度。只有在很短的距离下才能获得最高速率传输。一般100 米长双绞线最大传输速率仅为1Mb/s。

        RS-485 需要2 个终接电阻,其阻值要求等于传输电缆的特性阻抗。在矩距离传输时可不需终接电阻,即一般在300 米以下不需终接电阻。终接电阻接在传输总线的两端。

 

RS-485 通讯协议(自定义应用层协议)

        RS-485 标准只对接口的电气特性做出规定,而不涉及接插件、电缆或协议;因此,用户需要在RS-485 应用网络的基础上建立自己的应用层通信协议。由于RS-485 标准是基于PC 的UART 芯片上的处理方式,因此,其通讯协议也规定了串行数据单元的格式(8-N-1 格式):1 位逻辑0 的起始位,6/7/8 位数据位,1 位可选择的奇ODD)/偶(EVEN)校验位,1/2 位逻辑1 的停止位。

        下面将分别对ModBus 协议(RTU 模式)、多功能电能表通讯规约(DL/T645-1997)进行简单介绍,便于大家对应用层通信协议有一个基本的概念与理解
1.4.1 ModBus 协议(RTU 模式)
        以下资料摘录于Modbus 协议(RTU 模式)的一部分,介绍了Modbus RTU 协议的基本构成、主要特点、参数规定;便于我们理解一个通讯协议的基本模式与要求。关于详细的ModBus 协议,用户可以从ModBus-IDA 协会 (www.modbus) 网站下载具体的内容。

1. 查询—响应周期
ModBus 协议遵循“查询—响应”模式,如图 1-23 所示。
􀂾 查询:
        查询消息中的功能代码告之被选中的从设备要执行何种功能。数据段包含了从设备要执行功能的任何附加信息。例如功能代码03 是要求从设备读保持寄存器并返回它们的内容。数据段必须包含要告之从设备的信息:从何寄存器开始读及要读的寄存器数量。错误检测域为从设备提供了一种验证消息内容是否正确的方法。
􀂾 响应
        如果从设备产生一正常的响应,在响应消息中的功能代码是在查询消息中的功能代码的响应。数据段包括了从设备收集的资料:象寄存器值或状态。如果有错误发生,功能代码将被修改以用于指出响应消息是错误的,同时数据段包含了描述此错误信息的代码。错误检测域允许主设备确认消息内容是否可用。

2. RTU 模式

        当控制器设为在Modbus 网络上以RTU(远程终端单元)模式通信,在消息中的每个8Bit 字节包含两个4Bit 的十六进制字符。这种方式的主要优点是:在同样的波特率下,可比ASCII 方式传送更多的数据。
        代码系统:
􀁺 8 位二进制,十六进制数0...9,A...F
􀁺 消息中的每个8 位域都是一个两个十六进制字符组成
       每个字节的位:
􀁺 1 个起始位
􀁺 8 个数据位,最小的有效位先发送
􀁺 1 个奇偶校验位,无校验则无
􀁺 1 个停止位(有校验时),2 个Bit(无校验时)
        错误检测域:
􀁺 CRC(循环冗长检测)

3. RTU 帧
        使用RTU 模式,消息发送至少要以3.5 个字符时间的停顿间隔开始。在网络波特率下多样的字符时间,这是最容易实现的(如图 1-24 的T1-T2-T3-T4 所示)。传输的第一个域是设备地址。可以使用的传输字符是十六进制的0...9,A...F。网络设备不断侦测网络总线,包括停顿间隔时间。当第一个域(地址域)接收到,每个设备都进行译码以判断是否发往自己的。在最后一个传输字符之后,一个至少3.5 个字符时间的停顿标定了消息的结束。一个新的消息可在此停顿后开始。
         整个消息帧必须作为一连续的流转输。如果在帧完成之前有超过1.5 个字符时间的停顿,接收设备将刷新不完整的消息并假定下一字节是一个新消息的地址域。同样地,如果一个新消息在小于3.5 个字符时间内开始,接收的设备将认为它是前一消息的延续。这将导致一个错误,因为在最后的CRC 域的值不可能是正确的。一典型的消息帧如下图 1-24 所示:

4. 地址
      地址0 是用作广播地址,以使所有的从设备都能认识。当Modbus 协议用于更高水平的网络,广播可能不允许或以其它方式代替。

5. 响应
       当从设备响应时,它使用功能代码域来指示是正常响应(无误)还是有某种错误发生(称作异议响应)。对正常响应,从设备仅响应相应的功能代码。对异议响应,从设备返回一等同于正常代码的代码,但最重要的位置为逻辑1。
例如:从一个主设备发往从设备的消息要求读一组保持寄存器,将产生如下功能代码:
0 0 0 0 0 0 1 1 (十六进制03H)
对正常响应,从设备仅响应同样的功能代码。对异议响应,它返回:
1 0 0 0 0 0 1 1 (十六进制83H)
        除功能代码因异议错误作了修改外,从设备将一独特的代码放到响应消息的数据域中,这能告诉主设备发生了什么错误。主设备应用程序得到异议响应后,典型的处理过程是重发消息,或者诊断发自从设备的消息并报告给操作员。
        从主设备发给从设备消息的数据域包含附加的信息:从设备必须用于进行执行由功能代码所定义的行为。这包括了象不连续的寄存器地址,要处理项的数目,域中实际数据字节数。
        例如,如果主设备需要从设备读取一组保持寄存器(功能代码03),数据域指定了起始寄存器以及要读的寄存器数量。如果主设备写一组从设备的寄存器(功能代码10 十六进制),数据域则指明了要写的起始寄存器以及要写的寄存器数量,数据域的数据字节数,要写入寄存器的数据。
        关于详细的ModBus 协议,用户可以从ModBus-IDA 协会 (www.modbus) 网站下载具体的协议内容。

自定义协议可参考通讯帧格式:

RS-485参考电路:

RE引脚:  接收器输出使能(低电平有效)。DE引脚: 发送器输出使能(高电平有效)。可以直接通过MCU的IO端口控制。

 

【I2C总线】

        I2C总线(读做“I方C”或“I2C”)是飞利浦公司发布了一款通信总线标准。所谓总线是指在一线数据线上同时并联多个设备,设备是指连接在通信线上的芯片或模块。在I2C总线上的设备分为主设备和从设备,每一组I2C总线上只能有1个主设备,主设备是主导通信的,它能主动读取各从设备上的数据。而从设备只能等待主设备对自己读写,如果主设备无操作,从设备自已不能操作总线。I2C总线理论上可挂接几百个从设备,每个从设备都有一个固定的7位或10位从设备地址,相当于身份证号码。主机想读写哪个从设备就向所有从设备发送一个从设备地址,只有号码一致的从设备才会回应主设备。

        如【图2】所示,STM32单片机在I2C总线上是主设备,3个I2C设备即是从设备。I2C总线由SCL和SDA两条数据线构成,SCL是总线的时钟线,用于主设备与从设备之间的计数同步。SDA是总线的数据线,用于收发数据。另外主设备和从设备都必须共地(GND连在一起)。I2C总线的通信速度分3档,低速模式可达100KHz,快速模式可达400KHz,高速模式可达3.4MHz。但是在实际使用中I2C在快速和高速模式下都不稳定,经常出现总线出错卡死的问题。所以目前I2C总线主要应用在单片机周边芯片或模块的低速通信,也就是近距离低速通信。I2C的优点是协议简单易学,相关的芯片模块成本低,在只占用2个IO端口的情况下可挂接上百个从设备。目前有很多EEPROM存储器、温度传感器、RTC时钟、气压传感器等都使用I2C总线做通信接口。

        STM32F103单片机内部有2个I2C总线控制器,都支持DMA功能。在硬件上完成了I2C的通信协议,用户只需要在指定的I2C寄存器中写入从设备的地址和要读写的数据就行了,余下的工作自动完成。经过我实验测试,STM32硬件I2C总线工作在100KHz以下时,通信非常稳定,当大于100KHz就会出现错误。但这个速度已经够用了,如果你需要高速通信,那还是要换用SPI总线。关于I2C的通信时序与编程方法,我会在后面讲到编程开发再细讲。

【图2】I2C总线电路连接示意图

 

物理层

(1) 它只使用两条总线线路,一条双向串行数据线(SDA) ,一条串行时钟线 (SCL)。
(2) 每个连接到总线的设备都有一个独立的地址,主机可以利用这个地址进行不同设备之间的访问
(3) 多主机同时使用总线时,为了防止数据冲突,会利用仲裁方式决定由哪个设备占用总线。
(4) 具有三种传输模式:标准模式传输速率为100kbit/s ,快速模式为400kbit/s ,高速模式下可达 3.4Mbit/s,但目前大多I2C设备尚不支持高速模式。
(5) 片上的滤波器可以滤去总线数据线上的毛刺波 保证数据完整 。
(6) 连接到相同总线的 IC 数量受到总线的最大电容 400pF 限制 。

协议层
       I2C的协议包括起始和停止条件、数据有效性、响应、仲裁、时钟同步和地址广播等环节,由于我们使用的是STM32集成的硬件I2C接口,并不需要用软件去模拟SDA和SCL线的时序,所以野火直接以I2C通讯的流程为大家讲解。见图 12-2 主机写数据到从机。


                                                              图 12 -2 主机 写数据到从机 

                                                                     图 12 -3 主机由从中读数据 


图例:

  数据由主机传输至从机:                    S : 传输开始信号        SLAVE_ADDRESS: 从机地址  
      数据由从机传输至主机  :                 R/W ——: 传输方向选择位,1为读,0为写

                                                                                A/A —— : 应答或非应答信号                P : 停止传输信号
        这两幅图表示的是主机和从机通讯时,SDA线的数据包序列。其中S表示由主机的I2C接口产生的传输起始信号(S),这时连接到I2C总线上的所有从机都会接收到这个信号。
       起始信号产生后,所有从机就开始等待主机紧接下来广播 的从机地址信号 (SLAVE_ADDRESS),在I2C总线上,每个设备的地址都是唯一的。当主机广播的地址与某个设备地址相同时,这个设备就被选中了,没被选中的设备将会忽略之后的数据信号。根据I2C协议,这个从机地址可以是7位或10位。
        在地址位之后,是传输方向的选择位,该位为0时,表示后面的数据传输方向是由主机传输至从机。该位为1时,则相反。
从机接收到匹配的地址后,主机或从机会返回一个应答(A)或非应答(A——)信号,只有接收到应答信号后,主机才能继续发送或接收数据。
        若配置的方向传输位为写数据,广播完地址,接收到应答信号后,主机开始正式向从机传输数据(DATA),数据包的大小为8位,主机每发送完一个数据,都要等待从机的应答信号(A),重复这个过程,可以向从机传输N个数据,这个N没有大小限制。当数据传输结束时,主机向从机发送一个停止传输信号(P),表示不再传输数据。
        若配置的方向传输位为读数据,广播完地址,接收到应答信号后,从机开始向主机返回数据(DATA),数据包大小也为8位,从机每发送完一个数据,都会等待主机的应答信号(A),重复这个过程,可以返回N个数据,这个N也没有大小限制。当主机希望停止接收数据时,就向从机返回一个非应答信号(A——),则从机自动停止数据传输。

 

 

【SPI总线】

           SPI和I2C一样是一种总线。SPI总线也有主设备和从设备之分,单片机是主设备,各种周边芯片是从设备。SPI和I2C一样是板级总线,也就是只能在PCB板上近距离通信,而不能引出导线到较远的距离。SPI最大的优势是有很高的通信速度,而且在高速下还能稳定工作,这是I2C所不能的。之所以SPI有如此的速度优势,正是因为其没有采用地址的概念,不在通信数据里放入地址信息,而是使用硬件来选择总线上的设备。每个SPI从设备都有一条开关控制线与主设备(单片机)独立连接(【图4】中的CS线)。当主设备想与哪个从设备通信时,只要开启那个从设备的开关控制线,总线上就只有这个设备是开启的,总线变成了一对一通信。正是用硬件选择从设备才让SPI的协议简单、速度飞快。

        SPI速度快的另一个原因是全双工,同步通讯。全双工的意思是总线在通信时能同时收发数据。而I2C总线是半双工,即不能同时收发。如果把总线通信比喻成两人对话,半双工状态就是我说你听,或者你听我说,同一时间只有一人在说。全双工状态就是两个人同时说话,又同时听对方讲话。这样的对话效率要高很多,只可惜人脑没有这么快的反应,生活中也看不到这样的对话。但是单片机能全双工,所以全双工的SPI在速度上很难被其他总线超越。

        STM32F103单片机上有2个SPI总线,最大速度可达18MB/S,而且还支持DMA功能和SD卡读写功能。我们常见的SD卡(或TF卡)都支持SPI模式,可以用SPI总线直接读写卡上数据。SPI总线在高速通信上有非常大的优势,只可惜受到控制从设备的I/O端口数量的限制,总线上不能挂接太多从设备。持讲到SPI编程开发时,再对其使用性能做进一步讲解吧。

【图4】SPI总线电路连接示意图

 

 

 

        SPI协议(Serial Peripheral Interface),即串行外围设备接口,是一种高速全双工的通信总线,它由摩托罗拉公司提出,当前最新的为V04.01-2004版。它被广泛地使用在ADC、LCD等设备与MCU间通讯的场合。

        SPI总线包含4条总线,分别为S——S——、SCK、MOSI、MISO。它们的作用介绍如下:
(1) S——S—— ( Slave Select):片选信号线,当有多个SPI设备与MCU相连时,每个设备的这个片选信号线是与MCU单独的引脚相连的,而其它的SCK、MOSI、MISO线则为多个设备并联到相同的SPI总线上,见图 13-1。当S——S——信号线为低电平时,片选有效,开始SPI通讯。

(2) SCK (Serial Clock):时钟信号线,由主通讯设备产生,不同的设备支持的时钟频率不一样,如STM32的SPI时钟频率最大为fpclk/2。

(3) MOSI (Master Output, Slave Input):主设备输出/从设备输入引脚。主机的数据从这条信号线输出,从机由这条信号线读入数据,即这条线上数据的方向为主机到从机。
(4) MISO(Master Input, Slave Output):主设备输入/从设备输出引脚。主机从这条信号线读入数据,从机的数据则由这条信号线输出,即在这条线上数据的方向为从机到主机。

 


 

SPI模式
根据SPI时钟极性(CPOL)和时钟相位(CPHA) 配置的不同,分为四种SPI模式。


        时钟极性是指SPI通讯设备处于空闲状态时(也可以认为这是SPI通讯开始时,即S——S——线为低电平时),SCK信号线的电平信号。CPOL=0时, SCK在空闲状态时为低电平,CPOL=1时,则相反,即SCK在空闲状态时为高电平。
        时钟相位是指数据的采样的时刻,当CPHA=0时,MOSI或MISO数据线上的信号将会在SCK时钟线的奇数边沿被采样。当CPHA=1时,数据线在SCK的偶数边沿采样。见图 13-2

 

我们来分析这个CPHA=0的时序图。
首先,由主机把片选信号线S——S——拉低,即为图中的S——S——(O)时序,意为主机输出,S——S——(I)时序实际上也是S——S——线信号,S——S——(I)时序表示从机接收到S——S——片选被拉低的信号。
在S——S——被拉低的时刻,SCK分为两种情况,若我们设置为CPOL=0,则SCK时序在这个时刻为低电平,若设置为CPOL=1,则SCK在这个时刻为高电平。
无论CPOL=0还是=1,因为我们配置的时钟相位CPHA=0,在采样时刻的时序中我们可以看到,采样时刻都是在SCK的奇数边沿(注意奇数边沿有时为下降沿,有时为上升沿)。
因此,MOSI和MISO数据线的有效信号在SCK的奇数边沿保持不变,这个信号将在SCK奇数边沿时被采集,在非采样时刻,MOSI和MISO的有效信号才发生切换。
对于CPHA=1的情况也很类似,但数据信号的采样时刻为偶数边沿,其时序图见图 13-3。

使用SPI协议通讯时,主机和从机的时序要保持一致,即两者都选择相同的SPI模式。

根据FLASH的存储原理,在写入数据前,要先对存储区域进行擦除。

 

【CAN总线】

        CAN总线是一种工业控制、汽车电子上常用的高级总线,之所以说它高级是因为CAN总线的功能复杂且智能。【图5】所示是CAN总线的电路连接示意图,CAN总线只需要两条导线,理论上可以连接无限多的设备,每一个设备即可做主设备也可做从设备。CAN总线的通信距离可达10千米(速率低于5Kbps),速度可达1MbpS(通信距离小于40M)。听上去好像速度照SPI的18MB/S差很远,但CAN是远程通信,1MB/S已经很优秀了。另外,CAN总线的功能也很强大,当总线上的某个设备损坏时,总线可以把这个设备从总线上断开。在我看来,CAN总线算是RS485总线的升级版,RS485是开放的、原始的底层协议,虽然简单但功能太少。CAN总线在加入了区分总线上设备的标识附概念,也加入了更复杂的协议规范。这让用户在使用CAN时更方便了,不用自己设计总线地址之类的事情。所以CAN总线的工作很稳定,在汽车行业中被用于车内各电子设备的通信。

        STM32F103单片机有1个CAN总线接口,但必须外加一片CAN收发器芯片(用于电平转换)才能正常使用。由于CAN总线的知识太多也太复杂,所以这里不能讲解太多,有兴趣的朋友可以自己研究,未来讲到CAN总线通信编程开发的时候还会细讲。

   【图5】CAN总线电路连接示意图

 

       CAN是控制器局域网络(Controller Area Network, CAN)的简称,是由研发和生产汽车电子产品著称的德国BOSCH公司开发的,并最终成为国际标准(ISO11519)。是国际上应用最广泛的现场总线之一。

18.1.1. 物理层
与I2C、SPI等具有时钟信号的通讯方式不同,CAN通讯并不是以时钟信号来进行同步的。它只具有CAN_High和CAN_Low两条信号线,共同构成一组差分信号线,所以CAN是以差分信号的形式进行通讯的。见图 18-1。


                                               图18 1 CAN 闭环总线通讯网络
        图中的CAN通讯网络是遵循ISO11898标准的高速、短距离闭环网络,它的总线最大长度为40m,通信速度最高为1Mbps。还有一种是遵循ISO11519-2标准的低速远距离开环网络,它最大传输距离为1km,最高通讯速率为125kbps。
        从CAN的通讯网络图可以了解到, 它的通讯节点由一个CAN控制器,CAN收发器组成。如STM32的CAN接口即为CAN控制器,为了构成完整的节点,还要给它外接一个CAN收发器。
        在发送数据时, CAN控制器把要发送的二进制编码通过CAN_Tx线发送到CAN收发器,然后由收发器把这个普通的逻辑电平信号转化成差分信号,通过差分线CAN_High和CAN_Low线输出到CAN总线网络。在接收数据时,这个过程相反。

        差分信号是什么意思呢?即信号的逻辑0和逻辑1由两根差分信号线的电压差来表示。ISO 11898规定CAN协议中的逻辑1 (隐性电平)时,CAN_High和CAN_Low线上的电压均为2.5v,即它们的电压差Vh-Vl=0V。而在逻辑0(显性电平)中,CAN_High的电平为3.5V,CAN_Low线的电平为1.5V,即它们的电压差为Vh-VI=2V。
        如当CAN收发器从CAN_Tx线接收到来自CAN控制器的低电平信号时,它会将该信号转化,使CAN_High输出3.5V,同时CAN_Low输出1.5V,即显性电平。如同串口中的MAX3232,用作电平转换。CAN收发器的作用则是用作差分信号的转换。
         在CAN总线中,必须处于隐性电平(逻辑1)或显性电平(逻辑0)中的一个状态。假如有两个CAN通讯节点,在同一时间,一个输出隐性电平,另一个输出显性电平,总线的“线与”特性将使它处于显性电平状态,即可以认为显性具有优先的意味。

CAN参考电路图(120R为终端匹配电阻,首末节点加上即可)

 

【USB接口】

       USB接口是大家再熟悉不过的了,所有的电脑上都会有至少1个USB接口,因为USB接口正是为电脑与周边设备通信而设计的。比如U盘、鼠标、打印机。而STM32F103单片机上有1个USB 2.0接口,它被定义为USB从设备,也就是说它只能用来与电脑连接来做电脑周边设备,比如用STM32做鼠标或打印机。USB虽然不是总线,但它和CAN总线一样都有底层非常复杂的通信协议,但在用户使用层面上又变得较简单。【图6】是USB接口的电路连接示意图,从中可以看出USB有2条数据线,另外还有2条电源线,可以由电脑端给USB设备(单片机)供电。USB接口与之前讲到的USART串口都能与电脑通信,可是USB接口有明确的主从关系,单片机只能做为电脑的从设备。而USART串口的通信上没有主从关系,电脑与单片机的通信是平等的,任何一方都能主动发出数据。

【图6】USB接口电路连接示意图

 

 

 

 

【CRC校验和芯片ID】

 

说完了通信功能,再补充两个附加功能。它们是CRC校验和芯片ID。CRC校验是一种用于数据校对的计算器。上面讲过的所有通信功能都可以使用CRC功能。CRC能验证通信过程中的数据有没有出现错误。要知道任何通信在过程中都可能出现错误。接收端要怎么判断收到的数据是没有错误的呢?最简单的方法是接收端把数据原原本本地再发回给发送端,如果接收端发回的数据与发送端发出的数据完全一致,那就表示数据正确。可惜这种方法太麻烦了,每一组数据都要来回发2次,浪费了时间降低了速度。于是开发者们研究出一种算法,它能把一组数据按一个公式计算得出一个短小的值,这种算法就是CRC。接收端只要比对这个值是否正确,就能判断整组数据的正确性。

 

【图7】所示是STM32F103单片机的CRC校验应用原理示意图。通过这张图能很快理解CRC的工作过程。设备1是数据发送端,它在发出数据之前先把这组数据分解成每32位一组送入到CRC功能。当整组数据依次放入后,CRC就会得出一个32位的计算结果。这时设备1再把整组数据和这个CRC结果一同发送给设备2,设备2再把整组数据通过自己的CRC功能进行计算,也会得到一个结果。然后设备2再把自己CRC结果与设备1发来的CRC结果进行比较,一致则表示数据正确。CRC校验虽然也有可能出现错误,但这种错误的概率非常微小。CRC校验功能常被用在对数据正确性要求很高的地方,比如射频卡、无线通信。

 

芯片ID功能说起来非常简单,就是每一片STM32单片机内部都有一组96位(二进制)全球唯一的序列号。它就像每个人的身份证号码一样,是唯一的。别小看这组ID序列号,它的做用可不小。用户可以用它来当做自己产品的序列号,而不需要再单独设计。它能作为一种加密方法,还能防止用户的程序被复制到其他芯片上运行。日后我们用到的时候再来细讲。

 

【图7】CRC校验应用原理示意图

 

 

【功能总结】

 

至此我们讲完了STM32F103单片机数据手册第1页上所有的内部功能。我们了解了每个功能的特性和用途,可是各功能之间又是什么关系?它们是怎么联系在一起的呢?这就需要用全局的角度回看所学的知识。【图8】是在数据手册中的一张单片机内部功能关系框图,【图9】是我加入了中文说明的关系图,大家可以对照这两张图来看。图中用方框列出了各功能,并用空心箭头连接它们。单片机内部功能是通过内部总线连接的,内部总线不同与上文讲过的通信总线,内部总线只用于内部功能之间的通信。而所有内部功能又根据它们的特性被分别连接在不同性能的内部总线上。例如GPIO、TIM1、SPI1、USART、ADC这种需要高速操作的功能都被连接在APB2高速内部总线上(图左下方),一些对操作速度要求不高的功能被连接在APB1低速内部总线上(图右下方)。另外ARM内核与FLASH、SRAM的关系更密切,它们有专用的内部总线彼此连接。【图9】当中有叹号的部分是让大家注意灰色背景处的电源特性。标有VDD的是逻辑电源供电,VDDA的是模拟电源供电,VBAT的是备用电池供电。【图9】还用不同的方框颜色区分核心功能(红色)、重要功能(绿色)、通信功能(蓝色)。图中紫色的方框表示内部总线。

 

仔细研究这张框图,彻底了解所有内部功能之间的关系,可以帮助我们清晰地认识这款单片机,再学习某些知识时会有更深刻的理解和记忆。下一讲开始,我们将介绍STM32单片机的实践操作部分,会讲到开发环境的建立、固件库的安装、ISP程序下载等一系列内容。但还是请大家认真地复习理论知识,基础决定上层建筑,理论是打基础的过程,不要忽略。

 

【图8】STM32F10x的功能关系框图

 

 

【图9】加入注释的功能关系框图

 

 

 

本文标签: 总线USARTusbspiI2C