Canbus传输,但没有收到

问题描述:

我正在使用具有CAN0和CAN1总线的K66F微控制器实现简单的canbus通信。目标是从CAN0发送一条消息到CAN1。Canbus传输,但没有收到

我正在使用恩智浦提供的K66F开发板示例代码。问题在于,当使用逻辑分析器时,我可以看到消息已发送并得到确认,但程序仍然停留在!rxcomplete中,即使我可以清楚地看到消息已被确认。因此我假设我有一些配置参数设置不正确。

我不知道我的参数是否正确。根据发送的信息,我认为电子线路很好。

这是我使用的代码:

#include "fsl_debug_console.h" 
#include "fsl_flexcan.h" 
#include "board.h" 

#include "pin_mux.h" 
#include "clock_config.h" 
/**************************************************************************** 
* Definitions 
***************************************************************************/ 
#define EXAMPLE_CAN CAN0 
#define EXAMPLE_CAN1 CAN1 
#define EXAMPLE_CAN_CLKSRC1 kCLOCK_BusClk 
#define EXAMPLE_CAN_CLKSRC kCLOCK_BusClk 
#define RX_MESSAGE_BUFFER_NUM (8) 
#define TX_MESSAGE_BUFFER_NUM (9) 

/*************************************************************************** 
* Prototypes 
*****************************************************************************/ 

/*************************************************************************** 
* Variables 
***************************************************************************/ 
volatile bool txComplete = false; 
volatile bool rxComplete = false; 
flexcan_handle_t flexcanHandle; 
flexcan_mb_transfer_t txXfer, rxXfer; 
flexcan_frame_t txFrame, rxFrame; 
int status; 
/*************************************************************************** 
* Code 
***************************************************************************/ 
/*! 
* @brief FlexCAN Call Back function 
*/ 
static void flexcan_callback(CAN_Type *base, flexcan_handle_t *handle,   status_t status, uint32_t result, void *userData) 
{ 
switch (status) 
{ 
    /* Process FlexCAN Rx event. */ 
    case kStatus_FLEXCAN_RxIdle: 
     PRINTF("prueba \n"); 
     if (RX_MESSAGE_BUFFER_NUM == result) 
     { 
      rxComplete = true; 
     } 
     break; 

    /* Process FlexCAN Tx event. */ 
    case kStatus_FLEXCAN_TxIdle: 

     if (TX_MESSAGE_BUFFER_NUM == result) 
     { 
      txComplete = true; 
     } 
     break; 

    default: 
     break; 
} 


/*! 
* @brief Main function 
*/ 
int main(void) 
{ 
flexcan_config_t flexcanConfig; 
flexcan_rx_mb_config_t mbConfig; 

/* Initialize board hardware. */ 
BOARD_InitPins(); 
BOARD_BootClockRUN(); 
BOARD_InitDebugConsole(); 

PRINTF("\r\n==FlexCAN loopback example -- Start.==\r\n\r\n"); 

/* Init FlexCAN module. */ 
/* 
* flexcanConfig.clkSrc = kFLEXCAN_ClkSrcOsc; 
* flexcanConfig.baudRate = 125000U; 
* flexcanConfig.maxMbNum = 16; 
* flexcanConfig.enableLoopBack = false; 
* flexcanConfig.enableSelfWakeup = false; 
* flexcanConfig.enableIndividMask = false; 
* flexcanConfig.enableDoze = false; 
*/ 
FLEXCAN_GetDefaultConfig(&flexcanConfig); 
flexcanConfig.clkSrc = kFLEXCAN_ClkSrcPeri; 
//flexcanConfig.enableLoopBack = true; 
flexcanConfig.baudRate = 125000U; 
FLEXCAN_Init(EXAMPLE_CAN, &flexcanConfig, CLOCK_GetFreq(EXAMPLE_CAN_CLKSRC)); 
FLEXCAN_Init(EXAMPLE_CAN1, &flexcanConfig, CLOCK_GetFreq(EXAMPLE_CAN_CLKSRC)); 

/* Setup Rx Message Buffer. */ 
mbConfig.format = kFLEXCAN_FrameFormatStandard; 
mbConfig.type = kFLEXCAN_FrameTypeData; 
mbConfig.id = FLEXCAN_ID_STD(0x223); 
FLEXCAN_SetRxMbConfig(EXAMPLE_CAN1, RX_MESSAGE_BUFFER_NUM, &mbConfig, true); 

/* Setup Tx Message Buffer. */ 
FLEXCAN_SetTxMbConfig(EXAMPLE_CAN, TX_MESSAGE_BUFFER_NUM, true); 

/* Create FlexCAN handle structure and set call back function. */ 
FLEXCAN_TransferCreateHandle(EXAMPLE_CAN, &flexcanHandle, flexcan_callback, NULL); 
//FLEXCAN_TransferCreateHandle(EXAMPLE_CAN1, &flexcanHandle, flexcan_callback, NULL); 

/* Start receive data through Rx Message Buffer. */ 
rxXfer.frame = &rxFrame; 
rxXfer.mbIdx = RX_MESSAGE_BUFFER_NUM; 
FLEXCAN_TransferReceiveNonBlocking(EXAMPLE_CAN1, &flexcanHandle, &rxXfer); 
PRINTF("status=%d \n", status); 

/* Prepare Tx Frame for sending. */ 
txFrame.format = kFLEXCAN_FrameFormatStandard; 
txFrame.type = kFLEXCAN_FrameTypeData; 
txFrame.id = FLEXCAN_ID_STD(0x223); 
txFrame.length = 8; 
txFrame.dataWord0 = CAN_WORD0_DATA_BYTE_0(0x11) | CAN_WORD0_DATA_BYTE_1(0x22) | CAN_WORD0_DATA_BYTE_2(0x33) | 
        CAN_WORD0_DATA_BYTE_3(0x44); 
txFrame.dataWord1 = CAN_WORD1_DATA_BYTE_4(0x55) | CAN_WORD1_DATA_BYTE_5(0x66) | CAN_WORD1_DATA_BYTE_6(0x77) | 
        CAN_WORD1_DATA_BYTE_7(0x88); 

PRINTF("Send message from MB%d to MB%d\r\n", TX_MESSAGE_BUFFER_NUM, RX_MESSAGE_BUFFER_NUM); 
PRINTF("tx word0 = 0x%x\r\n", txFrame.dataWord0); 
PRINTF("tx word1 = 0x%x\r\n", txFrame.dataWord1); 

/* Send data through Tx Message Buffer. */ 
txXfer.frame = &txFrame; 
txXfer.mbIdx = TX_MESSAGE_BUFFER_NUM; 
FLEXCAN_TransferSendNonBlocking(EXAMPLE_CAN, &flexcanHandle, &txXfer); 

while ((!txComplete)) 
    { 
    }; 

PRINTF("tx complete \n"); 
/* Waiting for Rx Message finish. */ 
while ((!rxComplete)) 
{ 
}; 

PRINTF("\r\nReceved message from MB%d\r\n", RX_MESSAGE_BUFFER_NUM); 
PRINTF("rx word0 = 0x%x\r\n", rxFrame.dataWord0); 
PRINTF("rx word1 = 0x%x\r\n", rxFrame.dataWord1); 

/* Stop FlexCAN Send & Receive. */ 
FLEXCAN_TransferAbortReceive(EXAMPLE_CAN1, &flexcanHandle, RX_MESSAGE_BUFFER_NUM); 
FLEXCAN_TransferAbortSend(EXAMPLE_CAN, &flexcanHandle, TX_MESSAGE_BUFFER_NUM); 

PRINTF("\r\n==FlexCAN loopback example -- Finish.==\r\n"); 

while (1) 
{ 
    __WFI(); 
} 
} 

这是我可以用逻辑分析仪阅读: enter image description here} 预先感谢您。

应该为CAN1启用回调以设置rxComplete = true;

+0

是的!我只是取消注释:FLEXCAN_TransferCreateHandle(EXAMPLE_CAN1,&flexcanHandle,flexcan_callback,NULL);并工作...尝试了很多组合,忘记了评论。谢谢! :) –