STM32F0实战:基于HAL库开发【4.4】
20.3.6 bxCAN中断
bxCAN占用4个专用的中断向量。通过设置CAN中断允许寄存器CAN_IER,每个中断源都可以单独允许和禁用。bxCAN中断的控制逻辑如图20-21所示。
1)发送中断可由下列事件产生:
·发送邮箱0变为空,CAN_TSR寄存器的RQCP0位被置1。
·发送邮箱1变为空,CAN_TSR寄存器的RQCP1位被置1。
·发送邮箱2变为空,CAN_TSR寄存器的RQCP2位被置1。
2)FIFO 0中断可由下列事件产生:
·FIFO 0接收到一个新报文,CAN_RF0R寄存器的FMP0位不再是00。
·FIFO 0变为满,CAN_RF0R寄存器的FULL0位被置1。
·FIFO 0发生溢出,CAN_RF0R寄存器的FOVR0位被置1。
3)FIFO 1中断可由下列事件产生:
·FIFO 1接收到一个新报文,CAN_RF1R寄存器的FMP1位不再是00。
·FIFO 1变为满,CAN_RF1R寄存器的FULL1位被置1。
·FIFO 1发生溢出,CAN_RF1R寄存器的FOVR1位被置1。
4)错误和状态变化中断可由下列事件产生:
·错误发生,CAN错误状态寄存器(CAN_ESR)的相应位被置1。
·唤醒发生,在CAN接收引脚上监视到帧起始位(SOF)。
·CAN进入睡眠模式。

20.4 bxCAN函数
20.4.1 bxCAN类型定义



20.4 bxCAN函数
20.4.1 bxCAN类型定义



20.4.2 bxCAN常量定义



20.4.3 bxCAN函数定义





20.5 bxCAN应用实例
STM32F072VBT6微控制器的bxCAN模块是通过PA12/CAN_TX和PA11/CAN_RX引脚与外部CAN总线驱动器TJA1050相连接,TJA1050是高速CAN收发器,用作控制器和物理总线之间的接口。微控制器与CAN总线之间的驱动电路如图20-22所示。

TJA1050适用于波特率范围为60kbit/s~1Mbit/s的高速CAN通信中,具有速度高、低电磁辐射、宽输入范围、宽工作电压、与3.3V器件兼容等特点,可以连接至少110个节点,且没有上电的节点不会对总线造成干扰。TJA1050的TXD引脚是发送数据输入端,用于连接控制器的CAN_TX端;RXD引脚是接收数据输入端,用于连接控制器的CAN_RX端;Vref引脚是片内参考电压输出端,可以向外提供2.5V的参考电压;CANL和CANH引脚分别是低电平和高电平CAN总线连接端,用于与CAN总线的物理连接;引脚S是工作模式的选择端,接地时芯片工作在高速模式,这也是芯片的正常工作模式。将引脚S连接到VCC可以让芯片进入静音模式,这时发送器禁用,但片内其他功能仍可以继续使用。静音模式可以防止CAN收发器不受控制时对网络通信造成堵塞。
在以下的CAN应用实例中,我们仅将bxCAN模块设置为环回模式,只激活一个过滤器组,把过滤器设置成32位的屏蔽位模式,标识符的所有位都不参与比较,这样所有接收到的报文均能通过过滤器。将报文的格式设置成标准帧格式,数据位为8位。在发送数据时,信息一路从CAN_TX引脚送出,另一路从bxCAN的接收端反馈回来,模块把接收到的数据读取出来,按需要将数据显示在数码管上。在使用STM32CubeMX软件生成开发项目时,在“Pinout”视图中,对引脚、外设的配置如图20-23所示。
在“Clock Configuration”视图中,对时钟的配置如图20-24所示。
在“Configuration”视图中,将bxCAN模块的时钟预分频器的分频比例设置为48,这样一个时间单元(1tq)为1μs,标称位时间为10μs,数据传输的波特率为100kbit/s,并且使能了自动离线管理(Bus-Off)功能,将bxCAN的工作模式设置为环回模式并且使能中断。具体参数配置如图20-25和图20-26所示。



bxCAN在环回模式下收发数据的测试代码详见代码清单20-1、代码清单20-2和代码清单20-3。
代码清单20-1 bxCAN环回模式数据收发(main.c)(在附录J中指定的网站链接下载源代码)
代码清单20-2 bxCAN环回模式数据收发(stm32f0xx_hal_msp.c)(在附录J中指定的网站链接下载源代码)
代码清单20-3 bxCAN环回模式数据收发(stm32f0xx_it.c)(在附录J中指定的网站链接下载源代码)
第21章 通用串行总线
STM32F072VBT6微控制器内部的USB外设支持USB 2.0全速总线,支持USB挂起/恢复操作,必要时可以停止设备的时钟以实现低功耗的应用。本章将从了解和掌握USB总线的基本原理和模块的功能入手,通过使用STM32CubeMX软件集成的中间件组件来实现PC与微控制器的USB通信,使用一种简捷的方式入门USB开发。
21.1 USB概述
通用串行总线(Universal Serial Bus,USB)是一个外部总线标准,用于PC与外部设备的连接和通信,是在1994年由Intel、康柏、IBM、Microsoft等多家公司联合提出的。USB是基于令牌的总线,USB主控制器向总线上的所有设备广播令牌,总线上的设备检测令牌中的地址是否与自身相符,并通过接收或发送数据给主机来响应。总线上的USB设备支持即插即用和热插拔功能,设备通过挂起/恢复操作来管理USB总线电源。
21.1.1 USB总线结构
1.USB总线拓扑结构
USB系统采用级联星形拓扑,该拓扑由主机和设备两部分构成。
·主机(Host):USB主机指的是包含USB主控制器、并且能够完成与USB设备之间数据传输的设备。广义上说,USB主机包含PC和具有USB主控芯片的设备。主机包含主控制器和根集线器(Root Hub),控制着USB总线上的数据传输,USB所有的数据通信都由USB主机发起,主机在数据传输过程中占主导地位。
·设备:USB协议中将USB设备定义为具有某种功能的逻辑或物理实体。USB设备按照功能可分为两个大类:USB集线器(HUb)和USB功能设备。其中集线器提供若干个端口(Port)将设备连接到USB总线上,使得一个USB端口可以扩展连接多个USB设备。USB集线器检测连接在总线上的设备,负责总线的故障检测和恢复,并为这些设备提供电源。而功能设备可以分为以下几个标准设备类,如大容量存储设备类(MSD)、人机接口设备类(HID)、通信设备类(CDC)、音频设备类(AUDIO)、视频设备类(VIDEO)等。
2.USB总线数据传输方式
USB电缆由4根导线组成,分别是一对差分信号线D+和D-、电源线VBUS和地线GND组成。数据在USB总线上传输时,使用的是NRZI(反向不归0)编码方式,这种方式有利于保持数据的完整性,提高抗干扰能力。USB信号的传输采用的是差分信号传输,使用两条线路的电压差作为判断逻辑1还是逻辑0的标准。如果在数据传输时受到外部干扰,两条线路上的电平会同时升高或降低,但两条线路的电压差会始终保持稳定,数据传输的正确性不会因为外部干扰的原因而降低。
3.USB总线状态
USB总线协议中为总线定义了4种状态,即SE0、SE1、J和K状态。其中,D+和D-数据线都被拉低时的状态为SE0状态;D+和D-数据线都被拉高时的状态为SE1状态(非法状态);当有设备连接到主机时,D+和D-数据线其中之一被上拉,被上拉的数据线为高电平,另一根数据线为低电平,这种状态为J状态(空闲状态)。总线上包(Package)传输之前或之后,总线处于J状态;K状态同样也是D+和D-数据线其中之一被上拉,但其极性与J状态相反(如J状态为D+上拉,D-下拉,则K状态为D+下拉,D-上拉),主机通过J状态或K状态判断接入设备是否支持高速传输。
当USB主机或Hub的下行端口上没有USB设备连接时,USB总线处于SE0状态,当有设备连接时,电流通过Hub内部D+和D-数据线上的下拉电阻以及USB设备上D+或D-数据线上的上拉电阻构成分压器。如果主机检测到D+数据线上为高电平,说明连接的是高速/全速设备;如果主机检测到D-数据线上为高电平,说明连接的是低速设备。USB总线电阻连接状态如图21-1所示。
21.1.2 USB端点
USB端点(endpoint)就是位于USB设备或主机上的一个能够存储多字节的数据缓冲器区,在物理上,端点通常是一个数据存储器区块,或是控制器芯片中的一个寄存器。端点所存储的数据可能是接收到的数据,也可能是等待发送的数据。每一个端点都有确定的地址,在USB设备中,唯一可寻址的就是USB端点,主机和设备之间的通信最终作用于设备的端点上,因此端点也是主机与设备之间通信的结束点。
在USB通信中,根据端点的用途不同,可以将端点分为2类,即0号端点和非0号端点。0号端点也称控制端点,它既支持上行传输(IN),又支持下行传输(OUT),其他端点只能单方向传输数据。设备中每一个端点都有唯一的端点号,它和端点的方向共同构成端点的地址(8位)。这里所说的上行(IN)和下行(OUT)传输是相对于PC的,也就是说,IN是设备的数据输入计算机,而OUT是数据从计算机输出到设备。控制端点在USB设备上电复位后就可以使用,而其他的端点必须在配置之后才可以使用。除了控制端点以外,对于低速设备,其端点数最多为4个,端点号范围为0~3,而对于全速/高速设备,其端点数最多为16个,端点号范围为0~15。
端点就相当于一个既有进口、又有出口的池子,用户按需要将数据通过入口放入池子里,固件库中的程序会自动将这些数据发送到指定的地方去,而无须用户干预。通常端点0是用来做标准请求响应用的,也就是在USB设备刚刚接入总线、通信刚刚建立时才用到。之后经过配置,端点1通常定义为下行传输(OUT),而端点2则定义为入上行传输(IN)。
21.1.3 USB通信管道
USB的数据是通过管道传输的,USB管道并不是一个实际的对象,它只是设备端点和主机控制器软件之间建立的关联通道。在数据传输开始前,主机和设备之间必须先建立好一个管道用于沟通情况,每个USB设备都有一个默认的管道,用于控制传输,该管道是在USB设备成功连接至主机并复位后建立的,通过这个默认的管道,主机与设备间可以沟通信息,开始必要的配置,而其他的管道则是在设备被配置后才产生的。当设备从总线上移除时,主机会将这个不再使用的管道撤销。端点和其相对应的管道在每个方向上按照0~15编号,因此一个设备最多有32个活动管道。即16个IN管道和16个OUT管道。主机和设备间的管道示意如图21-2所示。

21.1.4 包的字段格式
包(Package)是USB总线上数据传输的基本单元,所有数据都是经过打包后在总线上传输的。USB数据传输的包类型有令牌包、数据包和握手包等几种。包由一些字段构成的,不同功能的字段,按照特定的格式组合在一起可以构成不同类型的包。包的字段主要由同步字段(SYNC)、包标识符字段(PID)、地址字段(ADDR)、端点字段(ENDP)、帧号字段、数据字段、校验字段(CRC)和包结尾字段(EOP)构成。对于不同类型的包,其字段格式也不尽相同。
1)同步字段(SYNC):同步字段是包的前导,由8个数据位构成,其作用是使USB设备与总线的包传输速率同步。同步字段的值固定为“00000001B”。
2)包标识符字段(PID):包标识符字段用于表示包类型,字段长度为8位,由4个包类型位和4个校验位构成,其中校验字段是包类型字段按位取反得到的,用于对包类型字段进行错误检查。包标识符字段的具体定义如下:

3)地址字段(ADDR):地址字段由7位构成,共有128个地址值,地址0作为默认的地址,不能分配给USB设备,因此只有127个地址值可分配。当设备上电时,主机使用默认地址0与设备通信,当设备配置完成后,主机重新为设备分配一个地址。
4)端点字段(ENDP):端点字段由4位构成,可寻址16个端点,该字段仅应用在IN、OUT和SETUP令牌包中。
5)帧号字段:帧号字段仅存在于帧起始包(SOF)中,长度为11位,从0开始取值,每发送一个SOF,该字段值自动加1,最大值为0x7FF。当超过最大值时,自动从0开始循环。
6)数据字段:数据字段的最大长度为1024字节,在数据传输时,首先传输低字节,对于每一字节,首先传输的是字节的最低位。
7)校验字段(CRC):校验字段用于检验包是否存在错误,保证传输的可靠性。校验采用的方式是循环冗余校验,在令牌包中通常采用5位循环冗余校验,而在数据包中则采用16位循环冗余校验。
8)包结尾字段(EOP):包结尾字段用于指示包传输的结束,对于低速和全速设备,包结尾字段在物理上表现为两位的SE0状态和一位的J状态。对于高速设备,通过故意填充位错误来表明包结束。
21.1.5 USB的包类型
包类型由PID字段表示,具体详见表21-1。
表21-1 包类型定义

1.令牌包
USB协议中定义了7种不同类型的令牌包,其中常用的有4种,分别是SETUP令牌包、OUT令牌包、IN令牌包和SOF令牌包。SETUP令牌包、OUT令牌包、IN令牌包的数据格式如下:
SOF令牌包的数据格式如下:

USB协议中规定只有主机才能发送令牌包,令牌包定义了主机数据传输的类型,用于建立一次数据传输。IN令牌包用来建立设备到主机的数据传输,OUT令牌包用来建立主机到设备的数据传输,IN和OUT令牌包可以对USB设备上的任意端点进行寻址。SETUP令牌包是一个特殊类型的OUT令牌包,它总是指向设备的端点0,具有最高的优先级,设备必须优先接收它,即使正在进行传输操作也不例外。
在低速和全速模式下,主机每隔1ms发送一个帧开始包(SOF),因此这1ms的时间间隔也被称为一帧,也可以将帧理解成为1ms时间段内传输的信息。在高速模式下,主机每隔125μs发送一个帧开始包(SOF),这125μs的时间间隔也被称为一个微帧,其长度是一个帧的1/8。
2.数据包
常用的数据包有DATA0和DATA1两种,数据包的格式如下:

3.握手包
握手包由三个字段构成,用来报告事务处理的完成,握手包的格式如下:
·ACK握手包:当数据传输的接收方正确接收到数据包时,接收方将返回ACK握手包。ACK握手包表示一次正确的事务处理,之后才可能进行下一次的事务处理。对于IN事务处理,ACK握手包由主机发出,对于OUT事务处理,ACK握手包由设备发出。
·NAK握手包:对于IN事务处理,NAK握手包表示设备没有传输数据到主机。对于OUT事务处理,NAK握手包表示主机没有传输数据到设备。NAK握手包仅由设备发出,主机不能发出NAK握手包。
·STALL握手包:STALL握手包表示设备不能接收或发送数据。对于IN事务处理,主机给设备发送IN令牌包后,如果设备无法给主机发送数据,则向主机发送一个STALL握手包。对于OUT事务处理,
主机给设备发送OUT令牌包和数据包后,如果设备无法接收主机发来的数据,则向主机发送一个STALL握手包,STALL握手包仅由设备发出。
更多推荐
所有评论(0)