主题中讨论的其他器件:HALCOGEN
您好!
我正在尝试使用多个模块来管理 CAN 总线、这些模块具有正确的 ModID (100、110、120...)。
每个模块有9种数据包类型(模块1的 ID 100至108、模块2的 ID 110至118)。
其中五个数据包 ID 用于从主器件到模块的消息、其余四个是模块到主器件的消息。
我使用 HalCoGen (TMS570+FreeRTOS)为 RX 配置具有掩码的消息多路复用器。 在 RTM 和此论坛的帮助下、我设法获取 RX 的 CAN ID (函数如下)。
但我对 TX ID 有一些困难。 我知道我需要编辑 IFxCMD 来设置 ARB 以更改 IFxARB、但我认为我这样做是错误的、因为 ID 没有更改。
这是我的 TX 函数,是否有人可以帮助我?
uint32_t canTransmitID (canBASE-t *节点、uint32_t MessageBox、const uint8_t *数据、uint32_t msgBoxID)
{
uint32_t i;
uint32_t Success = 0U;
uint32_t regIndex =(MessageBox - 1U)>> 5U;
uint32_t bitIndex = 1U <<((MessageBox - 1U)& 0x1FU);
/**-检查待处理消息:
* -待处理消息、返回0
* -无待处理消息、开始新传输
*
IF (节点->TXRQx[regIndex]和位索引)
{
返回成功;
}
/**-等待 IF1准备就绪可供使用*/
while (node->IF1STAT & 0x80);
/**-将 TX 数据复制到 IF1中*/
对于(I = 0U;I < 8U;I++)
{
#ifdef __little_endian__
NODE->IF1DATx[i]=*数据++;
其他
NODE->IF1DATx[s_canByteOrder[i]=*数据++;
#endif
}
NOD->IF1CMD |= 0x200000U;
NOE->IF1ARB &= 0xE0000000U;
NODe->IF1ARB |=(msgBoxID 和0x1FFFFFFFU);
/**-将 TX 数据复制到消息框中*/
节点->IF1NO = MessageBox;
成功= 1U;
返回成功;
}
uint32_t canGetID (canBASE-t *节点、uint32_t MessageBox)
{
uint32_t msgBoxID = 0U;
/**-等待 IF2就绪可供使用*/
while (node->IF2STAT & 0x80);
/**-为配置 IF2
* -消息方向-读取
* -数据读取
* -清除报文对象中的 NewDat 位。
*
NOD->IF2CMD = 0x20U;
/**-将数据复制到 IF2中*/
节点->IF2NO = MessageBox;
/**-等待数据被复制到 IF2中*/
while (node->IF2STAT & 0x80);
/*从仲裁寄存器读取消息框 ID。 *
msgBoxID =(节点->IF2ARB & 0x1FFFFFFFU);
返回 msgBoxID;
}
谢谢、
此致、
Jean-Marie