2017-05-08 168 views
-1

我正在使用具有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} 預先感謝您。

回答

0

應該爲CAN1啓用回調以設置rxComplete = true;

+0

是的!我只是取消註釋:FLEXCAN_TransferCreateHandle(EXAMPLE_CAN1,&flexcanHandle,flexcan_callback,NULL);並工作...嘗試了很多組合,忘記了評論。謝謝! :) –