历史上的今天
返回首页

历史上的今天

今天是:2024年09月02日(星期一)

正在发生

2018年09月02日 | STM32之CAN---发送管理分析

2018-09-02 来源:eefocus

1 CAN发送邮箱

STM32共有三个CAN发送邮箱,在检测到总线空闲时交发送,但需要注意的是,有可能会发送失败,有可能因为仲裁失败从而导致失败,也有可能是其它错误,原则上bxCAN将自动重发,但bxCAN也可以配置不自动重发。正因为如此,发送邮箱中有可能同时存在多个需要发送的报文,一旦出现这种情况,那么发送邮箱中的多个报文又将是谁先发送谁后发送呢?有两种模式:ID模式和FIFO模式。ID模式由报文的ID值决定,即ID值越小,优先级越高,另一种FIFO模式,顾名思义,即为消息队列方式,谁先到谁先发送,此种模式下三个邮箱与接收FIFO类似。

下图是发送邮箱的状态图:

                                                             图1

由上图可知,发送邮箱共有四种状态,空状态,挂号状态,预定发送状态(scheduled),发送状态。

发送报文的流程为:应用程序选择1个空发送邮箱;设置标识符,数据长度和待发送数据;然后对CAN_TIxR寄存器的TXRQ位置’1’,来请求发送。TXRQ位置’1’后,邮箱就不再是空邮箱;而一旦邮箱不再为空,软件对邮箱寄存器就不再有写的权限。TXRQ位置1后,邮箱马上进入挂号状态,并等待成为最高优先级的邮箱,参见发送优先级。一旦邮箱成为最高优先级的邮箱,其状态就变为预定发送状态。一旦CAN总线进入空闲状态,预定发送邮箱中的报文就马上被发送(进入发送状态)。一旦邮箱中的报文被成功发送后,它马上变为空邮箱;硬件相应地对CAN_TSR寄存器的RQCP和TXOK位置1,来表明一次成功发送。
如果发送失败,由于仲裁引起的就对CAN_TSR寄存器的ALST位置’1’,由于发送错误引起的就对TERR位置’1’。

2 发送优先级

          如之前所述,如果三个邮箱中同时存在多个待发送的报文时,此时存在一个问题,即先送哪个邮箱中的报文好呢?此时,存在一个发送优先级的问题。此时,非空发送邮箱进入发送仲裁,发送仲裁有两种策略:ID模式和FIFO模式。

ID模式:当有超过1个发送邮箱在挂号时,发送顺序由邮箱中报文的标识符决定。根据CAN协议,标识符数值最低的报文具有最高的优先级。如果标识符的值相等,那么邮箱号小的报文先被发送。此模式通过对CAN主控寄存器CAN_MCR的TXFP位清0来设置。

FIFO模式:通过对CAN_MCR寄存器(CAN主控寄存器)的TXFP位置’1’,可以把发送邮箱配置为发送FIFO。在该模式下,发送的优先级由发送请求次序决定。该模式对分段发送很有用。

3 取消发送


发送邮箱中待发送的报文在正常发送成功之前也可以中途取消,通过对CAN_TSR寄存器的ABRQ位置’1’,可以中止发送请求。


当发送邮箱处于挂号或预定状态时:发送请求马上就被中止了。

当发送邮箱处于发送状态时:

         那么中止请求可能导致2种结果:

                    1:如果邮箱中的报文被成功发送,那么邮箱变为空邮箱,并且CAN_TSR寄存器(CAN发送状态寄存器)的TXOK位被硬件置’1’;


                    2:如果邮箱中的报文发送失败了,那么邮箱变为预定状态,然后发送请求被中止,邮箱变为空邮箱且TXOK位被硬件清’0’。


       因此,不管如何,一旦取消发送,那么在发送操作结束后,邮箱都会变为空邮箱。


       固件库中取消发送的接口为:


[cpp] view plain copy

/** 

  * @brief  Cancels a transmit request. 

  * @param  CANx: where x can be 1 or 2 to select the CAN peripheral. 

  * @param  Mailbox: Mailbox number. 

  * @retval None 

  */  

void CAN_CancelTransmit(CAN_TypeDef* CANx, uint8_t Mailbox);  


4 自动重传模式


该模式主要用于满足CAN标准中,时间触发通信选项的需求。通过对CAN_MCR寄存器的NART位置’1’,来让硬件工作在该模式(禁止自动重传)。

在该模式下,发送操作只会执行一次。如果发送操作失败了,不管是由于仲裁丢失或出错,硬件都不会再自动发送该报文。

在一次发送操作结束后,硬件认为发送请求已经完成,从而对CAN_TSR寄存器的RQCP位置’1’,同时发送的结果反映在TXOK、ALST和TERR位上。


5 发送邮箱的组成


说了那么多,那个三个发送邮箱的结构到底是怎么样的呢?与接收FIFO的邮箱类似,发送邮箱也是由四个寄存器组成:发送邮箱标识符寄存器(CAN_TIxR x=0..2),发送邮箱长度和时间戳寄存器(CAN_TDTxR x=0..2),发送邮箱低字节数据寄存器(CAN_TDLxR x=0..2),发送邮箱高字节寄存器(CAN_TDHxR x=0..2)。

5.1 发送邮箱标识符寄存器 (CAN_TIxR) (x=0..2)

地址偏移量: 0x180,0x190,0x1A0
复位值: 0xXXXX XXXX,X=未定义位(除了第0位,复位时TXRQ=0)
注: 1 当其所属的邮箱处于等待发送的状态时,该寄存器是写保护的。

         2 该寄存器实现了发送请求控制功能(第0位)-复位值为0

                                                                                    图2

与接收FIFO的邮箱的发送邮箱标识符寄存器类似,各位定义如下:

位31:21STID[10:0]: 标准标识符
扩展身份标识的高字节。
位20:3EXID[17:0]: 扩展标识符
扩展身份标识的低字节。
位2IDE: 标识符选择
该位决定发送邮箱中报文使用的标识符类型
0: 使用标准标识符;
1: 使用扩展标识符。
位1RTR: 远程发送请求
0: 数据帧;
1: 远程帧。
位0TXRQ: 发送数据请求
由软件对其置1,来请求发送其邮箱的数据。当数据发送完成,邮箱为空时,硬件对其清0。


5.2 发送邮箱数据长度和时间戳寄存器 (CAN_TDTxR) (x=0..2)

地址偏移量:0x184,0x194,0x1A4
复位值:未定义

                                                                                   图3

位31:16TIME[15:0]: 报文时间戳
该域包含了,在发送该报文SOF的时刻,16位定时器的值。
位15:9保留位
位8TGT: 发送时间戳
只有在CAN处于时间触发通信模式,即CAN_MCR寄存器的TTCM位为1时,该位才有效。
0: 不发送时间戳;
1: 发送时间戳TIME[15:0]。在长度为8的报文中,时间戳TIME[15:0]是最后2个发送的字节:TIME[7:0]作为第7个字节,TIME[15:8]为第8个字节,它们替换了写入CAN_TDHxR[31:16]的数据(DATA6[7:0]和DATA7[7:0])。为了把时间戳的2个字节发送出去,DLC必须编程为8。
位7:4保留位。
位3:0DLC[15:0]: 发送数据长度
该域指定了数据报文的数据长度或者远程帧请求的数据长度。1个报文包含0到8个字节数据,而这由DLC决定。

5.3 发送邮箱低字节数据寄存器 (CAN_TDLxR) (x=0..2)

地址偏移量:0x188,0x198,0x1A8
复位值:未定义位

当邮箱为空时,寄存器中的所有位为只读。

                                                                                        图4

位31:24DATA3[7:0] : 字节3
报文的数据字节3。
位23:16DATA2[7:0] : 字节2
报文的数据字节2。
位15:8DATA1[7:0] : 字节1
报文的数据字节1。
位7:0DATA0[7:0] : 字节0
报文的数据字节0。
报文包含0到8个字节数据,且从字节0开始。

5.4 发送邮箱高字节数据寄存器 (CAN_TDHxR) (x=0..2)

地址偏移量:0x18C,0x19C,0x1AC
复位值:未定义位
当邮箱为空时,寄存器中的所有位为只读。

                                                                   图5

位31:24DATA7[7:0] : 字节7
报文的数据字节7
注: 如果CAN_MCR寄存器的TTCM位为1,且该邮箱的TGT位也为1,那么DATA7和DATA6将被TIME时间戳代替。
位23:16DATA6[7:0] : 字节6
报文的数据字节6。
位15:8DATA5[7:0] : 字节5
报文的数据字节5。
位7:0DATA4[7:0] : 字节4
报文的数据字节4。

6 CAN发送状态寄存器 (CAN_TSR)

地址偏移量: 0x08
复位值: 0x1C00 0000

单有发送邮箱还不行,不得有一个寄存器从整体上显示发送各邮箱的状态及控制,而CAN发送状态寄存器(CAN_TSR)即负责此工作的。

                                                                             图6

各定义如下:

位31LOW2: 邮箱2最低优先级标志
当由多个邮箱在等待发送报文,且邮箱2的优先级最低时,硬件对该位置1。
位30LOW1: 邮箱1最低优先级标志
当由多个邮箱在等待发送报文,且邮箱1的优先级最低时,硬件对该位置1。
位29LOW0: 邮箱0最低优先级标志
当由多个邮箱在等待发送报文,且邮箱0的优先级最低时,硬件对该位置1。
位28TME2: 发送邮箱2空
当邮箱2中没有等待发送的报文时,硬件对该位置1。
位27TME1: 发送邮箱1空
当邮箱1中没有等待发送的报文时,硬件对该位置1。
位26TME0: 发送邮箱0空
当邮箱0中没有等待发送的报文时,硬件对该位置1。
位25:24CODE[1:0]: 邮箱号
当有至少1个发送邮箱为空时,邮箱号为下一个空的发送邮箱号。
当所有的发送邮箱都为空时,邮箱号为优先级最低的那个发送邮箱号。
位23ABRQ2: 邮箱2中止发送
软件对该位置1可以中止邮箱2的发送请求,当邮箱2的发送报文被清除时硬件对该位清0。
如果邮箱2中没有等待发送的报文,则对该位置1没有任何效果。
位22:20保留位,硬件强制其值为0
位19TERR2: 邮箱2发送失败
当邮箱2因为出错而导致发送失败时,对该位置1。
位18ALST2: 邮箱2仲裁丢失
当邮箱2因为仲裁丢失而导致发送失败时,对该位置1。
位17TXOK2: 邮箱2发送成功
每次在邮箱2进行发送尝试后,硬件对该位进行更新:
0: 上次发送尝试失败;
1: 上次发送尝试成功。
当邮箱2的发送请求被成功完成后,硬件对该位置1。
位16RQCP2: 邮箱2请求完成
当上次对邮箱2的请求(发送或中止)完成后,硬件对该位置1。
软件对该位写’1’可以对其清0;当硬件接收到发送请求时也对该位清0(CAN_TI2R 寄存器的TXRQ位被置1)。
该位被清0时,邮箱2的其它发送状态位(TXOK2, ALST2和TERR2)也被清0。
位15ABRQ1: 邮箱1中止(发送)
软件对该位置1可以中止邮箱1的发送请求,当邮箱1的发送报文被清除时硬件对该位清0。
如果邮箱1中没有等待发送的报文,则对该位置1没有任何效果。
位14:12保留位,硬件强制其值为0
位11TERR1: 邮箱1发送失败
当邮箱1因为出错而导致发送失败时,对该位置1。
位10ALST1: 邮箱1仲裁丢失
当邮箱1因为仲裁丢失而导致发送失败时,对该位置1。
位9TXOK1: 邮箱1发送成功
每次在邮箱1进行发送尝试后,硬件对该位进行更新:
0: 上次发送尝试失败;
1: 上次发送尝试成功。
当邮箱1的发送请求被成功完成后,硬件对该位置1。
位8RQCP1: 邮箱1请求完成
当上次对邮箱1的请求(发送或中止)完成后,硬件对该位置1。
软件对该位写’1’可以对其清0;当硬件接收到发送请求时也对该位清0(CAN_TI1R 寄存器的TXRQ位被置1)。
该位被清0时,邮箱1的其它发送状态位(TXOK1, ALST1和TERR1)也被清0。
位7ABRQ0: 邮箱0中止(发送)
软件对该位置1可以中止邮箱0的发送请求,当邮箱0的发送报文被清除时硬件对该位清0。
如果邮箱0中没有等待发送的报文,则对该位置1没有任何效果。
位6:4保留位,硬件强制其值为0
位3TERR0: 邮箱0发送失败
当邮箱0因为出错而导致发送失败时,对该位置1。
位2ALST0: 邮箱0仲裁丢失
当邮箱0因为仲裁丢失而导致发送失败时,对该位置1。
位1TXOK0: 邮箱0发送成功
每次在邮箱0进行发送尝试后,硬件对该位进行更新:
0: 上次发送尝试失败;
1: 上次发送尝试成功。
当邮箱0的发送请求被成功完成后,硬件对该位置1。
位0RQCP1: 邮箱0请求完成
当上次对邮箱0的请求(发送或中止)完成后,硬件对该位置1。
软件对该位写’1’可以对其清0;当硬件接收到发送请求时也对该位清0(CAN_TI0R 寄存器的TXRQ位被置1)。
该位被清0时,邮箱0的其它发送状态位(TXOK0, ALST0和TERR0)也被清0。

这里值得注意的是位25~24,即下一个空的发送邮箱号。当所有的发送邮箱都为空时,邮箱号为优先级最低的那个发送邮箱号。通过此两位,STM32就知道下一条发送报文该存储到哪个邮箱了。

7 与CAN发送有关的固件发送接口


发送接口如下:


/** 

  * @brief  Initiates and transmits a CAN frame message. 

  * @param  CANx: where x can be 1 or 2 to to select the CAN peripheral. 

  * @param  TxMessage: pointer to a structure which contains CAN Id, CAN DLC and CAN data. 

  * @retval The number of the mailbox that is used for transmission or 

  *         CAN_TxStatus_NoMailBox if there is no empty mailbox. 

  */  

uint8_t CAN_Transmit(CAN_TypeDef* CANx, CanTxMsg* TxMessage);  

获取发送状态接口如下:


/** 

  * @brief  Checks the transmission status of a CAN Frame. 

  * @param  CANx: where x can be 1 or 2 to select the CAN peripheral. 

  * @param  TransmitMailbox: the number of the mailbox that is used for transmission. 

  * @retval CAN_TxStatus_Ok if the CAN driver transmits the message,  

  *         CAN_TxStatus_Failed in an other case. 

  */  

uint8_t CAN_TransmitStatus(CAN_TypeDef* CANx, uint8_t TransmitMailbox);  


8 一个示例


CanTxMsg TxMessage;  

int i;  

  

if(id_fmt == STD_ID)//如果是标准CAN ID  

{   

    TxMessage.StdId = send_frame->id;  //设置标准CAN ID  

    TxMessage.IDE = CAN_ID_STD;   //设置IDE为标准CAN ID  

}  

else  

{      

    TxMessage.StdId = (send_frame->  

    id >>18) & 0x7FF; //设置扩展CAN ID的标准基本ID部分      

    TxMessage.ExtId = send_frame->id & 0x3FFFF;     //设置扩展CAN ID的扩展ID部分  

    TxMessage.IDE = CAN_ID_EXT;   //设置IDE为扩展CAN ID  

}  

  

TxMessage.RTR = CAN_RTR_DATA; //数据帧  

TxMessage.DLC = 8;  //数据长度  

for(i=0;i<8;i++)
 

{  

    TxMessage.Data[i] = send_frame->data_buff[i];  

}  

  

CAN_Transmit(CAN1,&TxMessage);  


推荐阅读

史海拾趣

GD Rectifiers Ltd公司的发展小趣事

随着全球对环境保护问题的日益关注,GD Rectifiers Ltd积极响应并践行绿色环保理念。公司投入大量资源进行绿色产品的研发和生产,推出了一系列符合环保标准的整流器产品。这些产品不仅具有高效、节能的特点,还大幅降低了生产和使用过程中的环境污染。同时,公司还加强了对废弃物的处理和回收利用工作,努力实现生产全过程的绿色化。GD Rectifiers Ltd的环保行动赢得了社会各界的广泛赞誉和支持,为公司的可持续发展奠定了坚实基础。

Ford Aerospace & Communications Corp公司的发展小趣事

随着航空业的逐渐发展,福特汽车公司意识到航空通信技术的重要性。在20世纪30年代,福特开始投资研发航空无线电通信系统,旨在提高飞行中的通信效率和安全性。这一举措不仅促进了福特在航空技术领域的进一步拓展,也为后来的航空通信标准制定提供了参考。

常州星海电子(Starsea)公司的发展小趣事

质量是企业的生命线。常州星海电子自成立以来,便高度重视质量管理体系的建设和完善。公司先后通过了ISO9002、ISO9001:2000、ISO14000等多项国际质量管理体系认证,以及TS16949体系认证。这些认证不仅证明了公司在质量管理方面的卓越实力,也为公司赢得了众多国内外客户的信任和赞誉。

Eclipse Magnetics公司的发展小趣事

随着市场需求的不断变化和消费者需求的多样化,常州星海电子不断调整和优化产品结构。公司现已形成了包括普通整流、开关、快速恢复、高效率、超快速、肖特基、双向触发管、整流桥、高反压以及瞬间突波电压吸收、稳压等多种系列、多种封装形式的二极管产品。这些产品广泛应用于电脑、家电、邮电通讯等行业,为公司赢得了广阔的市场空间。

CYMBET公司的发展小趣事

CYMBET公司成立于2000年,专注于微电子系统固态储能解决方案的研发与生产。在早期,公司就凭借其创新技术——可充电固态电池芯片(EnerChip)在行业中崭露头角。这种电池芯片使用标准半导体集成电路工艺和独特的构造技术,提供了环保、生物相容的嵌入式电源功能。EnerChip的推出不仅打破了传统电池的局限,还为医疗、传感器、RFID、工业控制等领域带来了革命性的变化。

维峰电子(WCON)公司的发展小趣事

为了进一步扩大市场份额,维峰电子积极开拓国内外市场。公司通过与国内外知名企业的合作,成功进入了多个领域,包括工业控制、汽车和新能源等。特别是新能源领域,维峰电子凭借其在电子连接器方面的技术优势,成功开发出多款适用于新能源领域的产品,受到了市场的广泛认可。

问答坊 | AI 解惑

百变运动机器人摄像头

机器人的手脚可以任720度任意转动,头部可360度转动,足球、篮球、棒球、橄榄球,他是样样精通。身高约15CM,摄像头像素130W。支持USB2.0,BIT24。 …

查看全部问答>

电路设计者必备(强烈推荐)——各种应用电路图

电路设计者必备(强烈推荐)——各种应用电路图…

查看全部问答>

操作系统中的进程问题

被 几个问题绕晕了,各位仁兄解答一下吧: 设在但处理机系统中有n(n>2)个进程: (1)是否会出现等待队列为空的情况?为什么? (2)是否会出现等待队列为空且无进程运行的情况?为什么? (3)是否会出现就绪队列为空的情况?为什么? (4) ...…

查看全部问答>

winCE5.0下串口程序无法接收数据!,

winCE5.0下串口程序无法接收数据!,请高手帮忙!! SOS... 下面是我在VS2005下用C#编写的,用在winCE5.0下的一个串口程序,在编译时出现了以下错误: ——“System.Windows.Form.Form”并不包含“CheckForIllegalCrossThreadCalls”的定义——如果 ...…

查看全部问答>

冰天雪地S型裸体拜求高手指点:蓝牙模拟串口问题

硬件环境:硬件多普达智能手机带蓝牙. 软件环境:Smartphone. 程序主干: 1.g_hComDevice= RegisterDevice (L\"COM\", ComIndex, L\"btd.dll\", (DWORD)&pp);    //创建虚拟串口,本地为服务器端 2.g_hComFile = CreateFile (szComPort, ...…

查看全部问答>

UltraEdit的SystemVerilog关键词设置共享

SystemVerilog部分在文件末尾(/L15 打头),每个人的惯用语言不一样,如果你只需要增加SystemVerilog部分而保留其它设置,则把这最后一部分拷下贴到你的 WORDFILE.TXT中就可(别忘了把该文件设为WORDLIST文件:菜单-> 高级->配置->语法高 ...…

查看全部问答>

sd卡读写

u8 MSD_ReadBlock(u8* pBuffer, u32 ReadAddr, u16 NumByteToRead){  u32 i = 0;  u8 rvalue = MSD_RESPONSE_FAILURE;  /* MSD chip&n ...…

查看全部问答>

自加密源代码:

把下面的程序段加在main的最前,可以让你的代码自行加密,不会在烧录时产生漏网之鱼://Led_Config(); if(FLASH_GetReadOutProtectionStatus() == SET) {   //Led1_ON();Led2_OFF();Led3_OFF();Led4_OFF() ...…

查看全部问答>

VHDL设计的消抖与滤波2009

在同一块电路板上,由于信号线的走线过长而产生的高频毛刺我们可以通过在接近输入端串联一个100欧左右的电阻来滤除。但是对于板外信号,或者板内其他干扰造成较大的抖动时只好采用积分电路来滤波,即串一个电阻还要并一个电容接地。 同样在VHDL ...…

查看全部问答>