主题中讨论的其他器件:HALCOGEN
你(们)好
更新 CAN 消息对象时遇到问题。 我正在进行原型设计的应用将需要超过64个 CAN 消息、因此我必须动态更改消息对象的内容。
我已经使用 HALCoGen 生成代码、然后编写了 CanTransmit 的修改版本、请参阅下面的代码片段。 ID 和 DLC 正确、但在 CAN 总线上不存在数据。
我缺少什么?
uint32 ExtCanTransmit (canBASE-t *节点、uint32 MessageBox、uint16 msgBoxArbitVal、uint8 DLC、const uint8 *数据)
{
uint32 i;
uint32成功= 0U;
uint32 regIndex =(MessageBox - 1U)>> 5U;
uint32 bitIndex = 1U <<(MessageBox - 1U)和0x1FU);
//检查输入参数
if (MessageBox > 64U || msgBoxArbitVal > 0x7FFU || DLC > 8U){
//错误! TODO 添加断言
返回0;
}
/**-检查待处理消息:
*-待处理消息、返回0
*-无待处理消息、开始新传输
*
if ((node->TXRQx[regIndex]& bitIndex)!= 0U){
成功= 0U;
}
否则{
//接口寄存器是否可用?
if ((node->IF1STAT & 0x80U)=0U){
// IF1是免费的
NOD->IF1CMD = 0xB7U;// Dir =写入、访问仲裁位、控制位、数据 A 和数据 B
NOE->IF1ARB &= 0xE0000000U;//保持 MsgVal、XTD 和 Dir 设置。
NODe->IF1ARB |=((UINT32)(msgBoxArbitVal & 0x7FFU)<<18U);//将传递的值复制到仲裁寄存器中。
NODE->IF1MCTL &= 0xFFFFFFF0U;//保留除 DLC 之外的所有内容。
NODE->IF1MCTL |=((UINT32) DLC & 0x0000000FU);//复制 DLC。
//复制 TX 数据
对于(I = 0U;I < DLC;I++){
NODE->IF1DATx[i]=*数据;
Data++;
}
//将 TX 数据复制到消息框中
NOode->IF1NO =(uint8) MessageBox;
成功= 1U;
}
否则{
//没有可用的接口寄存器,请稍后重试。
成功= 0U;
}
}
返回成功;
}