首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

STM32之CAN---发送管理分析(2)

STM32之CAN---发送管理分析(2)

3 取消发送发送邮箱中待发送的报文在正常发送成功之前也可以中途取消,通过对CAN_TSR寄存器的ABRQ位置’1’,可以中止发送请求。
  • 当发送邮箱处于挂号或预定状态时:发送请求马上就被中止了。
  • 当发送邮箱处于发送状态时:
         那么中止请求可能导致2种结果:                    1:如果邮箱中的报文被成功发送,那么邮箱变为空邮箱,并且CAN_TSR寄存器(CAN发送状态寄存器)的TXOK位被硬件置’1’;
                    2:如果邮箱中的报文发送失败了,那么邮箱变为预定状态,然后发送请求被中止,邮箱变为空邮箱且TXOK位被硬件清’0’。
       因此,不管如何,一旦取消发送,那么在发送操作结束后,邮箱都会变为空邮箱。
       固件库中取消发送的接口为:
[cpp] view plaincopy

  • /**
  •   * @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)即负责此工作的。
继承事业,薪火相传
返回列表