查看: 706|回复: 9

[原创] 【RT1176】4.FDCAN 通讯采用回调函数和中断两种方式

[复制链接]
  • TA的每日心情
    开心
    2019-3-5 08:47
  • 签到天数: 1 天

    [LV.1]初来乍到

    91

    主题

    2926

    帖子

    2

    金牌会员

    Rank: 6Rank: 6

    积分
    7799
    最后登录
    2024-4-18
    发表于 2023-6-3 19:46:48 | 显示全部楼层 |阅读模式
    本帖最后由 jundao721 于 2023-6-3 20:05 编辑

    今天测试了一下RT1176的FDCAN通讯,这种通讯方式应用挺多的。具体怎么配置波特率参考使用手册即可,默认帧波特率为1Mbps,数据波特率为2Mbps,这里暂时不讨论,以测试为主。板子上使用的是TJA1044GT/3,原理图如图1所示:

    图1

    图1

    本来重新做板以后,想着不用飞线了,测试的时候才发现采购的器件跟原理图的器件不一样,所以还是得飞一下到3.3V。如图2所示:

    图2

    图2


    官方的SDK使用的是Callback方式,源程序不太符合本人的读代码方式,对源程序进行了部分修改,主要配置如下:
    我使用的是CAN2,官方是CAN3,所以引脚和宏定义都需要修改,引脚修改如下:

    1. IOMUXC_SetPinMux(
    2.                   IOMUXC_GPIO_AD_00_FLEXCAN2_TX,        /* IOMUXC_GPIO_AD_00 is configured as FLEXCAN2_TX */
    3.        1U);
    4.    IOMUXC_SetPinMux(
    5.                    IOMUXC_GPIO_AD_01_FLEXCAN2_RX,        /* IOMUXC_GPIO_AD_01 is configured as FLEXCAN2_RX */
    6.        1U);
    7. IOMUXC_SetPinConfig(
    8.                   IOMUXC_GPIO_AD_00_FLEXCAN2_TX,      
    9.       0x02U);
    10.   IOMUXC_SetPinConfig(
    11.                   IOMUXC_GPIO_AD_01_FLEXCAN2_RX,        
    12.       0x02U);  
    复制代码
    1. #define EXAMPLE_CAN           CAN2
    2. #define EXAMPLE_FLEXCAN_IRQn       CAN2_IRQn
    3. #define EXAMPLE_FLEXCAN_IRQHandler CAN2_IRQHandler
    复制代码
    1. #define EXAMPLE_CAN_CLK_FREQ ((CLOCK_GetRootClockFreq(kCLOCK_Root_Can2) / 100000U) * 100000U)
    复制代码

    其中需要创建callback函数

    1.     /* Create FlexCAN handle structure and set call back function. */
    2. FLEXCAN_TransferCreateHandle(EXAMPLE_CAN, &flexcanHandle, flexcan_callback, NULL); //使能回调函数
    复制代码

    要实现的功能是每隔1S发送一帧数据,发送部分:

    1. frame.id     = FLEXCAN_ID_STD(txIdentifier);
    2. frame.format = (uint8_t)kFLEXCAN_FrameFormatStandard;
    3. frame.type   = (uint8_t)kFLEXCAN_FrameTypeData;
    复制代码

    接收部分callback函数不用修改,处理部分修改一下:

    1.   /* Start receive data through Rx Message Buffer. */
    2. rxXfer.mbIdx = (uint8_t)RX_MESSAGE_BUFFER_NUM;
    3. #if (defined(USE_CANFD) && USE_CANFD)
    4. rxXfer.framefd = &frame;
    5. (void)FLEXCAN_TransferFDReceiveNonBlocking(EXAMPLE_CAN, &flexcanHandle, &rxXfer);
    6. #else
    7. rxXfer.frame = &frame;
    8. (void)FLEXCAN_TransferReceiveNonBlocking(EXAMPLE_CAN, &flexcanHandle, &rxXfer);
    9. #endif
    10. (void)FLEXCAN_ReadFDRxMb(EXAMPLE_CAN, RX_MESSAGE_BUFFER_NUM, &rxFrame);
    11. /* Wait until Rx MB full. */
    12. <blockquote>while (!rxComplete)
    复制代码

    OK,回调函数方式基本上就修改完了,测试结果如图3和图4所示

    图3

    图3

    图3

    图4

    图4

    图4


    传统的是中断方式,接收中断,每隔1S发送一帧数据。这部分就得自己写中断函数了。首先注释掉创建callback函数,使能中断:

    1. FLEXCAN_EnableMbInterrupts(EXAMPLE_CAN, flag << RX_MESSAGE_BUFFER_NUM);
    2.            (void)EnableIRQ(EXAMPLE_FLEXCAN_IRQn);
    复制代码

    中断函数参考是这样的:

    1. void EXAMPLE_FLEXCAN_IRQHandler(void)
    2. {
    3. #if (defined(FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER)) && (FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER > 0)
    4.     uint64_t flag = 1U;
    5. #else
    6.     uint32_t flag = 1U;
    7. #endif
    8.     /* If new data arrived. */
    9.     if (0U != FLEXCAN_GetMbStatusFlags(EXAMPLE_CAN, flag << RX_MESSAGE_BUFFER_NUM))
    10.     {
    11.         FLEXCAN_ClearMbStatusFlags(EXAMPLE_CAN, flag << RX_MESSAGE_BUFFER_NUM);
    12. #if (defined(USE_CANFD) && USE_CANFD)
    13.         (void)FLEXCAN_ReadFDRxMb(EXAMPLE_CAN, RX_MESSAGE_BUFFER_NUM, &rxFrame);
    14. #else
    15.         (void)FLEXCAN_ReadRxMb(EXAMPLE_CAN, RX_MESSAGE_BUFFER_NUM, &rxFrame);
    16. #endif
    17.         rxComplete = true;
    18.     }
    19.     SDK_ISR_EXIT_BARRIER;
    20. }
    复制代码

    发送函数需要修改一下:

    1. (void)FLEXCAN_TransferFDSendBlocking(EXAMPLE_CAN, TX_MESSAGE_BUFFER_NUM, &frame);
    复制代码

    接收处理部分:

    1. if(rxComplete==true)
    2.            {
    3.             for ( i = 0; i < DWORD_IN_MB; i++)
    4.                 {
    5.                  rx_data[i]= rxFrame.dataWord[i];

    6.                 }
    7.             rxComplete = false;
    8.            }
    复制代码

    测试结果如图5和图6所示:

    图5

    图5



    图5

    图6

    图6

    图6


    OK,两种方式测试完成。

    加油哦
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2024-4-10 22:38
  • 签到天数: 1335 天

    [LV.10]以坛为家III

    88

    主题

    4292

    帖子

    12

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    9049
    最后登录
    2024-4-13
    发表于 2023-6-4 08:43:10 | 显示全部楼层
    CAN FD的数据长度不是8字节了。
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2019-3-5 08:47
  • 签到天数: 1 天

    [LV.1]初来乍到

    91

    主题

    2926

    帖子

    2

    金牌会员

    Rank: 6Rank: 6

    积分
    7799
    最后登录
    2024-4-18
     楼主| 发表于 2023-6-5 11:09:03 | 显示全部楼层
    jobszheng5 发表于 2023-6-4 08:43
    CAN FD的数据长度不是8字节了。

    嗯,64字节了,速度也有提升
    加油哦
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2023-6-19 09:37
  • 签到天数: 9 天

    [LV.3]偶尔看看II

    1

    主题

    28

    帖子

    0

    注册会员

    Rank: 2

    积分
    114
    最后登录
    2023-8-2
    发表于 2023-6-5 15:44:16 | 显示全部楼层
    帧ID也变长了
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2019-3-5 08:47
  • 签到天数: 1 天

    [LV.1]初来乍到

    91

    主题

    2926

    帖子

    2

    金牌会员

    Rank: 6Rank: 6

    积分
    7799
    最后登录
    2024-4-18
     楼主| 发表于 2023-6-5 19:33:52 | 显示全部楼层

    有些在实际应用中理解的更深一点
    加油哦
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2024-2-8 09:39
  • 签到天数: 217 天

    [LV.7]常住居民III

    92

    主题

    1111

    帖子

    29

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    7579

    热心会员

    最后登录
    2024-4-17
    发表于 2023-6-8 18:01:47 | 显示全部楼层
    厉害,还没有搞过RT系列的can呢
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2019-3-5 08:47
  • 签到天数: 1 天

    [LV.1]初来乍到

    91

    主题

    2926

    帖子

    2

    金牌会员

    Rank: 6Rank: 6

    积分
    7799
    最后登录
    2024-4-18
     楼主| 发表于 2023-6-8 18:39:58 | 显示全部楼层
    az158 发表于 2023-6-8 18:01
    厉害,还没有搞过RT系列的can呢

    我都是踩着你的脚印往前走
    加油哦
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    26

    主题

    97

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    386
    最后登录
    2023-9-12
    发表于 2023-6-13 17:10:53 | 显示全部楼层
    板子上就一个 can 能够实现收发功能不 ?

    还是非得使用 2块板子才行 ?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2019-3-5 08:47
  • 签到天数: 1 天

    [LV.1]初来乍到

    91

    主题

    2926

    帖子

    2

    金牌会员

    Rank: 6Rank: 6

    积分
    7799
    最后登录
    2024-4-18
     楼主| 发表于 2023-6-14 08:57:54 | 显示全部楼层
    hpdell 发表于 2023-6-13 17:10
    板子上就一个 can 能够实现收发功能不 ?

    还是非得使用 2块板子才行 ?

    一块也行,使用回环模式也能测试。
    加油哦
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    26

    主题

    97

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    386
    最后登录
    2023-9-12
    发表于 2023-6-16 09:47:43 | 显示全部楼层
    jundao721 发表于 2023-6-14 08:57
    一块也行,使用回环模式也能测试。

    can 功能目前还没有捣鼓,后续有空得捣鼓看看
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    关闭

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

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

    GMT+8, 2024-4-20 14:08 , Processed in 0.144318 second(s), 29 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

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