在线时间795 小时
UID3067179
注册时间2014-10-23
NXP金币1047
TA的每日心情 | 开心 2024-4-10 10:22 |
---|
签到天数: 1317 天 [LV.10]以坛为家III
版主
- 积分
- 7570
- 最后登录
- 2024-4-10
|
在前面CAN例程和LCM例程的基础上修改,使接收CAN的信息显示在LCD屏幕上。
一、程序部分
1、can.c程序
- #include "config.h"
- /*******************************************************************************
- * Definitions
- ******************************************************************************/
- #define EXAMPLE_CAN CAN2
- #define EXAMPLE_FLEXCAN_IRQn CAN2_IRQn
- #define EXAMPLE_FLEXCAN_IRQHandler CAN2_IRQHandler
- /* Select 80M clock divided by USB1 PLL (480 MHz) as master flexcan clock source */
- #define FLEXCAN_CLOCK_SOURCE_SELECT (2U)
- /* Clock divider for master flexcan clock source */
- #define FLEXCAN_CLOCK_SOURCE_DIVIDER (3U)
- /* Get frequency of flexcan clock */
- #define EXAMPLE_CAN_CLK_FREQ ((CLOCK_GetFreq(kCLOCK_Usb1PllClk) / 6) / (FLEXCAN_CLOCK_SOURCE_DIVIDER + 1U))
- #define RX_MESSAGE_BUFFER_NUM (9)
- #define TX_MESSAGE_BUFFER_NUM (8)
- flexcan_frame_t frame;
- uint32_t txIdentifier;
- uint32_t rxIdentifier;
- /*******************************************************************************
- * Variables
- ******************************************************************************/
- flexcan_handle_t flexcanHandle;
- volatile bool txComplete = false;
- volatile bool rxComplete = false;
- flexcan_mb_transfer_t txXfer, rxXfer;
- flexcan_config_t flexcanConfig;
- flexcan_rx_mb_config_t mbConfig;
- /*!
- * @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)
- {
- case kStatus_FLEXCAN_RxIdle:
- if (RX_MESSAGE_BUFFER_NUM == result)
- {
- rxComplete = true;
- }
- break;
- case kStatus_FLEXCAN_TxIdle:
- if (TX_MESSAGE_BUFFER_NUM == result)
- {
- txComplete = true;
- }
- break;
- default:
- break;
- }
- }
- //CAN初始化
- void CAN_Init(void)
- {
- CLOCK_EnableClock(kCLOCK_Iomuxc);
- IOMUXC_SetPinMux( IOMUXC_GPIO_AD_B0_14_FLEXCAN2_TX, 1U);
- IOMUXC_SetPinMux( IOMUXC_GPIO_AD_B0_15_FLEXCAN2_RX, 1U);
- IOMUXC_SetPinConfig( IOMUXC_GPIO_AD_B0_14_FLEXCAN2_TX, 0x10B0u);
- IOMUXC_SetPinConfig( IOMUXC_GPIO_AD_B0_15_FLEXCAN2_RX, 0x10B0u);
-
- //设置FLEXCAN时钟
- CLOCK_SetMux(kCLOCK_CanMux, FLEXCAN_CLOCK_SOURCE_SELECT);
- CLOCK_SetDiv(kCLOCK_CanDiv, FLEXCAN_CLOCK_SOURCE_DIVIDER);
-
- //发送和接收ID
- txIdentifier = 0x123;
- rxIdentifier = 0x321;
- FLEXCAN_GetDefaultConfig(&flexcanConfig);
- FLEXCAN_Init(EXAMPLE_CAN, &flexcanConfig, EXAMPLE_CAN_CLK_FREQ); //初始化CAN模块
-
- /* Create FlexCAN handle structure and set call back function. */
- FLEXCAN_TransferCreateHandle(EXAMPLE_CAN, &flexcanHandle, flexcan_callback, NULL);
- /* Set Rx Masking mechanism. */
- FLEXCAN_SetRxMbGlobalMask(EXAMPLE_CAN, FLEXCAN_RX_MB_STD_MASK(rxIdentifier, 0, 0));
-
- /* Setup Rx Message Buffer. */
- mbConfig.format = kFLEXCAN_FrameFormatStandard; //标准帧
- mbConfig.type = kFLEXCAN_FrameTypeData; //数据帧
- mbConfig.id = FLEXCAN_ID_STD(rxIdentifier); //标准帧ID
- FLEXCAN_SetRxMbConfig(EXAMPLE_CAN, RX_MESSAGE_BUFFER_NUM, &mbConfig, true); //配置接收邮箱
- FLEXCAN_SetTxMbConfig(EXAMPLE_CAN, TX_MESSAGE_BUFFER_NUM, true); //配置发送邮箱
-
- rxXfer.mbIdx = RX_MESSAGE_BUFFER_NUM;
- rxXfer.frame = &frame;
- FLEXCAN_TransferReceiveNonBlocking(EXAMPLE_CAN, &flexcanHandle, &rxXfer);
- }
- void CAN_Handle(void)
- {
- uint8_t rx[8];
- uint8_t i;
- char disp[32]="zhang";
- rxXfer.mbIdx = RX_MESSAGE_BUFFER_NUM;
- rxXfer.frame = &frame;
- FLEXCAN_TransferReceiveNonBlocking(EXAMPLE_CAN, &flexcanHandle, &rxXfer);
- if(rxComplete == true)
- {
- rxComplete = false;
- rx[0]=frame.dataByte0;
- rx[1]=frame.dataByte1;
- rx[2]=frame.dataByte2;
- rx[3]=frame.dataByte3;
- rx[4]=frame.dataByte4;
- rx[5]=frame.dataByte5;
- rx[6]=frame.dataByte6;
- rx[7]=frame.dataByte7;
-
- 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]);
-
- //disp="ZHANGHUI";
- for(i=0;i<8;i++)
- {
- if(((rx[i]>>4)>=0)&((rx[i]>>4)<=9))
- {
- disp[i*2]=(rx[i]>>4)+0x30;
- }
- else
- {
- disp[i*2]=(rx[i]>>4)+0x37;
- }
-
- if(((rx[i]&0x0f)>=0)&((rx[i]&0x0f)<=9))
- {
- disp[i*2+1]=(rx[i]&0x0f)+0x30;
- }
- else
- {
- disp[i*2+1]=(rx[i]&0x0f)+0x37;
- }
- }
-
- LCD_P8x16Str(0,2,"B0B1B2B3B4B5B6B7");
- LCD_P8x16Str(0,3,disp);
- }
- }
复制代码 2、主程序
main.c
- int main(void)
- {
- /* Define the init structure for the output LED pin*/
- /* 定义一个初始化GPIO输出的结构体*/
- //gpio_pin_config_t led_config = {kGPIO_DigitalOutput, 0, kGPIO_NoIntmode};
- /* Board pin, clock, debug console init */
- /* 配置MCU,配置引脚复用功能,配置时钟,配置串口调试打印功能*/
- BOARD_ConfigMPU();
- BOARD_InitPins();
- BOARD_BootClockRUN();
- BOARD_InitDebugConsole();
-
- /* Set PERCLK_CLK source to OSC_CLK*/
- CLOCK_SetMux(kCLOCK_PerclkMux, 1U);
- /* Set PERCLK_CLK divider to 1 */
- CLOCK_SetDiv(kCLOCK_PerclkDiv, 0U);
-
- PITIMER_Init(1000000); //PIT定时器1S
- LED_Init(); //LED初始化
- ST7565_Init(); //初始化LCM
- CAN_Init();
-
- /* Print a note to terminal. */
- PRINTF("\r\n GPIO Driver example\r\n");
- PRINTF("\r\n The LED is blinking.\r\n");
- while (1)
- {
-
- CAN_Handle();
- }
- }
复制代码
二、执行结果:
2.1、CAN卡发送数据
2.2、串口接收到的数据
2.3、显示屏显示的内容
B0 -- AA
B1 -- 81
B2 -- 32
B3 -- 43
B4 -- 54
B5 -- 55
B6 -- 56
B7 -- 07
|
|