Canbus 发送但不接收

标签 c signals microcontroller nxp-microcontroller can-bus

我正在使用具有 CAN0 和 CAN1 总线的 K66F 微 Controller 实现简单的 canbus 通信。目标是将消息从 CAN0 发送到 CAN1。

我正在使用 NXP 为 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;

关于Canbus 发送但不接收,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43858116/

相关文章:

c - 使用feof将文本文件中的单词存储到char数组中

c - 再执行一次 while 循环的标准用法

c - 位数组的使用方法

python - 如何查找信号是否连接到任何东西

c - SIGINT(ctrl+c) 不中断接受调用

android - 设置 OpenGL ES 1.1 和我的 android 环境

c - UNIX 中的 sigprocmask( ) 阻塞信号

微 Controller 寄存器的更干净的命名空间

c - 需要转换数据(字节值转换为十六进制,十六进制字符转换为ASCII字符)

c - PIC 微 Controller : Scan inputs on a 4x4 Keypad, 在 C 中仅使用端口 C RC0-RC3