How to change DLC when sending,如何发送可变字节长度的报文
I modified the DLC value in the cantransmit function, but it still failed. 我在canTransmit函数中修改DLC的值但还是不行
有没有参考的流程,手册我已经看了很多次了还是不太明白。
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.
How to change DLC when sending,如何发送可变字节长度的报文
I modified the DLC value in the cantransmit function, but it still failed. 我在canTransmit函数中修改DLC的值但还是不行
有没有参考的流程,手册我已经看了很多次了还是不太明白。
可以在将数据从 IFx 寄存器传输到 DCAN 消息 RAM 或邮箱之前更新 DLC。 HAL 代码没有更新 DLC 的 API,但可以编写自己的 API。 例如:
void canUpdateDLC(canBASE_t *node, uint32 messageBox, uint8 msgBoxDLC) { /** - Wait until IF2 is ready for use */ while ((node->IF2STAT & 0x80U) ==0x80U) { } /* Wait */ node->IF2CMD = 0x90U; node->IF2MCTL &= ~(uint32)(0xFU); node->IF2MCTL |= (uint32)(msgBoxDLC & 0xFU); node->IF2NO = (uint8) messageBox; /** - Wait until data are copied into IF2 */ while ((node->IF2STAT & 0x80U) ==0x80U) { } /* Wait */ }
消息对象的DLC必须定义为与其他节点具有相同标识符的相应对象中的值相同。
//可以把这个程序添加在Transmit函数里面吗?
uint32 canTransmit(canBASE_t *node, uint32 messageBox, const uint8 * data,uint8 msgBoxDLC)
{
uint32 i;
uint32 success = 0U;
uint32 regIndex = (messageBox - 1U) >> 5U;
uint32 bitIndex = 1U << ((messageBox - 1U) & 0x1FU);
/* USER CODE BEGIN (7) */ //添加在这里
/** - Wait until IF2 is ready for use */
while ((node->IF2STAT & 0x80U) ==0x80U)
{
} /* Wait */
node->IF2CMD = 0x90U;
node->IF2MCTL &= ~(uint32)(0xFU);
node->IF2MCTL |= (uint32)(msgBoxDLC & 0xFU);
node->IF2NO = (uint8) messageBox;
/** - Wait until data are copied into IF2 */
while ((node->IF2STAT & 0x80U) ==0x80U)
{
} /* Wait */
/* USER CODE END */
/** - Check for pending message:
* - pending message, return 0
* - no pending message, start new transmission
*/
if ((node->TXRQx[regIndex] & bitIndex) != 0U)
{
success = 0U;
}
else
{
/** - Wait until IF1 is ready for use */
/*SAFETYMCUSW 28 D MR:NA <APPROVED> "Potentially infinite loop found - Hardware Status check for execution sequence" */
while ((node->IF1STAT & 0x80U) ==0x80U)
{
} /* Wait */
/** - Configure IF1 for
* - Message direction - Write
* - Data Update
* - Start Transmission
*/
/*SAFETYMCUSW 28 D MR:NA <APPROVED> "Potentially infinite loop found - Hardware Status check for execution sequence" */
/** - Copy TX data into IF1 */
for (i = 0U; i < msgBoxDLC; i++) //这里循环条件改成DLC
{
#if ((__little_endian__ == 1) || (__LITTLE_ENDIAN__ == 1))
/*SAFETYMCUSW 45 D MR:21.1 <APPROVED> "Valid non NULL input parameters are only allowed in this driver" */
node->IF1DATx[i] = *data;
/*SAFETYMCUSW 45 D MR:21.1 <APPROVED> "Valid non NULL input parameters are only allowed in this driver" */
data++;
#else
/*SAFETYMCUSW 45 D MR:21.1 <APPROVED> "Valid non NULL input parameters are only allowed in this driver" */
node->IF1DATx[s_canByteOrder[i]] = *data;
/*SAFETYMCUSW 45 D MR:21.1 <APPROVED> "Valid non NULL input parameters are only allowed in this driver" */
data++;
#endif
}
/** - Copy TX data into message box */
/*SAFETYMCUSW 93 S MR: 6.1,6.2,10.1,10.2,10.3,10.4 <APPROVED> "LDRA Tool issue" */
node->IF1NO = (uint8) messageBox;
success = 1U;
}
/** @note The function canInit has to be called before this function can be used.\n
* The user is responsible to initialize the message box.
*/
/* USER CODE BEGIN (8) */
/* USER CODE END */
return success;
}
1、是的,可以将新 ID、DLC 添加到传输 API。
/** - Copy TX data into IF1 */
for (i = 0U; i < msgBoxDLC; i++) //这里循环条件改成DLC
这里不必将 8 更改为 msgBoxDLC。 无论 DLC 有多小,八字节数据都会从 IFx 数据寄存器(A 和 B)传输到消息 RAM。
2、DLC 是消息控制寄存器的一部分。 您需要设置 CMD 寄存器的 CONTROL 位和 CMD 寄存器的 CLEAR W/R 位,以便将 DLC 从 Message RAM 传输到 Fx 寄存器:
canGetData(0 API include this portion:
/** - Configure IF2 for
* - Message direction - Read
* - Data Read
* - Clears NewDat bit in the message object.
*/
node->IF2CMD = 0x17U;
/** - Copy data into IF2 */
/*SAFETYMCUSW 93 S MR: 6.1,6.2,10.1,10.2,10.3,10.4 <APPROVED> "LDRA Tool issue" */
node->IF2NO = (uint8) messageBox;
/** - Wait until data are copied into IF2 */
/*SAFETYMCUSW 28 D MR:NA <APPROVED> "Potentially infinite loop found - Hardware Status check for execution sequence" */
while ((node->IF2STAT & 0x80U) ==0x80U)
{
} /* Wait */
/** - Get number of received bytes */
size = node->IF2MCTL & 0xFU;
if(size > 0x8U)
{
size = 0x8U;
}
/** - Copy RX data into destination buffer */