打印
[STM32F1]

CAN扩展标识符扩展帧配置

[复制链接]
8155|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
数据帧中扩展标示符的帧如何配置的啊其中还有一位SRR,可是我在野火的例程程序没看见配置SRR位啊,而且CanTXMsg库函数只有44位这是为什么啊?3.5.0的库函数扩展标识符数据帧是得自己定义一个结构体吗?
void CAN_SetMsg(void){          
  //TxMessage.StdId=0x00;                                                 
  TxMessage.ExtId=0x1314;                                         //使用的扩展ID
  TxMessage.IDE=CAN_ID_EXT;                                         //扩展模式
  TxMessage.RTR=CAN_RTR_DATA;                                 //发送的是数据
  TxMessage.DLC=2;                                                         //数据长度为2字节
  TxMessage.Data[0]=0xDC;
  TxMessage.Data[1]=0xBA;
}

typedef struct
{
  uint32_t StdId;  /*!< Specifies the standard identifier.
                        This parameter can be a value between 0 to 0x7FF. */

  uint32_t ExtId;  /*!< Specifies the extended identifier.
                        This parameter can be a value between 0 to 0x1FFFFFFF. */

  uint8_t IDE;     /*!< Specifies the type of identifier for the message that
                        will be transmitted. This parameter can be a value
                        of @ref CAN_identifier_type */

  uint8_t RTR;     /*!< Specifies the type of frame for the message that will
                        be transmitted. This parameter can be a value of
                        @ref CAN_remote_transmission_request */

  uint8_t DLC;     /*!< Specifies the length of the frame that will be
                        transmitted. This parameter can be a value between
                        0 to 8 */

  uint8_t Data[8]; /*!< Contains the data to be transmitted. It ranges from 0
                        to 0xFF. */
} CanTxMsg;

沙发
mmuuss586| | 2014-7-14 18:36 | 只看该作者
需要定义1个
CanTxMsg TxMessage;

使用特权

评论回复
板凳
panyibin133|  楼主 | 2014-7-14 21:53 | 只看该作者
mmuuss586 发表于 2014-7-14 18:36
需要定义1个
CanTxMsg TxMessage;

怎么定义啊,能给出下具体代码吗谢谢!

使用特权

评论回复
地板
airwill| | 2014-7-14 22:36 | 只看该作者
在程序里加一行
CanTxMsg TxMessage;
就行了.
CanTxMsg 这个结构在库函数里就已经定义了.
好好参考和学习一下例程吧

使用特权

评论回复
5
panyibin133|  楼主 | 2014-7-14 22:57 | 只看该作者
airwill 发表于 2014-7-14 22:36
在程序里加一行
CanTxMsg TxMessage;
就行了.

。。。不是这个意思,我问的问题是这个结构体没法和扩展标示符中的SRR,CanTxMsg TxMessage这个函数我的代码里肯定有啊,我的程序已经扩展帧发送成功了,不过由于是给客户做的需要按照他们的协议,把ID写入的时候需要占用12位,但是光直接写到ExtID不对,因为扩展标示符数据帧中有SRR,你可以仔细看我截得图的部分,我还不至于连CanTxMsg Txmessage 这个结构体都不写就发送的。。。。

使用特权

评论回复
6
airwill| | 2014-7-14 23:39 | 只看该作者
扩展格式里,基本 ID 首先发送,其次是 IDE 位和 SRR 位。扩展 ID 的发送位于 SRR 位之后。
SRR 位(扩展格式)
SRR 的全称是“替代远程请求位(Substitute Remote Request BIT)”。
SRR 是一隐性位。它在扩展格式的标准帧 RTR 位位置,因此代替标准帧的 RTR 位。
因此,标准帧与扩展帧的冲突是通过标准帧优先于扩展帧这一途径得以解决的.

这是 CAN 协议里关于 SRR 的说明, 也就是说在标准格式下没有 SRR 位, 在扩展格式下, 这位肯定是隐性位. 不用设置

使用特权

评论回复
7
panyibin133|  楼主 | 2014-7-15 09:09 | 只看该作者
airwill 发表于 2014-7-14 23:39
扩展格式里,基本 ID 首先发送,其次是 IDE 位和 SRR 位。扩展 ID 的发送位于 SRR 位之后。
SRR 位(扩展 ...

*(pMBBase + 1) = (vuint16) MCF_MBUFIDH_EXT_ID (usNewId) | MCF_MBUFIDH_IDE | MCF_MBUFIDH_SRR;
*(pMBBase + 2) = (vuint16) MCF_MBUFIDL_EXT_ID (usNewId);

#define MCF_MBUFIDH_EXT_ID(x)                        ((((x)&0x1ffc0000)>>13)|(((x)&0x00038000)>>15))
#define MCF_MBUFIDL_EXT_ID(x)                        (((x)&0x00007fff)<<1)
#define MCF_MBUFIDH_SRR                                        (0x0010)
#define MCF_MBUFIDH_IDE                                        (0x0008)
这是给出的FlexCAN的ID部分,我如何去写入到Txmessage.ExtId呢,求大神解释指点给出下代码,卡了好多天了

使用特权

评论回复
8
airwill| | 2014-7-15 19:50 | 只看该作者
看看我的代码吧
        CAN_FilterInitStructure.CAN_FilterIdHigh = CAN_ID/8192;
        CAN_FilterInitStructure.CAN_FilterIdLow = CAN_ID%8192*8+CAN_ID_EXT;

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

9

主题

29

帖子

1

粉丝