尊敬的团队:
我的客户想知道在发送带有 DCAN 模块的消息时如何更改 DLC。
他修改了 canTransmit 函数中的 DLC 值、但仍然失败。
他想知道是否有参考流程。 他已经阅读过 TRM 很多次、但仍然不理解。
此致
绿色
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
尊敬的团队:
我的客户想知道在发送带有 DCAN 模块的消息时如何更改 DLC。
他修改了 canTransmit 函数中的 DLC 值、但仍然失败。
他想知道是否有参考流程。 他已经阅读过 TRM 很多次、但仍然不理解。
此致
绿色
绿色环保、
您可以在将数据从 IFx 寄存器传输到 DCAN 消息 RAM 或邮箱之前更新 DLC。 HAL 代码没有用于更新 DLC 的 API、但您可以编写自己的 API。 例如:
void canUpdateDLC (canBASE-t *节点、uint32 MessageBox、uint8 msgBoxDLC)
{
/**-等待 IF2就绪可供使用*/
while ((node->IF2STAT & 0x80U)=0x80U)
{
}/*等待*/
NOD->IF2CMD = 0x90U;
NODe->IF2MCTL &= ~(uint32)(0xFU);
NODe->IF2MCTL |=(uint32)(msgBoxDLC 和0xFU);
NOode->IF2NO =(uint8) MessageBox;
/**-等待数据被复制到 IF2中*/
while ((node->IF2STAT & 0x80U)=0x80U)
{
}/*等待*/
}
报文对象的数据长度码必须定义为与其他节点上具有相同标识符的相应对象中的值相同。
您好 QJ:
我们是否可以将该程序放入 传输函数中?
uint32 canTransmit (canBASE-t *节点、uint32 MessageBox、const uint8 * data、uint8 msgBoxDLC)
{
uint32 i;
uint32成功= 0U;
uint32 regIndex =(MessageBox - 1U)>> 5U;
uint32 bitIndex = 1U <<(MessageBox - 1U)和0x1FU);
/*用户代码开始(7)*////在此处添加
/**-等待 IF2就绪可供使用*/
while ((node->IF2STAT & 0x80U)=0x80U)
{
}/*等待*/
NOD->IF2CMD = 0x90U;
NODe->IF2MCTL &=~(uint32)(0xFU);
NODe->IF2MCTL |=(uint32)(msgBoxDLC 和0xFU);
NOode->IF2NO =(uint8) MessageBox;
/**-等待数据被复制到 IF2中*/
while ((node->IF2STAT & 0x80U)=0x80U)
{
}/*等待*/
/*用户代码结束*/
/**-检查待处理消息:
*-待处理消息、返回0
*-无待处理消息、开始新传输
*
if ((node->TXRQx[regIndex]& bitIndex)!= 0U)
{
成功= 0U;
}
其他
{
/**-等待 IF1准备就绪可供使用*/
/*SAFETYMCUSW 28 D MR:NA "找到可能无限的循环-执行序列的硬件状态检查"*/
while ((node->IF1STAT & 0x80U)=0x80U)
{
}/*等待*/
/**-为配置 IF1
*-消息方向-写入
*-数据更新
*-开始传输
*
/*SAFETYMCUSW 28 D MR:NA "找到可能无限的循环-执行序列的硬件状态检查"*/
/**-将 TX 数据复制到 IF1中*/
对于(i = 0U;i < msgBoxDLC;i++)//将此处的周期条件更改为 DLC
{
#if ((__little_endian__= 1)||(__little_ENDIAN__= 1)
/*SAFETYMCUSW 45 D MR:21.1 "仅此驱动程序允许有效的非 NULL 输入参数"*/
NODE->IF1DATx[i]=*数据;
/*SAFETYMCUSW 45 D MR:21.1 "仅此驱动程序允许有效的非 NULL 输入参数"*/
Data++;
其他
/*SAFETYMCUSW 45 D MR:21.1 "仅此驱动程序允许有效的非 NULL 输入参数"*/
NODE->IF1DATx[s_canByteOrder[i]=*数据;
/*SAFETYMCUSW 45 D MR:21.1 "仅此驱动程序允许有效的非 NULL 输入参数"*/
Data++;
#endif
}
/**-将 TX 数据复制到消息框中*/
/*SAFETYMCUSW 93 S MR:6.1、6.2、10.1、10.2、10.3、10.4 "LDRA 工具问题"*/
NOode->IF1NO =(uint8) MessageBox;
成功= 1U;
}
/**@请注意,必须先调用函数 canInit,然后才能使用此函数。\n
*用户负责初始化消息框。
*
/*用户代码开始(8)*/
/*用户代码结束*/
返回成功;
}
2、如何在收到的消息中读取 DLC?
此致
是的、您可以向传输 API 添加新 ID DLC。
[引用 userid="306637" url="~/support/microcontrollers/arm-based microcontrollers-group/arm-based microcontrollers/f/arm-based microcontrollers-forume/1107121/tms570lc4357-how-to-change-dlc-when 发送/4103211#4103211"]/**-将数据复制到 IF1Tx/*您不必将8更改为 msgBoxDLC。 无论 DLC 的大小如何、都将8字节数据从 IFx 数据寄存器(A 和 B)传输到消息 RAM。
[引用 userid="306637" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1107121/tms570lc4357-how-to-change-dlc-when -sending /4103211#4103211"]如何在收到的消息中读取 DLC/quote?[DLC 是消息控制寄存器的一部分。 您需要设置 CMD 寄存器的控制位并清除 CMD 寄存器的 W/R 位、以便将 DLC 从消息 RAM 传输到 FX 寄存器:

canGetData (0 API 包括以下部分:
/**-为配置 IF2
*-消息方向-读取
*-数据读取
*-清除报文对象中的 NewDat 位。
*
节点->IF2CMD = 0x17U;
/**-将数据复制到 IF2中*/
/*SAFETYMCUSW 93 S MR:6.1、6.2、10.1、10.2、10.3、10.4 "LDRA 工具问题"*/
NOode->IF2NO =(uint8) MessageBox;
/**-等待数据被复制到 IF2中*/
/*SAFETYMCUSW 28 D MR:NA "找到可能无限的循环-执行序列的硬件状态检查"*/
while ((node->IF2STAT & 0x80U)=0x80U)
{
}/*等待*/
/**-获取接收到的字节数*/
大小=节点->IF2MCTL & 0xFU;
if (size > 0x8U)
{
大小= 0x8U;
}
/**-将 RX 数据复制到目的缓冲区中*/