查看: 3274|回复: 2

[求助] K66 can发送问题

[复制链接]

该用户从未签到

11

主题

43

帖子

0

中级会员

Rank: 3Rank: 3

积分
418
最后登录
2024-3-22
发表于 2020-3-16 21:07:11 | 显示全部楼层 |阅读模式
      请教一下使用过can的朋友,最近在折腾k66芯片的can通讯,利用官方ksdk2.5.0中的flexbus驱动例程改写,can接口外无任何芯片,采用回环模式测试,收发正常,接受模块可以准确测量到发送模块的数据;      但把例程中的回环模式关闭之后(该false),发送模块会堵塞在发送过程中,无法跳出发送完成标志判断循环,用示波器看发送引脚,引脚一直有波形输出,不知为什么发送模块收不到完成标志从而跳出发送,从回环模式改会普通模式除了设置“enableLoopBack”外,还需要设置什么?

      此外,我还试了一下把cantx和canrx短接,虽然一直有波形,发送无法跳出,接收模块也收不到数据,直接这样做普通模式测试可以么?
      以下是我的代码(完全按照官方回环测试例程进行编写的):

//can接收中断
void CAN1_ORed_Message_buffer_IRQHandler(void)
{
    /* If new data arrived. */
    if (FLEXCAN_GetMbStatusFlags(CAN1, 1 << 10))
    {
        FLEXCAN_ClearMbStatusFlags(CAN1, 1 << 10);

        FLEXCAN_ReadRxMb(CAN1, 10, &rxFrame);

        //rxComplete = true;
    }
}

//can通讯线程
static void can_thread(void *arg)
{

    SIM->SCGC3 |= SIM_SCGC3_FLEXCAN1_MASK;

    // PORTE24 配置为CAN1_TX
    PORT_SetPinMux(PORTE, 24U, kPORT_MuxAlt2);

    // PORTE25 配置为 CAN1_RX
    PORT_SetPinMux(PORTE, 25U, kPORT_MuxAlt2);

    //获取can默认配置
    FLEXCAN_GetDefaultConfig(&flexcanConfig);

    //设置can参数
    flexcanConfig.clkSrc = kFLEXCAN_ClkSrcOsc;
    flexcanConfig.baudRate = 1000000U;
    flexcanConfig.maxMbNum = 16;
    flexcanConfig.enableLoopBack = false;  //必须设置为true,否则发送不清零
    flexcanConfig.enableSelfWakeup = false;
    flexcanConfig.enableIndividMask = false;

    //初始化can模块
    FLEXCAN_Init(CAN1, &flexcanConfig, CLOCK_GetFreq(kCLOCK_BusClk));

    // 设置 Rx Message Buffer.
    mbConfig.format = kFLEXCAN_FrameFormatStandard;
    mbConfig.type = kFLEXCAN_FrameTypeData;
    mbConfig.id = FLEXCAN_ID_STD(0x124);
    //设置can接收配置
    FLEXCAN_SetRxMbConfig(CAN1, 10, &mbConfig, true);
    //设置can发送配置
    FLEXCAN_SetTxMbConfig(CAN1, 9, true);

    // 使能 Rx Message Buffer 中断
    FLEXCAN_EnableMbInterrupts(CAN1, 1 << 10);
    EnableIRQ(CAN1_ORed_Message_buffer_IRQn);

    //FLEXCAN_DisableMbInterrupts(CAN1, 1 << 10);

    // 准备发送帧
    txFrame.format = kFLEXCAN_FrameFormatStandard;
    txFrame.type = kFLEXCAN_FrameTypeData;
    txFrame.id = FLEXCAN_ID_STD(0x123);
    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);

    while (1)
    {      
       //can发送
       FLEXCAN_TransferSendBlocking(CAN1, 9, &txFrame);

       //延时
       vTaskDelay(10);

    }
}

最佳答案

你不用回环模式要接can分析仪之类的can设备,否则就是一直不停发送
回复

使用道具 举报

该用户从未签到

712

主题

6371

帖子

0

超级版主

Rank: 8Rank: 8

积分
24915
最后登录
2025-7-23
发表于 2020-3-17 11:21:42 | 显示全部楼层
你不用回环模式要接can分析仪之类的can设备,否则就是一直不停发送
回复 支持 反对

使用道具 举报

该用户从未签到

11

主题

43

帖子

0

中级会员

Rank: 3Rank: 3

积分
418
最后登录
2024-3-22
 楼主| 发表于 2020-3-17 13:38:43 | 显示全部楼层
小恩GG 发表于 2020-3-17 11:21
你不用回环模式要接can分析仪之类的can设备,否则就是一直不停发送

can不通的问题找到了,由回环模式改为正常模式之后,can的时钟模式“kFLEXCAN_ClkSrcOsc”也需要改为“kFLEXCAN_ClkSrcPeri”,再接can总线分析仪之后,数据就不会一直发送,断开can总线分析仪之后会一直发送。

另外,can模块可以配置为不循环发送么?或者把循环时间设置短一点,没接设备时循环间隔太短了,只有几十微秒
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条

Archiver|手机版|小黑屋|恩智浦技术社区

GMT+8, 2025-7-23 11:01 , Processed in 0.089626 second(s), 24 queries , MemCache On.

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

快速回复 返回顶部 返回列表