2017-05-08 25 views
-1

CAN0とCAN1バスを持つK66Fマイクロコントローラを使用して簡単なCANBUS通信を実装しています。目的は、CAN0からCAN1へメッセージを送信することです。Canbusは送信していますが受信していません

私は、K66FボードからNXPが提供するサンプルコードを使用しています。問題は、ロジックアナライザを使用すると、メッセージが送信され、確認されたことがわかりますが、メッセージが確認済みであることがわかりましたが、プログラムは!rxcompleteで停止しています。したがって、私はいくつかの設定パラメータが正しく設定されていないと仮定します。

パラメータが正しいかどうかわかりません。電子配線は、送られたメッセージに応じて細かいと思う。 enter image description here} は、事前にありがとう:

#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(); 
} 
} 

これは私がロジック・アナライザで読むことができるものである。

この

は私が使用しているコードです。

答えて

0

CAN1でコールバックを有効にしてrxComplete = true;に設定する必要があります。

+0

はい!私はコメントを外しました:FLEXCAN_TransferCreateHandle(EXAMPLE_CAN1、&flexcanHandle、flexcan_callback、NULL);働いた...多くの組み合わせを試して、それがコメントされたことを忘れてしまった。ありがとうございました! :) –

関連する問題