220|4

469

帖子

3

TA的资源

五彩晶圆(初级)

楼主
 

【AG32VH407开发板】CAN收发测试 [复制链接]

 

测试AG32VH407开发板的CAN收发。

 

一、硬件部分

 

1.1、CAN收发端口

使用开发板的IO29(CAN_TX)和IO33(CAN_RX)

1.2、CAN收发器

IO29和IO33引脚连接到收发器的TXD和RXD,使用的收发器型号是TJA1050。

二、程序部分

 

2.1、引脚配置

修改example_board.ve文件,增加CAN引脚定义

 

2.2、fun_can.c

设置CAN波特率1Mbps,接收中断。

  • #include "board.h"
  • #include "can/fun_can.h"
  • void can_txdat(uint32_t can_id, CAN_FrameFormatTypeDef frame_format, CAN_RemoteTypeDef rtr, CAN_DataLengthTypeDef dlc, const char *data_bytes)
  • {
  • CAN_TxMessageTypeDef tx_msg;
  • tx_msg.ID = can_id;
  • tx_msg.FF = frame_format;
  • tx_msg.DLC = dlc;
  • tx_msg.RTR = rtr;
  • for (int i = 0; i < dlc; ++i) {
  • tx_msg.Data[i] = data_bytes[i];
  • }
  • CAN_Transmit(CAN0, &tx_msg);
  • }
  • void CAN0_isr()
  • {
  • uint32_t can_ir = CAN_GetIntStatus(CAN0);
  • if (can_ir & CAN_IR_TI) // Tx done
  • {
  • printf("can tx done\n");
  • }
  • if (can_ir & CAN_IR_RI) // Rx done
  • {
  • CAN_RxMessageTypeDef rx_msg;
  • CAN_Receive(CAN0, &rx_msg);
  • printf("can rx data:");
  • for (int i = 0; i < rx_msg.DLC; ++i)
  • {
  • printf(" %02x", rx_msg.Data[i]);
  • }
  • printf("\r\n");
  • can_txdat(rx_msg.ID+1, CAN_EXTENDTED_FRAME_FORMAT, CAN_DATA_FRAME, CAN_DATA_LENGTH_8, rx_msg.Data);
  • }
  • }
  • void init_can(void)
  • {
  • CAN_InitTypeDef init;
  • int baud_rate = 1000000;
  • PERIPHERAL_ENABLE(CAN, 0);
  • INT_EnableIRQ(CAN0_IRQn, CAN_PRIORITY);
  • CAN_StructInit(&init);
  • init.SJW = CAN_SJW_1TQ;
  • init.TSeg1 = CAN_TSEG1_6TQ;
  • init.TSeg2 = CAN_TSEG2_3TQ;
  • init.Prescaler = CAN_CalculatePrescaler(SYS_GetPclkFreq(), baud_rate, init.TSeg1, init.TSeg2);
  • CAN_Init(CAN0, &init);
  • CAN_EnableIntRx(CAN0);
  • //CAN_EnableIntTx(CAN0);
  • CAN_EnableIntErrorWarning(CAN0);
  • }

 

2.3、fun_can.h

  • #ifndef __FUN_TASK_H
  • #define __FUN_TASK_H
  • void task_create(void);
  • #endif

 

2.4、fun_task.c

  • #include "example.h"
  • #include "led/led.h"
  • #include "key/key.h"
  • #include "timer/mtimer.h"
  • #include "lcd/jlx12864g.h"
  • #include "oled/oled.h"
  • #include "rtc/fun_rtc.h"
  • #include "can/fun_can.h"
  • #include "FreeRTOS.h"
  • #include "task.h"
  • #include "queue.h"
  • #include "timers.h"
  • #include "semphr.h"
  • #define START_TASK_PRO 1
  • #define START_STK_SIZE 512
  • TaskHandle_t StartTask_Handler;
  • #define TASK1_PRIO 4
  • #define TASK1_STK_SIZE 128
  • static TaskHandle_t Task1Task_Handler = NULL;
  • #define TASK2_PRIO 3
  • #define TASK2_STK_SIZE 256
  • static TaskHandle_t Task2Task_Handler = NULL;
  • #define TASK3_PRIO 5
  • #define TASK3_STK_SIZE 256
  • static TaskHandle_t Task3Task_Handler = NULL;
  • SemaphoreHandle_t semaphore_bin_rtc;
  • void start_task(void *pvParameters);
  • void task1(void *pvParameters);
  • void task2(void *pvParameters);
  • void task3(void *pvParameters);
  • void task_create(void)
  • {
  • //start_task
  • xTaskCreate((TaskFunction_t )start_task,
  • (const char* )"start_task",
  • (uint16_t )START_STK_SIZE,
  • (void* )NULL,
  • (UBaseType_t )START_TASK_PRO,
  • (TaskHandle_t* )&StartTask_Handler);
  • vTaskStartScheduler();
  • }
  • void start_task(void *pvParameters)
  • {
  • taskENTER_CRITICAL();
  • semaphore_bin_rtc = xSemaphoreCreateBinary();
  • //task1
  • xTaskCreate((TaskFunction_t )task1,
  • (const char* )"task1",
  • (uint16_t )TASK1_STK_SIZE,
  • (void* )NULL,
  • (UBaseType_t )TASK1_PRIO,
  • (TaskHandle_t* )&Task1Task_Handler);
  • //task2
  • xTaskCreate((TaskFunction_t )task2,
  • (const char* )"task2",
  • (uint16_t )TASK2_STK_SIZE,
  • (void* )NULL,
  • (UBaseType_t )TASK2_PRIO,
  • (TaskHandle_t* )&Task2Task_Handler);
  • //task3
  • xTaskCreate((TaskFunction_t )task3,
  • (const char* )"task3",
  • (uint16_t )TASK3_STK_SIZE,
  • (void* )NULL,
  • (UBaseType_t )TASK3_PRIO,
  • (TaskHandle_t* )&Task3Task_Handler);
  • vTaskDelete(StartTask_Handler);
  • taskEXIT_CRITICAL();
  • }
  • //task1
  • void task1(void *pvParameters)
  • {
  • while (1)
  • {
  • //printf("task1 run ...\r\n");
  • vTaskDelay(200);
  • }
  • }
  • //task2
  • void task2(void *pvParameters)
  • {
  • init_can();
  • while (1)
  • {
  • //printf("task2 run ...\r\n");
  • vTaskDelay(500);
  • }
  • }
  • //task3
  • void task3(void *pvParameters)
  • {
  • BaseType_t err = pdFALSE;
  • init_oled();
  • oled_test();
  • init_rtc();
  • while (1)
  • {
  • if(semaphore_bin_rtc != NULL)
  • {
  • err = xSemaphoreTake(semaphore_bin_rtc, portMAX_DELAY);
  • if(err == pdTRUE)
  • {
  • rtc_disp();
  • oled_showstr(0,4,rtc_date1,2);
  • oled_showstr(0,6,rtc_date2,2);
  • memset(rtc_date1, 0, sizeof(rtc_date1));
  • memset(rtc_date2, 0, sizeof(rtc_date2));
  • }
  • else if(err == pdFALSE)
  • {
  • vTaskDelay(10);
  • }
  • }
  • }
  • }
  • void vApplicationTickHook(void)
  • {
  • return;
  • }
  • void vApplicationGetIdleTaskMemory(StaticTask_t **ppxIdleTaskTCBBuffer,
  • StackType_t **ppxIdleTaskStackBuffer,
  • uint32_t *pulIdleTaskStackSize)
  • {
  • static StaticTask_t xIdleTaskTCB;
  • static StackType_t uxIdleTaskStack[configMINIMAL_STACK_SIZE];
  • *ppxIdleTaskTCBBuffer = &xIdleTaskTCB;
  • *ppxIdleTaskStackBuffer = uxIdleTaskStack;
  • *pulIdleTaskStackSize = configMINIMAL_STACK_SIZE;
  • }
  • void vApplicationGetTimerTaskMemory(StaticTask_t **ppxTimerTaskTCBBuffer,
  • StackType_t **ppxTimerTaskStackBuffer,
  • uint32_t *pulTimerTaskStackSize)
  • {
  • static StaticTask_t xTimerTaskTCB;
  • static StackType_t uxTimerTaskStack[configTIMER_TASK_STACK_DEPTH];
  • *ppxTimerTaskTCBBuffer = &xTimerTaskTCB;
  • *ppxTimerTaskStackBuffer = uxTimerTaskStack;
  • *pulTimerTaskStackSize = configTIMER_TASK_STACK_DEPTH;
  • }

 

 

三、运行结果

 

编译后,下载ve和code代码后,CAN通信收发测试。开发板接收到的ID数据据,地址+1后重新从CAN发出。

 

最新回复

支持canfd吗   详情 回复 发表于 前天 10:22

赞赏

1

查看全部赞赏

点赞 关注(2)
 
 

回复
举报

7188

帖子

11

TA的资源

版主

沙发
 

CAN也调通了,不错不错,有没有试过不同的速度,或者跟CAN2.0的交互?

点评

测试了100Kbps,125Kbps,250Kbps,500Kbps,1000Kbps。100Kbps和125Kbps,可能哪里需要设置,没有调试通,其他都能正常收发。  详情 回复 发表于 前天 10:48
 
 
 

回复

7763

帖子

18

TA的资源

五彩晶圆(高级)

板凳
 

支持canfd吗

点评

好像是不支持CANFD。  详情 回复 发表于 前天 10:48
个人签名

默认摸鱼,再摸鱼。2022、9、28

 
 
 

回复

469

帖子

3

TA的资源

五彩晶圆(初级)

4
 
lugl4313820 发表于 2025-3-20 06:55 CAN也调通了,不错不错,有没有试过不同的速度,或者跟CAN2.0的交互?

测试了100Kbps,125Kbps,250Kbps,500Kbps,1000Kbps。100Kbps和125Kbps,可能哪里需要设置,没有调试通,其他都能正常收发。

 
 
 

回复

469

帖子

3

TA的资源

五彩晶圆(初级)

5
 

好像是不支持CANFD。

 
 
 

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

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条
有奖直播报名| TI 面向楼宇和工厂自动化行业的毫米波雷达解决方案
【内容简介】TI 60GHz IWRL6432和 IWRL1432毫米波雷达传感器如何帮助解决楼宇和工厂自动化应用中的感应难题
【直播时间】5月28日(周三)上午10:00
【直播礼品】小米双肩包、contigo水杯、胶囊伞、安克充电器

查看 »

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网 1

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表