本节介绍STM32F107微控制器的主要片内外设,着重介绍10/100M以太网接口、CAN总线接口和RS485总线接口。
1.功能介绍
STM32F107的以太网模块支持通过以太网收发数据,符合IEEE 802.3-2002标准。STM32F107以太网模块灵活可调,能适应各种不同客户的需求。该模块支持两种标准接口连接到外接的物理层(PHY)模块:IEEE 802.3协议定义的独立于介质的接口(MII)和简化的独立于介质的接口(RMII)。该模块适用于各类应用,如交换机、网络接口卡等。STM32F107以太网模块符合以下标准:
IEEE 802.3-2002标准的以太网MAC协议。
IEEE 1588-2002的网络精确时钟同步标准。
AMBA2.0标准的AHB主/从端口。
RMII协会定义的RMII标准。
2.主要功能
(1)MAC控制器功能
通过外接的PHY接口,支持10/100Mbps的数据传输速率。
通过兼容IEEE 802.3标准的MII接口,外接高速以太网PHY。
支持全双工和半双工操作:
支持符合CSMA/CD协议的半双工操作。
支持符合IEEE 802.3流控的全双工操作。
在全双工模式下,可以选择性地转发接收的PAUSE控制帧到用户的应用程序。
支持背压流控的半双工操作。
在全双工模式下,当输入流控信号失效时,会自动发送PAUSE控制帧。
在发送时插入前导符和帧开始数据(SFD),在接收时去掉这些域。
以帧为单位,自动计算CRC和产生可控制的填充位。
在接收帧时,自动去除填充位/CRC为可选项。
可对帧长度进行编程,支持最长为16KB的标准帧。
可对帧间隙进行编程(40~96位,以8位为单位改变)。
支持多种灵活的地址过滤模式:
多达4个48位完美的目的地址(DA)过滤器,可在比较时屏蔽任意字节。
多达3个48位源地址(SA)比较器,可在比较时屏蔽任意字节。
64位Hash过滤器(可选的),用于多播和单播(目的)地址。
可选的令所有的多播地址帧通过。
混杂模式,支持在进行网络监测时不过滤,允许所有的帧直接通过。
允许所有接收的数据包通过,并附带其通过每个过滤器的结果报告。
对于发送和接收的数据包,返回独立的32位状态信息。
支持检测接收到帧的IEEE 802.1Q VLAN标签。
应用程序有独立的发送、接收和控制接口。
支持使用RMON/MIB计数器(RFC2819/RFC2665)进行强制性的网络统计。
使用MDIO接口对PHY进行配置和管理。
检测LAN唤醒帧和AMD的Magic PacketTM帧。
对IPv4和由以太网帧封装的TCP数据包的接收校验和卸载分流功能。
对IPv4报头校验以及对IPv4或IPv6数据格式封装的TCP、UDP或ICMP的校验和进行检查的高级接收功能。
支持由IEEE 1588-2002标准定义的以太网帧时间戳,在每个帧的接收或发送状态中加上64位的时间戳。
两套FIFO:一个2KB的传输FIFO,带可编程的发送阈值,以及一个2KB的接收FIFO,带可编程的接收阈值(默认值是64B)。
在接收FIFO的EOF后插入接收状态信息,使得多个帧可以存储在同一个接收FIFO中,而不需要另开辟一个FIFO来存储这些帧的接收状态信息。
可以过滤接收的错误帧,并在存储–转发模式下,不向应用程序转发错误的帧。
可以转发“好”的短帧给应用程序。
支持通过产生脉冲来统计在接收FIFO中丢失和破坏(由于溢出)的帧数目。
对于MAC控制器的数据传输,支持存储–转发机制。
根据接收FIFO的填充程度(阈值可编程),自动向MAC控制器产生PAUSE帧或背压信号。
在发送时,如遇到冲突可以自动重发。
在迟到冲突、冲突过多、顺延过多和欠载(underrun)情况下丢弃帧。
软件控制清空发送FIFO。
在存储–转发模式下,在要发送的帧内,计算并插入IPv4的报头校验以及TCP、UDP或ICMP的校验和。
支持MII接口的内循环,可用于调试。
(2)DMA功能
在AHB从接口下,支持所有类型的AHB突发传输。
在AHB主接口下,软件可以选择AHB突发传输的类型(固定的或者不固定长度的突发)。
可以选择来自AHB主接口的地址对齐的突发传输。
优化的DMA传输,传输以帧分隔符为界的数据帧。
支持以字节对齐的方式对数据缓存区寻址。
双缓存区(环)或链表形式的描述符列表。
优先描述符的架构,使得大量的数据传输仅需要介入最小量的CPU时间。
每个描述符可以传输高达8KB的数据。
无论正常传输还是错误传输都有完整的状态信息报告。
可配置的发送与接收DMA突发传输长度,优化总线使用。
可以设置以不同的操作条件产生对应的中断。
每个帧发送/接收完成时产生中断。
通过轮换或固定优先级方式仲裁DMA发送/接收控制器的优先级。
开始/停止模式。
状态寄存器指向当前发送/接收缓存区。
状态寄存器指向当前发送/接收描述符。
(3)PTP功能
设置接收/发送帧的时间戳。
粗调和细调的校正方法。
当系统时间比目标时间大时触发中断。
(通过MCU的复用功能I/O)输出秒脉冲。
3.功能模块描述
以太网模块包括一个符合IEEE 802.3协议的MAC和专用的DMA控制器。以太网模块结构框图如图2.2所示。该模块支持默认的独立于介质的接口(MII)和简化的独立于介质的接口(RMII),可通过AFIO_MAPR寄存器的选择位来选择使用哪个接口。
DMA控制器通过AHB主/从接口,分别访问MAC控制器和存储器。AHB主接口用于控制数据传输,AHB从接口则用于访问控制和状态寄存器(CSR)区域。在MAC控制器发送数据前,DMA会从系统存储区读出数据并存储到发送FIFO中。同样,从总线上收到的以太网帧会存储在接收FIFO中,并由DMA传送到系统存储区。
以太网模块还包括一个站点管理接口(SMI),用于与外接的PHY通信。一组配置寄存器则允许用户配置MAC和DMA控制器,以实现所需要的功能。
(1)站点管理接口(SMI)
站点管理接口(SMI)允许应用程序通过时钟和数据两根线来访问任何的PHY寄存器。这个接口可以支持多达32个PHY。
应用程序可以选择32个PHY中的任意一个,并访问PHY的32个寄存器中的任意一个。但在任意时刻,只能访问一个PHY的一个寄存器。图2.3为SMI接口信号示意图,在控制器内部,MDC时钟线和MDIO数据线都是作为复用(AF)功能的I/O端口:
MDC:一个周期性的时钟信号,为数据的传输提供时钟,最高频率为2.5MHz。MDC信号的高电平和低电平的最小维持时间为160ns,MDC信号的最小周期为400ns。在空闲状态下,SMI接口将驱动MDC时钟信号保持在低电平状态。
MDIO:数据的输入/输出线,在MDC时钟信号的驱动下,向PHY设备传递状态信息。
(2)独立于介质的接口(MII)
独立于介质的接口(MII)用于MAC子层和PHY之间的互联,允许10Mbps和100Mbps数据传输,图2.4为独立于介质的接口(MII)信号线接口示意图,图2.5为MII时钟源与外置PHY接口示意图。
MII_TX_CLK:为传输发送数据而提供连续的时钟信号,对于10Mbps的数据传输,此时钟为2.5MHz,对于100Mbps的数据传输,此时钟为25MHz。
MII_RX_CLK:为传输接收数据而提供连续的时钟信号,对于10Mbps的数据传输,此时钟为2.5MHz,对于100Mbps的数据传输,此时钟为25MHz。
MII_TX_EN:传输使能信号,表示MAC正在输出要求MII接口传输的数据。此使能信号必需与数据前导符的起始位同步(MII_TX_CLK)出现,并且必需一直保持到所有需要传输的位都传输完毕为止。
MII_TXD[3:0]:由MAC子层控制,每次同步传输4位数据,数据在MII_TX_EN信号有效时有效。MII_TXD[0]是数据的最低位,MII_TXD[3]是数据的最高位。当MII_TX_EN信号无效时,传输的数据对PHY无效。
MII_CRS:载波侦听信号,由PHY控制,当发送或接收的介质非空闲时,使能此信号。当传送和接收的介质都空闲时,PHY会撤消此信号。PHY必需保证MII_CS信号在发生冲突的整个时间段内都保持有效。不需要此信号与发送/接收的时钟同步。在全双工模式下,此信号的状态对于MAC子层无意义。
MII_COL:冲突检测信号,由PHY控制,当检测到介质发生冲突时,使能此信号,并且在整个冲突的持续时间内,保持此信号有效。此信号不需要与发送/接收的时钟同步。在全双工模式下,此信号的状态对于MAC子层无意义。
MII_RXD[3:0]:由PHY控制,每次同步传输4位数据,数据在MII_RX_DV信号有效时有效。MII_RXD[0]是数据的最低位,MII_RXD[3]是数据的最高位。当MII_RX_EN无效,而MII_RX_ER有效时,PHY会通过传送一组特殊的MII_RXD[3:0]数据来告知一些特殊的信息。
MII_RX_DV:接收数据使能信号,由PHY控制,当PHY准备好卸载和解码数据供MII接收时,使能该信号。此信号必需和卸载好的帧数据的首位同步(MII_RX_CLK)出现,并在数据完全传输完毕之前,都保持有效。在传送最后4位数据后的第一个时钟之前,此信号必需变为无效状态。为了正确接收一个帧,MII_RX_DV信号必需在整个帧传输期间内都保持有效,有效电平不能晚于数据线上的SFD位。
MII_RX_ER:接收出错信号,保持一个或多个时钟周期(MII_RX_CLK)的有效状态,指示MAC子层在帧内检测到错误。错误情况必需配合MII_RX_DV的状态。
(3)简化的独立于介质的接口(RMII)
简化的独立于介质的接口(RMII)规范减少了与10/100Mbps通信时,STM32F107以太网模块和外部以太网之间的引脚数。根据IEEE 802.3u标准,MII接口需要16个数据和控制信号引脚,而RMII标准则将引脚数减少到7个(减少了56%的引脚数目)。
RMII模块用于连接MAC和PHY,该模块将MAC的MII信号转换到RMII接口上,其与外置PHY接口的示意图如图2.6所示,图2.7为RMII时钟源接口示意图。RMII模块具有以下特性:
支持10Mbps和100Mbps的通信速率。
时钟信号提高到50MHz。
MAC和外部的以太网PHY需要使用同样的时钟源。
使用2位宽度的数据收发。
注意 在使用以太网模块时,AHB的频率应至少为25MHz。
4.电路设计
图2.8为以太网部分的电路原理图。除了按照微控制器数据手册的要求进行原理图设计外,在设计时还需要注意的是,以太网接口部分MII_TXD[3:0]和MII_RXD[0]为高速收发信号,需要在线路中串接终端匹配电阻以实现阻抗匹配,保障传输线路上信号的完整性。
注意 阻抗匹配是指负载阻抗与激励源内部阻抗互相适配,得到最大功率输出的一种工作状态。对于不同特性的电路,匹配条件有所差异。在纯电阻电路中,当负载电阻等于激励源内阻时,则输出功率为最大,这种工作状态称为匹配,否则称为失配。当激励源内阻抗和负载阻抗含有电抗成分时,为使负载得到最大功率,负载阻抗与内阻必须满足共扼关系,即电阻成分相等,电抗成分只数值相等而符号相反,这种匹配条件称为共扼匹配。
在MII_TXD[3:0]和MII_RXD[0]数据收发总线上串接的匹配电阻应与传输线的特征阻抗近似或相等。特征阻抗并非普通意义上的电阻值,在高频电子线路中,特征阻抗有着特定的含义,读者可参阅相关文献进一步了解。此外,在电路布线时,应注意以下事项:
变压器与RJ45之间以及PHY层芯片与变压器之间的距离应控制在1英寸内为宜。当布局条件限制时,应优先保证变压器与RJ45之间的距离在1 英寸内。
器件布局按照信号流向放置,避免路径迂回。
对于没有集成网络变压器的RJ45接口,变压器下方的地平面要分割,分割线宽度不小于100MIL,网口变压器放置在GND和PGND的分隔线上。
每对差分走线都要进行等长布线,同时注意阻抗匹配。
注意PHY层芯片的数字地和模拟地统一,数字电源和模拟电源使用磁珠进行隔离。同时要与变压器配合。注意PHY芯片的电源滤波,应参照芯片数据手册要求进行设计。
网口指示灯的电源线3.3V或者2.5V来自于电源平面,要对它们使用磁珠和电容进行退耦;指示灯驱动线要靠近PHY串联电阻,并在进入I/O区域之前进行电容滤波。这样防止噪声通过指示灯电源线耦合到差分线对区域。
指示灯电源线和驱动信号线要靠近走线,尽量减小环路面积。
对指示灯线和差分线进行必要的隔离,两者要保证距离足够远,如果有必要,可以使用GND平面进行隔离。
注意网口变压器芯片侧中心抽头对地的滤波电容要尽量靠近变压器引脚,保证引线最短,分布电感最小。
用于连接GND和PGND的0Ω电阻或者电容要放置在地分割线上。
PHY芯片的模拟电源不宜大面积覆铜,应采取局部走线并串接磁珠接到变压器芯片侧的中心抽头上。
PHY芯片与变压器之间已经没有VDD,将PHY芯片与变压器之间的平面层区域定义为GND,这样可以切断来自VDD平面的噪声途径。
沿单板PCB的边缘每隔250mil打一个接地过孔,这些过孔排可以切断单板噪声向外辐射的途径,减小对PGND静地的影响。
单板的PGND、GND通过螺孔和结构相连接,保证系统地电位的统一。
保证电源平面和地平面之间的良好退耦(低阻),电源平面最好和地平面相邻。
和电源平面相邻的信号线不要超出电源平面的投影区域。
要保证和电源平面相邻的信号线的回流路径的完整性,否则需要改变平面的形状,使得信号线处在平面层内,回流路径的不完整会带来严重的电磁兼容性问题。
推荐把所有的高速信号线、I/O线、差分线对优先靠近地平面走线,如果无法实现才以电源平面作为参考平面。
差分线要远离其他信号线,数字信号线或电源要远离模拟信号线或电源。
电源的去耦和旁路是十分重要的,它们可以为信号提供一个低阻抗通路,减小电源和地平面间的谐振。电容可以起到去耦和旁路的作用,但要保证由电容、走线、过孔、焊盘组成的环路的面积尽量小,以保证引线电感尽量小。
以上是在以太网接口原理图设计及布线时应注意的问题,关于软件设计的部分将在本书后续章节中详细叙述。
控制器局域网络(Controller Area Network,CAN)是由研发和生产汽车电子产品著称的德国BOSCH公司开发,并最终成为国际标准(ISO11898),是国际上应用最广泛的现场总线之一。在北美和西欧,CAN总线协议已经成为汽车计算机控制系统和嵌入式工业控制局域网的标准总线,并且产生了以CAN为底层协议专为大型货车和重工机械车辆设计的J1939协议。近年来,CAN所具有的高可靠性和良好的错误检测能力受到重视,广泛应用于汽车计算机控制系统和环境温度恶劣、电磁辐射强和振动大的工业环境。
CAN总线属于现场总线的范畴,它是一种有效支持分布式控制或实时控制的串行通信网络。较之目前许多RS485基于R线构建的分布式控制系统而言,基于CAN总线的分布式控制系统在以下几个方面具有明显的优越性:
通信实时性强
首先,CAN控制器可以工作于多种方式下,网络中的各节点都可根据总线访问优先权(取决于报文标识符)采用无损结构的逐位仲裁的方式竞争向总线发送数据,且CAN协议废除了站地址编码,而代之以对通信数据进行编码,这可使不同的节点同时接收到相同的数据,这些特点使得CAN总线构成的网络各节点之间的数据通信实时性强,并且容易构成冗余结构,提高系统的可靠性和系统的灵活性。而利用RS485只能构成主从式结构系统,通信方式也只能以主站轮询的方式进行,系统的实时性、可靠性较差。
开发周期短
CAN总线通过CAN收发器接口芯片82C250的两个输出端CANH和CANL与物理总线相连,而CANH端的状态只能是高电平或悬浮状态,CANL端只能是低电平或悬浮状态。这就保证不会出现RS485网络中的现象,即当系统有错误,出现多节点同时向总线发送数据时,导致总线呈现短路,从而损坏某些节点的现象。而且CAN节点在错误严重的情况下具有自动关闭输出功能,以使总线上其他节点的操作不受影响,从而保证不会出现在网络中,因个别节点出现问题,而使得总线处于“死锁”的状态。而且,CAN完善的通信协议可由CAN控制器芯片及其接口芯片来实现,从而大大降低系统开发难度,缩短开发周期,这些是仅有电气协议的RS485所无法比拟的。
国际标准化
另外,与其他现场总线相比较而言,CAN总线是集通信速率高、容易实现且性价比高等诸多特点于一体的一种已形成国际标准的现场总线。这些也是目前 CAN总线应用于众多领域,具有强劲的市场竞争力的重要原因。
应用广泛
CAN属于工业现场总线的范畴。与一般的通信总线相比,CAN总线的数据通信具有突出的可靠性、实时性和灵活性。由于其良好的性能及独特的设计,CAN总线越来越受到人们的重视。它在汽车领域的应用是最广泛的,世界上一些著名的汽车制造厂商,如BENZ(奔驰)、BMW(宝马)、PORSCHE(保时捷)、ROLLS-ROYCE(劳斯莱斯)和JAGUAR(美洲豹)等都采用了CAN总线来实现汽车内部控制系统与各检测和执行机构间的数据通信。同时,由于CAN总线本身的特点,其应用范围目前已不再局限于汽车行业,而向自动控制、航空航天、航海、过程工业、机械工业、纺织机械、农用机械、机器人、数控机床、医疗器械及传感器等领域发展。CAN已经形成国际标准,并已被公认为几种最有前途的现场总线之一。其典型的应用协议有:SAE J1939/ISO11783、CANOpen、CANaerospace、DeviceNet、NMEA2000等。接下来简要介绍关于CAN总线的功能及工作模式。
1.功能介绍
STM32支持CAN协议2.0A和2.0B。它的设计目标是,以最小的CPU负荷来高效处理收到的大量报文。它也支持报文发送的优先级要求(优先级特性可软件配置)。对于注重安全的应用,bxCAN提供所有支持时间触发通信模式所需的硬件功能。
STM32主要特点如下:
支持CAN协议2.0A和2.0B主动模式。
波特率最高可达1Mbps。
支持时间触发通信功能。
(1)发送
3个发送邮箱。
发送报文的优先级特性可软件配置。
记录发送SOF时刻的时间戳。
(2)接收
2个3级深度的接收FIFO。
可变的过滤器组:
在互联型产品中,CAN1和CAN2分享28个过滤器组。
其他STM32F103系列产品中有14个过滤器组。
标识符列表。
FIFO溢出处理方式可配置。
记录接收SOF时刻的时间戳。
(3)时间触发通信模式
禁止自动重传模式。
16位自由运行定时器。
可在最后2个数据字节发送时间戳。
(4)管理
中断可屏蔽。
邮箱占用单独1块地址空间,便于提升软件执行效率。
(5)双CAN
CAN1:是主bxCAN,负责管理bxCAN和512B的SRAM存储器之间的通信。
CAN2:是从bxCAN,不能直接访问SRAM存储器。
两个bxCAN模块共享512B的SRAM存储器。
注意?在中容量和大容量产品中,USB和CAN共用一个专用的512B的SRAM存储器用于数据的发送和接收,因此不能同时使用USB和CAN(USB和CAN模块互斥地访问共享的SRAM存储器)。USB和CAN可以同时用于一个应用中但不能在同一个时间使用。
2.主要模式
bxCAN有3个主要的工作模式:初始化模式、正常模式和睡眠模式。在硬件复位后,bxCAN工作在睡眠模式以节省电能,同时激活CANTX引脚的内部上拉电阻。软件通过对CAN_MCR寄存器的INRQ或SLEEP位置1,可以请求bxCAN进入初始化或睡眠模式。一旦进入了初始化或睡眠模式,bxCAN就对CAN_MSR寄存器的INAK或SLAK位置1来进行确认,同时禁用内部上拉电阻。当INAK和SLAK位都为0时,bxCAN就处于正常模式。在进入正常模式前,bxCAN必须跟CAN总线取得同步;为取得同步,bxCAN要等待CAN总线达到空闲状态,即在CANRX引脚上监测到11个连续的隐性位。
除此之外,bxCAN还有测试模式,其中又包括静默模式、环回模式和环回静默模式。
在静默模式下,bxCAN可以正常地接收数据帧和远程帧,但只能发出隐性位,而不能真正发送报文。编程人员可通过对CAN_BTR寄存器的SILM位置1来选择静默模式。静默模式通常用于分析CAN总线的活动,而不会对总线造成影响——显性位(确认位、错误帧)不会真正发送到总线上。
在环回模式下,bxCAN把发送的报文当做接收的报文并保存(如果可以通过接收过滤)在接收邮箱里。通过对CAN_BTR寄存器的LBKM位置1来选择环回模式。为了避免外部的影响,在环回模式下CAN内核忽略确认错误。环回模式通常用于自测试目的。
环回静默模式可用于“热自测试”,既可以像环回模式那样测试bxCAN,又不会影响CANTX和CANRX所连接的整个CAN系统。在环回静默模式下,CANRX引脚与CAN总线断开,同时CANTX引脚被驱动到隐性位状态。通过对CAN_BTR寄存器的LBKM和SILM位同时置1,可以选择环回静默模式。
3.功能描述
(1)发送处理
发送报文的流程为(见图2.9):
1)应用程序选择1个空置的发送邮箱;设置标识符、数据长度和待发送数据;然后对CAN_TIxR寄存器的TXRQ位置1来请求发送。
2)TXRQ位置1后,邮箱不再是空邮箱;而一旦邮箱不再为空,软件不再对邮箱寄存器有写权限。TXRQ位置1后,邮箱马上进入挂号状态,并等待成为最高优先级的邮箱。
3)一旦邮箱成为最高优先级的邮箱,其状态变为预定发送状态。一旦CAN总线进入空闲状态,预定发送邮箱中的报文就马上被发送(进入发送状态)。
4)一旦邮箱中的报文成功发送后,邮箱马上变为空置邮箱;硬件相应地对CAN_TSR寄存器的RQCP和TXOK位置1,来表明一次成功发送。
5)如果发送失败,由仲裁引起的就对CAN_TSR寄存器的ALST位置1,由发送错误引起的就对TERR位置1。
注意事项1:报文能否立即发送取决于发送的优先级与发送模式(见图2.10)。
当有超过1个发送邮箱在挂号时,发送顺序由邮箱中报文的标识符决定。根据CAN协议,标识符数值最低的报文具有最高的优先级。如果标识符的值相等,那么邮箱号小的报文先被发送。
通过对CAN_MCR寄存器的TXFP位置1,可以把发送邮箱配置为发送FIFO。在该模式下,发送的优先级由发送请求次序决定。
注意事项2:发送中止(见图2.11)及禁止自动重传(见图2.12和图2.13)。
发送中止:通过对CAN_TSR寄存器的ABRQ位置1,可以中止发送请求。如果邮箱处于挂号或预定状态,发送请求立即被中止。如果邮箱处于发送状态,那么中止请求可能导致两种结果。如果邮箱中的报文已成功发送,那么邮箱变为空置邮箱,并且CAN_TSR寄存器的TXOK位被硬件置1;如果邮箱中的报文发送失败,那么邮箱变为预定状态,然后发送请求被中止,邮箱变为空置邮箱且TXOK位被硬件清零。二者最终都将邮箱清空,区别在于对CAN_TSR寄存器的TXOK标志位的影响。
禁止自动重传:通过对CAN_MCR寄存器的NART位置1,来让硬件工作在禁止自动重传模式。在该模式下,发送操作只会执行一次。无论是由于仲裁丢失或出错导致的发送失败,硬件都不会再自动发送该报文。并在完成后将CAN_TSR寄存器的RQCP位置1,同时发送的结果反映在TXOK、ALST和TERR位上。该模式主要用于满足CAN标准中时间触发通信选项的需求。
(2)接收管理
接收的报文存储在3级邮箱深度的FIFO中。FIFO完全由硬件来管理,从而节省了CPU的处理负荷,简化了软件并保证数据的一致性。应用程序只能通过读取FIFO输出邮箱来读取FIFO中最先收到的报文,如图2.14所示。
根据CAN协议,当报文被正确接收(直到EOF域的最后一位都没有错误),且通过了标识符过滤,那么认为该报文是有效报文。
1)FIFO从空状态开始,在接收到第一个有效的报文后,FIFO状态变为挂号_1(pending_1),硬件相应地把CAN_RFR寄存器的FMP[1:0]设置为01(二进制01b)。软件可以读取FIFO输出邮箱来读出邮箱中的报文,然后通过对CAN_RFR寄存器的RFOM位设置1来释放邮箱,将FIFO清空。如果在释放邮箱的同时又收到了一个有效的报文,那么FIFO仍然保留在挂号_1状态,软件可以读取FIFO输出邮箱来读取新收到的报文。
2)如果应用程序不释放邮箱,在接收到第二个有效的报文后,FIFO状态变为挂号_2(pending_2),硬件相应地把FMP[1:0]设置为10(二进制10b)。
3)重复上面的过程,第三个有效的报文把FIFO变为挂号_3状态(pending_3,此时FMP[1:0]=11b)。此时,软件必须对RFOM位设置1来释放邮箱,以便FIFO可以有空间存储下一个有效的报文;否则,当下一个有效的报文到来时就会导致一个报文的丢失。
4)当FIFO处于挂号_3状态(即FIFO的3个邮箱都是满的),下一个有效的报文就会导致溢出并且丢失。此时,硬件对CAN_RFR寄存器的FOVR位进行置1来表明溢出情况。至于会丢弃哪个报文,取决于对FIFO的设置:
如果禁用了FIFO锁定功能(CAN_MCR寄存器的RFLM位被清零),那么FIFO中最后收到的报文就被新报文所覆盖。这样,最新收到的报文不会丢失。
如果启用了FIFO锁定功能(CAN_MCR寄存器的RFLM位被置1),那么新收到的报文就被丢弃,软件可以读到FIFO中最早收到的3个报文。
有关CAN模块的标识符、出错管理、位时间特性,读者可自行参考芯片数据手册或编程手册,这里不再赘述。
(3)CAN中断
bxCAN占用4个专用的中断向量。通过设置CAN中断允许寄存器(CAN_IER),每个中断源都可以单独允许和禁用。
发送中断可由下列事件产生:
发送邮箱0变为空,CAN_TSR寄存器的RQCP0位被置1。
发送邮箱1变为空,CAN_TSR寄存器的RQCP1位被置1。
发送邮箱2变为空,CAN_TSR寄存器的RQCP2位被置1。
FIFO0中断可由下列事件产生:
FIFO0接收到一个新报文,CAN_RF0R寄存器的FMP0位不再是00。
FIFO0变为满时,CAN_RF0R寄存器的FULL0位被置1。
FIFO0发生溢出时,CAN_RF0R寄存器的FOVR0位被置1。
FIFO1中断可由下列事件产生:
FIFO1接收到一个新报文,CAN_RF1R寄存器的FMP1位不再是1。
FIFO1变为满时,CAN_RF1R寄存器的FULL1位被置1。
FIFO1发生溢出时,CAN_RF1R寄存器的FOVR1位被置1。
错误和状态变化中断可由下列事件产生:
出错情况,关于出错情况的详细信息请参考CAN错误状态寄存器(CAN_ESR)。
唤醒情况,在CAN接收引脚上监视到帧起始位(SOF)。
CAN进入睡眠模式。
4.电路设计
在CAN总线中,CAN_H和CAN_L是一对差分信号(Differential Signal)。所谓差分信号,就是指驱动端发送两个等值、反相的信号,接收端通过比较这两个电压的差值来判断逻辑状态“0”或“1”,而承载差分信号的那一对走线就称为差分对,与之相对的是单端信号。
差分信号和普通的单端信号走线相比,具有抗干扰能力强、电磁辐射小、时序定位精确等特点。当差分走线布线良好,差分对的耦合能够有效抑制外界的共模噪声干扰。同样的道理,由于两根信号的极性相反,它们对外辐射的电磁场可以相互抵消,需要注意的是,对噪声的抑制程度及对外辐射的程度也依赖于线路板布线的优良程度。
由于差分信号的开关变化位于两个信号的交点,与普通单端信号依靠高低两个阈值电压判断不同,因而受工艺、温度的影响小,能降低时序上的误差,同时也更适合于低幅度信号的电路。因此,目前高速板级总线大多采用小振幅差分信号技术。
为保证CAN总线的稳定性和可靠性,在线路板布线时应遵循差分布线的原则,与上一节介绍的网络接口的布线原则类似,CAN总线的电路原理图如图2.15所示。
RS485标准是由两个行业协会共同制定和发布的,即美国电子工业协会(EIA)和美国通讯工业协会(TIA)。EIA 曾经在其所有的标准前面加上RS(Rcommended Standard),因此许多工程师一直沿用这种名称。
RS485 总线作为一种多点差分数据传输的电气规范,已成为业界应用最为广泛的标准通信接口之一。这种通信接口允许在简单的一对双绞线上进行多点双向通信,它所具有的噪声抑制能力、数据传输速率、电缆长度及可靠性是其他标准无法比拟的。正因为如此,许多不同领域都采用RS485 作为数据传输线路。汽车电子、电信设备局域网、智能楼宇等中都经常可以见到具有RS485 接口电路的设备。这项标准得到广泛接受的另外一个原因是它的通用性。RS485 标准只对接口的电气特性做出规定,而不涉及接插件、电缆及协议,在此基础上用户可以建立自己的高层通信协议,如MODBUS协议。
RS485总线虽然得到了广泛应用,但也存在诸多缺点,诸如接纳设备容量不高、通信速率低、功耗较大、仅支持串行布线、稳定性较差、故障定位难度大、户外易击穿损坏等。
1.电路设计
事实上,大多数RS485总线的应用都是以微控制器外扩RS485协议芯片的方式实现的。从设计本质上讲,RS485总线接口的原理设计并不困难,难点在于如何保障总线的电磁兼容性、稳定性和低功耗。图2.16是以STM32的UART串行接口外扩的RS485总线接口,RS485总线接口芯片为常用的SP3485。这里列举的是以低成本方式实现RS485总线接口,在实际应用中,应充分考虑隔离、保护等措施,保障在工程应用中的稳定性。
在实际应用中,要注意后面讨论的几个方面。
2.抗干扰及保护措施
(1)抗扰措施
共模干扰问题:RS485 收发器共模电压范围为-7~+12V。当网络线路中共模电压超出此范围时就会影响通信的稳定性与可靠性,甚至可能损坏接口。
EMI电磁干扰问题:当发送驱动器输出信号中的共模部分没有低阻的返回通道(信号地)时,共模信号会以辐射的形式返回源端,总线形成一个巨型天线向外辐射电磁波。因此必须保障整个RS485网络的各个接口有一条低阻的信号返回通道,避免形成天线效应。
(2)保护措施
隔离保护方法:采用高频变压器、光耦等元件实现接口的电气隔离。将瞬态高压转移到隔离接口中的电隔离层上,从而不会产生损害性的浪涌电流,起到保护接口的作用。
旁路保护方法:利用瞬态抑制元件(如TVS、MOV、气体放电管等)将危害性的瞬态能量旁路到大地。
RS485 总线上每个通信节点上采取保护措施,如在每个节点的A、B 线上串联一个10Ω的隔离电阻,可以防止某个节点损坏后影响整条线路的通信功能。
3.安装注意事项
采用一条双绞线电缆作总线,将各个节点串接起来,从总线到每个节点的引出线长度应尽量短,以便使引出线中的反射信号对总线信号的影响最低。
注意总线特性阻抗的连续性,在阻抗不连续点就会发生信号的反射。易产生这种不连续性的情况有:总线的不同区段采用了不同电缆、某一段总线上有过多收发器紧靠在一起安装,或者是过长的分支线引出到总线。
当RS485总线空闲或开路时,可能导致接收器误触发。因此接收器一端应加偏置电阻,将总线设定在一个确定的状态。
当采用RS485总线进行长距离通信时,由于阻抗不匹配会引起信号反射,因此必须在电缆的末端跨接一个与电缆的特性阻抗同样大小的终端电阻(通常为120Ω),使电缆的阻抗连续。
4.总线节能
减小每帧数据发送量。
低功耗设计:收发器处于空闲模式时关闭发送驱动器,以减小功率消耗。
选择具有失效保护功能的低功耗器件(不需加偏置电阻)。
通信距离短、通信速率不高的场合不需加终端电阻。
网络终端采用RC 阻容匹配或肖特基二极管方式代替终端电阻可有效减小电流消耗。
由于除上述几种接口以外的其他接口电路较为简单,且大多数读者较为熟悉,因此不做太多介绍,接下来仅简单介绍电路原理图中涉及的要点。
1.USB主从接口
USB模块为PC主机和微控制器所实现的功能之间提供了符合USB规范的通信连接。PC主机和微控制器之间的数据传输是通过共享一个专用的数据缓冲区来完成的,该数据缓冲区能被USB外设直接访问。这块专用数据缓冲区的大小由所使用的端点数目和每个端点最大的数据分组大小所决定,每个端点最大可使用512B缓冲区,最多可用于16个单向或8个双向端点。当USB模块同PC主机通信时,根据USB规范可实现令牌分组的检测、数据发送/接收的处理以及握手分组的处理。整个传输的格式由硬件完成,其中包括CRC的生成和校验。USB接口的电路原理图如图2.17所示。
每个端点都有一个缓冲区描述块,用于描述该端点使用的缓冲区地址、大小和需要传输的字节数。
当USB模块识别出一个有效的功能/端点的令牌分组时,(如果需要传输数据并且端点已配置)随之发生相关的数据传输。USB模块通过一个内部的16位寄存器实现端口与专用缓冲区的数据交换。在所有的数据传输完成后,如果需要,则根据传输的方向,发送或接收适当的握手分组。
在数据传输结束时,USB模块将触发与端点相关的中断,通过读状态寄存器和/或者利用不同的中断处理程序,微控制器可以确定:
哪个端点需要得到服务。
产生如位填充、格式、CRC、协议、缺失ACK、缓冲区溢出/缓冲区未满等错误时,正在进行的是哪种类型的传输。
USB模块对同步传输和高吞吐量的批量传输提供了特殊的双缓冲区机制,在微控制器使用一个缓冲区的时候,该机制保证了USB外设总是可以使用另一个缓冲区。
在任何不需要使用USB模块的时候,通过写控制寄存器可以使USB模块置于低功耗模式(SUSPEND模式)。在这种模式下,不产生任何静态电流消耗,同时USB时钟也会减慢或停止。通过对USB线上数据传输的检测,可以在低功耗模式下唤醒USB模块。也可以将一特定的中断输入源直接连接到唤醒引脚上,以使系统能立即恢复正常的时钟系统,并支持直接启动或停止时钟系统。
2.电源
开发板中的器件供电电平有两种5V和3.3V,因此3.3V电源部分采用AMS1117-3.3为芯片的供电系统,5V电源则直接由外接5V电源提供能源补给。板级电源的电路示意图如图2.18所示。
3.RS232接口
RS232接口是1970年由美国电子工业协会(EIA)联合贝尔系统、调制解调器厂家及计算机终端生产厂家共同制定的用于串行通信的标准。RS232的全名是“数据终端设备(DTE)和数据通信设备(DCE)之间串行二进制数据交换接口技术标准”。该标准规定采用一个25引脚的DB25连接器,对连接器的每个引脚的信号内容加以规定,还对各种信号的电平加以规定。随着设备的不断改进,出现了代替DB25的DB9接口,目前市面上的产品大多以DB9的形式出现,仅有少数设备保留了DB25的接口形式。与RS485类似,RS232接口是通过在UART接口外部扩展的一种物理总线,UART提供了符合RS232的数据终端接口。RS232的电路原理图如图2.19所示,接口芯片采用ST3232。
4.SD卡接口
SD卡共支持三种传输模式:SPI模式(独立序列输入和序列输出)、1位SD模式(独立指令和数据通道,这是独有的传输格式)和4位SD模式(使用额外的引脚以及某些重新设置的引脚。支持4位宽的并行传输)。SD卡接口电路设计如图2.20所示,需要注意的是,接口形式必须与传输模式相匹配。比如,本例采用SPI模式时,仅需要连接MISO、SCK、MOSI、SDCS四根物理信号线。若采用4位SD模式时,接口的电气连接方式必须做相应的调整,读者可参考SD 2.0规范。
5.红外收发接口、射频模块接口等
此部分电路较为简单,读者参考芯片数据手册进行了解,在此不再赘述。部分电路示意图如图2.21~图2.24所示。
6.自定义功能键与复位键
按键开关是各种电子设备不可或缺的人机接口。在实际应用中,很大一部分的按键是机械按键。在机械按键的触点闭合和断开时,都会产生抖动,为了保证系统能正确识别按键的开关,就必须对按键的抖动进行处理。
在系统设计中,有各种各样的消除按键抖动的设计方法,通常有硬件消抖和软件延时消抖两种方法。虽然这两种方法都比较成熟,但在设计中应予以重视,保证人机交互时的友好和电路的稳定性。按键接口电路如图2.25所示
7.外扩TFT液晶模块接口
TFT(Thin Film Transistor)一般代指薄膜液晶显示器。显示屏由许多可以发出任意颜色的光线的像素组成,通过控制各个像素显示相应的颜色来达到既定的视觉效果,传达特定的信息。在嵌入式应用领域,TFT液晶显示屏通常以“裸屏”或模组形式出现。所谓“裸屏”,即未集成任何驱动,需要工程师进行综合软硬件开发才能实现既定的显示功能。而模组则具备了完整显示功能要素,具有严格、完整的接口规范,工程师仅需要按照规范对接口进行读写即可实现人机交互。下面以ILI9320为驱动芯片的液晶模组作为显示单元,该模组采用16位并行接口驱动,带有触摸功能,接口较为简单,TFT液晶模块接口电路图如图2.26所示。
8.模拟转换、蜂鸣器、E2PROM
E2PROM采用I2C接口与微控制器相连,读写命令格式可参考24C16数据手册。模拟电路为简单的数据采集试验提供便利,实际工程应用应综合考虑应用背景与实际需求。蜂鸣器可采用PWM方式驱动,实现音调和音量的调节。模拟转换、蜂鸣器、E2PROM电路图如图2.27所示。
9.微控制器
图2.28为微控制器部分的电气连接原理图,本节中的电路采用平坦式电路设计模式,因此各模块的外接端口均采用offpage connector引出。