请选择 进入手机版 | 继续访问电脑版
查看: 77|回复: 3

[原创] 飞凌RT1052+11、CAN接收的数据显示在LCD屏上

[复制链接]
  • TA的每日心情
    开心
    昨天 07:09
  • 签到天数: 183 天

    [LV.7]常住居民III

    51

    主题

    809

    帖子

    8

    金豆

    金牌会员

    Rank: 6Rank: 6

    积分
    1671
    最后登录
    2018-11-13
    发表于 5 天前 | 显示全部楼层 |阅读模式
            在前面CAN例程和LCM例程的基础上修改,使接收CAN的信息显示在LCD屏幕上。

        一、程序部分
        1、can.c程序
    1. #include "config.h"

    2. /*******************************************************************************
    3. * Definitions
    4. ******************************************************************************/
    5. #define EXAMPLE_CAN CAN2
    6. #define EXAMPLE_FLEXCAN_IRQn CAN2_IRQn
    7. #define EXAMPLE_FLEXCAN_IRQHandler CAN2_IRQHandler

    8. /* Select 80M clock divided by USB1 PLL (480 MHz) as master flexcan clock source */
    9. #define FLEXCAN_CLOCK_SOURCE_SELECT (2U)
    10. /* Clock divider for master flexcan clock source */
    11. #define FLEXCAN_CLOCK_SOURCE_DIVIDER (3U)
    12. /* Get frequency of flexcan clock */
    13. #define EXAMPLE_CAN_CLK_FREQ ((CLOCK_GetFreq(kCLOCK_Usb1PllClk) / 6) / (FLEXCAN_CLOCK_SOURCE_DIVIDER + 1U))
    14. #define RX_MESSAGE_BUFFER_NUM (9)
    15. #define TX_MESSAGE_BUFFER_NUM (8)

    16. flexcan_frame_t frame;

    17. uint32_t txIdentifier;
    18. uint32_t rxIdentifier;

    19. /*******************************************************************************
    20. * Variables
    21. ******************************************************************************/
    22. flexcan_handle_t flexcanHandle;
    23. volatile bool txComplete = false;
    24. volatile bool rxComplete = false;
    25. flexcan_mb_transfer_t txXfer, rxXfer;


    26. flexcan_config_t flexcanConfig;
    27. flexcan_rx_mb_config_t mbConfig;

    28. /*!
    29. * @brief FlexCAN Call Back function
    30. */
    31. static void flexcan_callback(CAN_Type *base, flexcan_handle_t *handle, status_t status, uint32_t result, void *userData)
    32. {
    33.     switch (status)
    34.     {
    35.         case kStatus_FLEXCAN_RxIdle:
    36.             if (RX_MESSAGE_BUFFER_NUM == result)
    37.             {
    38.                 rxComplete = true;
    39.             }
    40.             break;

    41.         case kStatus_FLEXCAN_TxIdle:
    42.             if (TX_MESSAGE_BUFFER_NUM == result)
    43.             {
    44.                 txComplete = true;
    45.             }
    46.             break;

    47.         default:
    48.             break;
    49.     }
    50. }
    51. //CAN初始化
    52. void CAN_Init(void)
    53. {
    54.         CLOCK_EnableClock(kCLOCK_Iomuxc);
    55.         IOMUXC_SetPinMux( IOMUXC_GPIO_AD_B0_14_FLEXCAN2_TX, 1U);         
    56.         IOMUXC_SetPinMux( IOMUXC_GPIO_AD_B0_15_FLEXCAN2_RX, 1U);
    57.         IOMUXC_SetPinConfig( IOMUXC_GPIO_AD_B0_14_FLEXCAN2_TX, 0x10B0u);
    58.         IOMUXC_SetPinConfig( IOMUXC_GPIO_AD_B0_15_FLEXCAN2_RX, 0x10B0u);
    59.          
    60.         //设置FLEXCAN时钟
    61.         CLOCK_SetMux(kCLOCK_CanMux, FLEXCAN_CLOCK_SOURCE_SELECT);
    62.         CLOCK_SetDiv(kCLOCK_CanDiv, FLEXCAN_CLOCK_SOURCE_DIVIDER);
    63.        
    64.         //发送和接收ID
    65.         txIdentifier = 0x123;
    66.         rxIdentifier = 0x321;

    67.         FLEXCAN_GetDefaultConfig(&flexcanConfig);
    68.         FLEXCAN_Init(EXAMPLE_CAN, &flexcanConfig, EXAMPLE_CAN_CLK_FREQ);                //初始化CAN模块
    69.        
    70.          /* Create FlexCAN handle structure and set call back function. */
    71.         FLEXCAN_TransferCreateHandle(EXAMPLE_CAN, &flexcanHandle, flexcan_callback, NULL);

    72.     /* Set Rx Masking mechanism. */
    73.         FLEXCAN_SetRxMbGlobalMask(EXAMPLE_CAN, FLEXCAN_RX_MB_STD_MASK(rxIdentifier, 0, 0));
    74.        
    75.         /* Setup Rx Message Buffer. */
    76.         mbConfig.format = kFLEXCAN_FrameFormatStandard;                        //标准帧
    77.         mbConfig.type = kFLEXCAN_FrameTypeData;                                                        //数据帧
    78.         mbConfig.id = FLEXCAN_ID_STD(rxIdentifier);                                        //标准帧ID
    79.         FLEXCAN_SetRxMbConfig(EXAMPLE_CAN, RX_MESSAGE_BUFFER_NUM, &mbConfig, true);                //配置接收邮箱
    80.         FLEXCAN_SetTxMbConfig(EXAMPLE_CAN, TX_MESSAGE_BUFFER_NUM, true);                                                        //配置发送邮箱
    81.        
    82.         rxXfer.mbIdx = RX_MESSAGE_BUFFER_NUM;
    83.         rxXfer.frame = &frame;
    84.         FLEXCAN_TransferReceiveNonBlocking(EXAMPLE_CAN, &flexcanHandle, &rxXfer);       
    85. }


    86. void CAN_Handle(void)
    87. {
    88.         uint8_t rx[8];
    89.         uint8_t i;
    90.         char disp[32]="zhang";
    91.         rxXfer.mbIdx = RX_MESSAGE_BUFFER_NUM;
    92.         rxXfer.frame = &frame;
    93.         FLEXCAN_TransferReceiveNonBlocking(EXAMPLE_CAN, &flexcanHandle, &rxXfer);
    94.         if(rxComplete == true)
    95.         {
    96.                 rxComplete = false;
    97.                 rx[0]=frame.dataByte0;
    98.                 rx[1]=frame.dataByte1;
    99.                 rx[2]=frame.dataByte2;
    100.                 rx[3]=frame.dataByte3;
    101.                 rx[4]=frame.dataByte4;
    102.                 rx[5]=frame.dataByte5;
    103.                 rx[6]=frame.dataByte6;
    104.                 rx[7]=frame.dataByte7;
    105.                
    106.                 PRINTF("Rx MB ID: 0x%3x, Rx MB data: 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x\r\n", frame.id >> CAN_ID_STD_SHIFT, rx[0],rx[1],rx[2],rx[3],rx[4],rx[5],rx[6],rx[7]);
    107.                
    108.                 //disp="ZHANGHUI";
    109.                 for(i=0;i<8;i++)
    110.                 {
    111.                         if(((rx[i]>>4)>=0)&((rx[i]>>4)<=9))
    112.                         {
    113.                                 disp[i*2]=(rx[i]>>4)+0x30;
    114.                         }
    115.                         else
    116.                         {
    117.                                 disp[i*2]=(rx[i]>>4)+0x37;
    118.                         }
    119.                        
    120.                         if(((rx[i]&0x0f)>=0)&((rx[i]&0x0f)<=9))
    121.                         {
    122.                                 disp[i*2+1]=(rx[i]&0x0f)+0x30;
    123.                         }
    124.                         else
    125.                         {
    126.                                 disp[i*2+1]=(rx[i]&0x0f)+0x37;
    127.                         }
    128.                 }
    129.                
    130.                 LCD_P8x16Str(0,2,"B0B1B2B3B4B5B6B7");
    131.                 LCD_P8x16Str(0,3,disp);
    132.         }
    133. }
    复制代码
        2、主程序
            main.c
    1. int main(void)
    2. {
    3.     /* Define the init structure for the output LED pin*/
    4.           /* 定义一个初始化GPIO输出的结构体*/
    5.     //gpio_pin_config_t led_config = {kGPIO_DigitalOutput, 0, kGPIO_NoIntmode};
    6.     /* Board pin, clock, debug console init */
    7.                 /* 配置MCU,配置引脚复用功能,配置时钟,配置串口调试打印功能*/
    8.     BOARD_ConfigMPU();
    9.     BOARD_InitPins();
    10.     BOARD_BootClockRUN();
    11.     BOARD_InitDebugConsole();
    12.        
    13.                 /* Set PERCLK_CLK source to OSC_CLK*/
    14.     CLOCK_SetMux(kCLOCK_PerclkMux, 1U);
    15.     /* Set PERCLK_CLK divider to 1 */
    16.     CLOCK_SetDiv(kCLOCK_PerclkDiv, 0U);
    17.        
    18.                 PITIMER_Init(1000000);                //PIT定时器1S
    19.                 LED_Init();                                                                //LED初始化
    20.                 ST7565_Init();                                                //初始化LCM
    21.                 CAN_Init();
    22.                
    23.     /* Print a note to terminal. */
    24.     PRINTF("\r\n GPIO Driver example\r\n");
    25.     PRINTF("\r\n The LED is blinking.\r\n");

    26.     while (1)
    27.     {
    28.                        
    29.                         CAN_Handle();
    30.     }
    31. }
    复制代码
       
        二、执行结果:
            2.1、CAN卡发送数据
             1.png
            2.2、串口接收到的数据
             2.png
            2.3、显示屏显示的内容
             101.jpg
            B0 -- AA
            B1 -- 81
            B2 -- 32
            B3 -- 43
            B4 -- 54
            B5 -- 55
            B6 -- 56
            B7 -- 07


    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

  • TA的每日心情
    开心
    昨天 22:01
  • 签到天数: 362 天

    [LV.8]以坛为家I

    75

    主题

    2943

    帖子

    16

    金豆

    金牌会员

    Rank: 6Rank: 6

    积分
    4452
    最后登录
    2018-11-13
    发表于 4 天前 来自手机 | 显示全部楼层
    赞赞赞,赞一个
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    12 分钟前
  • 签到天数: 12 天

    [LV.3]偶尔看看II

    14

    主题

    137

    帖子

    9

    金豆

    中级会员

    Rank: 3Rank: 3

    积分
    276
    最后登录
    2018-11-13
    发表于 4 天前 | 显示全部楼层
    不错,
    测试过远程帧没?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    昨天 07:09
  • 签到天数: 183 天

    [LV.7]常住居民III

    51

    主题

    809

    帖子

    8

    金豆

    金牌会员

    Rank: 6Rank: 6

    积分
    1671
    最后登录
    2018-11-13
     楼主| 发表于 4 天前 | 显示全部楼层
    stm1024 发表于 2018-11-9 09:18
    不错,
    测试过远程帧没?

    还没有,一般只用数据帧。
    哎...今天够累的,签到来了1...
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    关闭

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

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

    GMT+8, 2018-11-13 08:14 , Processed in 0.103311 second(s), 18 queries , MemCache On.

    Powered by Discuz! X3.4

    © 2001-2013 Comsenz Inc.

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