在线时间94 小时
UID3617445
注册时间2020-2-7
NXP金币9
TA的每日心情 | 开心 2023-2-28 15:37 |
---|
签到天数: 42 天 [LV.5]常住居民I
版主
- 积分
- 1369
- 最后登录
- 2024-2-23
|
LPC54s系列can包错乱解决方法
问题:在0.5ms的速率发送三个can包,发现can包错乱(canid和data不一致)
解决:在读取过发现多任务情况下,在can包接收过程中数据没有出错,但是在应用曾收到数据时出错。
查看can代码,发现MCAN_ReadRxFifo中canid是copy,而data是指针指向地址,从而有可能在应用层获取数据的时候,
can data地址中数据又发生了变化(can又发送包来了),但是由于canid是copy,所以此时还没有发送变化,
故导致canid和can data不一致,
将
memcpy(rxFrame, elementAddress, 8U);
rxFrame->data = (uint8_t *)elementAddress + 8U;
改成
memcpy(rxFrame, elementAddress, 8U);
//rxFrame->data = (uint8_t *)elementAddress + 8U;
memcpy(rxFrame->data, (uint8_t *)elementAddress + 8U, 8U);
- status_t MCAN_ReadRxFifo(CAN_Type *base, uint8_t fifoBlock, mcan_rx_buffer_frame_t *rxFrame)
- {
- /* Assertion. */
- assert((0U == fifoBlock) || (1U == fifoBlock));
- assert(NULL != rxFrame);
-
- mcan_rx_buffer_frame_t *elementAddress = NULL;
- if (0U == fifoBlock)
- {
- elementAddress = (mcan_rx_buffer_frame_t *)(MCAN_GetMsgRAMBase(base) + MCAN_GetRxFifo0ElementAddress(base));
- }
- else
- {
- elementAddress = (mcan_rx_buffer_frame_t *)(MCAN_GetMsgRAMBase(base) + MCAN_GetRxFifo1ElementAddress(base));
- }
- memcpy(rxFrame, elementAddress, 8U);
- //rxFrame->data = (uint8_t *)elementAddress + 8U;
- memcpy(rxFrame->data, (uint8_t *)elementAddress + 8U, 8U);
- /* Acknowledge the read. */
- if (0U == fifoBlock)
- {
- base->RXF0A = (base->RXF0S & CAN_RXF0S_F0GI_MASK) >> CAN_RXF0S_F0GI_SHIFT;
- }
- else
- {
- base->RXF1A = (base->RXF1S & CAN_RXF1S_F1GI_MASK) >> CAN_RXF1S_F1GI_SHIFT;
- }
- return kStatus_Success;
- }
复制代码
|
|