在线时间270 小时
UID378482
注册时间2015-2-15
NXP金币89
TA的每日心情 | 奋斗 2021-7-8 09:06 |
---|
签到天数: 27 天 [LV.4]偶尔看看III
金牌会员
- 积分
- 2209
- 最后登录
- 2024-3-5
|
楼主 |
发表于 2020-5-21 12:50:58
|
显示全部楼层
打断点然后对比SDK2.6和SDK2.7的CAN寄存器值,发现寄存器值都一样,不是CAN配置的问题。最后通过替换两个版本的函数,发现问题在中断处理函数上,SDK2.7的CAN中断处理函数比SDK2.6复杂了不少,还没想好如何修改。
void MCAN_TransferHandleIRQ(CAN_Type *base, mcan_handle_t *handle)
SDK2.6的代码如下:
- /* Assertion. */
- assert(handle);
- status_t status = kStatus_MCAN_UnHandled;
- uint32_t result;
- /* Store Current MCAN Module Error and Status. */
- result = base->IR;
- do
- {
- /* Solve Rx FIFO, Tx interrupt. */
- if (result & kMCAN_TxTransmitCompleteFlag)
- {
- status = kStatus_MCAN_TxIdle;
- MCAN_TransferAbortSend(base, handle, handle->txbufferIdx);
- }
- else if (result & kMCAN_RxFifo0NewFlag)
- {
- MCAN_ReadRxFifo(base, 0, handle->rxFifoFrameBuf);
- status = kStatus_MCAN_RxFifo0Idle;
- MCAN_TransferAbortReceiveFifo(base, 0, handle);
- }
- else if (result & kMCAN_RxFifo0LostFlag)
- {
- status = kStatus_MCAN_RxFifo0Lost;
- }
- else if (result & kMCAN_RxFifo1NewFlag)
- {
- MCAN_ReadRxFifo(base, 1, handle->rxFifoFrameBuf);
- status = kStatus_MCAN_RxFifo1Idle;
- MCAN_TransferAbortReceiveFifo(base, 1, handle);
- }
- else if (result & kMCAN_RxFifo1LostFlag)
- {
- status = kStatus_MCAN_RxFifo0Lost;
- }
- else
- {
- ;
- }
- /* Clear resolved Rx FIFO, Tx Buffer IRQ. */
- MCAN_ClearStatusFlag(base, result);
- /* Calling Callback Function if has one. */
- if (handle->callback != NULL)
- {
- handle->callback(base, handle, status, result, handle->userData);
- }
- /* Reset return status */
- status = kStatus_MCAN_UnHandled;
- /* Store Current MCAN Module Error and Status. */
- result = base->IR;
- } while ((0 != MCAN_GetStatusFlag(base, 0xFFFFFFFFU)) ||
- (0 != (result & (kMCAN_ErrorWarningIntFlag | kMCAN_BusOffIntFlag | kMCAN_ErrorPassiveIntFlag))));
复制代码
SDK2.7的代码如下:
- /* Assertion. */
- assert(NULL != handle);
- status_t status = kStatus_MCAN_UnHandled;
- uint32_t valueIR;
- uint32_t result;
- /* Store Current MCAN Module Error and Status. */
- valueIR = base->IR;
- do
- {
- if (0U != (valueIR & ((uint32_t)kMCAN_ErrorWarningIntFlag | (uint32_t)kMCAN_ErrorPassiveIntFlag |
- (uint32_t)kMCAN_BusOffIntFlag)))
- {
- /* Solve error. */
- result = (uint32_t)kMCAN_ErrorWarningIntFlag | (uint32_t)kMCAN_ErrorPassiveIntFlag |
- (uint32_t)kMCAN_BusOffIntFlag;
- status = kStatus_MCAN_ErrorStatus;
- }
- else if (0U != (valueIR & (uint32_t)kMCAN_TxTransmitCompleteFlag))
- {
- /* Solve Tx interrupt. */
- result = (uint32_t)kMCAN_TxTransmitCompleteFlag;
- status = kStatus_MCAN_TxIdle;
- MCAN_TransferAbortSend(base, handle, handle->txbufferIdx);
- }
- else if (0U != (valueIR & (uint32_t)kMCAN_RxFifo0NewFlag))
- {
- (void)MCAN_ReadRxFifo(base, 0U, handle->rxFifoFrameBuf);
- result = (uint32_t)kMCAN_RxFifo0NewFlag;
- status = kStatus_MCAN_RxFifo0Idle;
- MCAN_TransferAbortReceiveFifo(base, 0U, handle);
- }
- else if (0U != (valueIR & (uint32_t)kMCAN_RxFifo0LostFlag))
- {
- result = (uint32_t)kMCAN_RxFifo0LostFlag;
- status = kStatus_MCAN_RxFifo0Lost;
- }
- else if (0U != (valueIR & (uint32_t)kMCAN_RxFifo1NewFlag))
- {
- (void)MCAN_ReadRxFifo(base, 1U, handle->rxFifoFrameBuf);
- result = (uint32_t)kMCAN_RxFifo1NewFlag;
- status = kStatus_MCAN_RxFifo1Idle;
- MCAN_TransferAbortReceiveFifo(base, 1U, handle);
- }
- else if (0U != (valueIR & (uint32_t)kMCAN_RxFifo1LostFlag))
- {
- result = (uint32_t)kMCAN_RxFifo1LostFlag;
- status = kStatus_MCAN_RxFifo0Lost;
- }
- else
- {
- /* Handle the interrupt flag unsupported in current version of MCAN driver.
- * User can get these unsupported interrupt flags by callback function,
- * we can clear directly in the handler to prevent endless loop.
- */
- result = valueIR;
- result &= ~((uint32_t)kMCAN_ErrorWarningIntFlag | (uint32_t)kMCAN_ErrorPassiveIntFlag |
- (uint32_t)kMCAN_BusOffIntFlag | (uint32_t)kMCAN_TxTransmitCompleteFlag |
- (uint32_t)kMCAN_RxFifo0NewFlag | (uint32_t)kMCAN_RxFifo0LostFlag |
- (uint32_t)kMCAN_RxFifo1NewFlag | (uint32_t)kMCAN_RxFifo1LostFlag);
- }
- /* Clear Error interrupt, resolved Rx FIFO, Tx Buffer IRQ and other unsupported interrupt flags. */
- MCAN_ClearStatusFlag(base, result);
- /* Calling Callback Function if has one. */
- if (handle->callback != NULL)
- {
- handle->callback(base, handle, status, result, handle->userData);
- }
- /* Reset return status */
- status = kStatus_MCAN_UnHandled;
- /* Store Current MCAN Module Error and Status. */
- valueIR = base->IR;
- } while (0U != valueIR);
复制代码
|
|