好文档就是一把金锄头!
欢迎来到金锄头文库![会员中心]
电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

STM32的CAN总线+J1939数据格式说明.docx

4页
  • 卖家[上传人]:鑫**
  • 文档编号:256377082
  • 上传时间:2022-02-19
  • 文档格式:DOCX
  • 文档大小:32.02KB
  • / 4 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • STM32的CAN总线+J1939数据格式说明 在STM32中都是有标准的数据构造和函数供大家运用,那么对于详细的每一局部对应那些数据、每一位代表什么意思都没有详细说明特殊在运用某些协议,须要区分该局部的详细信息时,就必需对数据构造中的每位的意义清晰才能提取出详细的含义先来看一下下面的东西吧 CAN帧构造 这个就不详细介绍了,不过先提一点疑问:在STM32中干脆给构造体中各成员干脆赋值或读取,那么其实际的发送或接收的最底层的构造又是怎么样的呢? typedef struct { uint32_t StdId; uint32_t ExtId; uint8_t IDE; uint8_t RTR; uint8_t DLC; uint8_t Data[8]; uint8_t FMI; } CanRxMsg; 承受构造体和发送构造体一样,就只是构造体名不一样而已(CanTxMsg) 对于上面的问题,在一些协议中进展解析时,如何将这些标识符与协议的详细项对应呢?由于在做J1939协议的编程,所以就以这个为例说明一下 如上所示,在J1939中CAN帧构造为32位,包含优先级、PDU格式(PF)、PS、SA。

      而在STM32的构造体中却是32位的ID,8位的IDE、RTR、DLC假如要单独提取标识符中的某一个有如何提取呢? 这就涉及到STM32的收发邮箱的存放器存储构造了来看一下其标识符存放器构造吧 〔接收和发送存放器构造除0位外都一样〕 位 31:21 20:3 2 1 0 名称 STID[10:0] EXID[17:0] IDE RTR TXRQ(发送) / 保存(承受) 说明 标准标识符或扩展标识符的高字节 扩展标识符 扩展帧标识的低字节 0:运用标准标识符 1:运用扩展标识符 0:数据帧 1:远程帧 发送数据恳求/保存 对于J1939协议来说,必需对帧数据和优先级、PF、PS、SA进展双向解析所以我们在发送数据或收到数据时必需做必须的处理在STM32的固件库函数中该存放器中的各个局部的值提取出来赋给其构造体中个局部的值发送数据时:u32 Id_Ext = 0x00000000;Id_Ext = Id_Ext|Priority>16)|Pdu_PF)8)|Pdu_Ps)>16; PDU_PS = (RxMessage.ExtId&0x0000ff00)>>8; PDU_SA = RxMessage.ExtId&0x000000FF;留意:在帧构造图中我们看到PF被分成了两局部,而在上面的处理中PF却是连在一起的8位。

      这又是怎么回事呢?这就要归结为ExtId这个构造体成员的详细形式了 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 0无效位 15 14 13 优先级3位 12 11 PS 10 R(0) DP(0) 9 8 7 6 5 4 PF 3 SA 2 1 0 我想通过这个ExtId数据位构造的说明,对于如何对帧数据和优先级、PF、PS、SA进展双向解析有了比拟清晰的相识了吧大家可以结合下面这个STM32中的函数比照着看更简单理解void CAN_Receive(CAN_TypeDef* CANx, uint8_t FIFONumber, CanRxMsg* RxMessage) { /* Check the parameters */ assert_param(IS_CAN_ALL_PERIPH(CANx)); assert_param(IS_CAN_FIFO(FIFONumber)); /* Get the Id */ RxMessage->IDE = (uint8_t)0x04 & CANx->sFIFOMailBox[FIFONumber].RIR; if (RxMessage->IDE == CAN_ID_STD) { RxMessage->StdId = (uint32_t)0x000007FF & (CANx->sFIFOMailBox[FIFONumber].RIR>> 21); } else { RxMessage->ExtId = (uint32_t)0x1FFFFFFF & (CANx->sFIFOMailBox[FIFONumber].RIR >> 3); } RxMessage->RTR = (uint8_t)0x02 & CANx->sFIFOMailBox[FIFONumber].RIR; /* Get the DLC */ RxMessage->DLC = (uint8_t)0x0F & CANx->sFIFOMailBox[FIFONumber].RDTR; /* Get the FMI */ RxMessage->FMI = (uint8_t)0xFF & (CANx->sFIFOMailBox[FIFONumber].RDTR >> 8); /* Get the data field */ RxMessage->Data[0] = (uint8_t)0xFF & CANx->sFIFOMailBox[FIFONumber].RDLR; RxMessage->Data[1] = (uint8_t)0xFF & (CANx->sFIFOMailBox[FIFONumber].RDLR >> 8); RxMessage->Data[2] = (uint8_t)0xFF & (CANx->sFIFOMailBox[FIFONumber].RDLR >> 16); RxMessage->Data[3] = (uint8_t)0xFF & (CANx->sFIFOMailBox[FIFONumber].RDLR >> 24); RxMessage->Data[4] = (uint8_t)0xFF & CANx->sFIFOMailBox[FIFONumber].RDHR; RxMessage->Data[5] = (uint8_t)0xFF & (CANx->sFIFOMailBox[FIFONumber].RDHR >> 8); RxMessage->Data[6] = (uint8_t)0xFF & (CANx->sFIFOMailBox[FIFONumber].RDHR >> 16); RxMessage->Data[7] = (uint8_t)0xFF & (CANx->sFIFOMailBox[FIFONumber].RDHR >> 24); /* Release the FIFO */ CAN_FIFORelease(CANx, FIFONumber); } 本文来源:网络收集与整理,如有侵权,请联系作者删除,谢谢!第4页 共4页第 4 页 共 4 页第 4 页 共 4 页第 4 页 共 4 页第 4 页 共 4 页第 4 页 共 4 页第 4 页 共 4 页第 4 页 共 4 页第 4 页 共 4 页第 4 页 共 4 页第 4 页 共 4 页。

      点击阅读更多内容
      关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
      手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
      ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.