RT-Thread Studio上的CAN实践步骤说明

1.前言说明
can 是controller area network 的缩写(以下称为can),是iso*1 国际标准化的串行通信协议。
在当前的汽车产业中,出于对安全性、舒适性、方便性、低公害、低成本的要求,各种各样的电子控制系统
被开发了出来。由于这些系统之间通信所用的数据类型及对可靠性的要求不尽相同,由多条总线构成的情况很
多,线束的数量也随之增加。为适应“减少线束的数量”、“通过多个lan,进行大量数据的高速通信”的需
要,1986 年德国电气商博世公司开发出面向汽车的can 通信协议。此后,can 通过iso11898 及iso11519 进行了标准化,现在在欧洲已是汽车网络的标准协议。现在,can 的高性能和可靠性已被认同,并被广泛地应用于工业自动化、船舶、医疗设备、工业设备等方面。
瑞萨在ra6m3系列芯片 集成can总线控制器。controller area network (can) module 详细参考《renesas ra6m3 group user’s manual: hardware》
1.1.本章内容
使用rt-thread studio来创建工程,配置can接口驱动,编写can接口测试程序,实现瑞萨ra6m3芯片和上 位机can通信(数据接收与发送)。
1.2.模块介绍
can接口图
1.3.开发软件
rt-thread studio , ra smart configurator
2.步骤说明
2.1.新建工程
2.2.编写测试程序
/*
copyright (c) 2006-2021, rt-thread development team
spdx-license-identifier: apache-2.0
change logs:
date author notes
2023-06-15 administrator the first version
/
#include
#include hal_data.h
#include
#define can_dev_name can0 / can 设备名称 /
static struct rt_semaphore rx_sem; / 用于接收消息的信号量 /
static rt_device_t can_dev; / can 设备句柄 */
static int can_echo( rt_uint8_t p_buff );
/ 接收数据回调函数 /
static rt_err_t can_rx_call(rt_device_t dev, rt_size_t size)
{
/ can 接收到数据后产生中断,调用此回调函数,然后发送接收信号量 */
rt_sem_release(&rx_sem);
return rt_eok;
}
static void can_rx_thread(void parameter)
{
int i;
rt_err_t res;
struct rt_can_msg rxmsg = {0};
/ 设置接收回调函数 /
rt_device_set_rx_indicate(can_dev, can_rx_call);
#ifdef rt_can_using_hdr
struct rt_can_filter_item items[5] =
{
rt_can_filter_item_init(0x100, 0, 0, 0, 0x700, rt_null, rt_null), / std,match id:0x1000x1ff,hdr 为 - 1,设置默认过滤表 /
rt_can_filter_item_init(0x300, 0, 0, 0, 0x700, rt_null, rt_null), / std,match id:0x3000x3ff,hdr 为 - 1 /
rt_can_filter_item_init(0x211, 0, 0, 0, 0x7ff, rt_null, rt_null), / std,match id:0x211,hdr 为 - 1 /
rt_can_filter_std_init(0x486, rt_null, rt_null), / std,match id:0x486,hdr 为 - 1 /
{0x555, 0, 0, 0, 0x7ff, 7,} / std,match id:0x555,hdr 为 7,指定设置 7 号过滤表 /
};
struct rt_can_filter_config cfg = {5, 1, items}; / 一共有 5 个过滤表 /
/ 设置硬件过滤表 /
res = rt_device_control(can_dev, rt_can_cmd_set_filter, &cfg);
rt_assert(res == rt_eok);
#endif
while (1)
{
/ hdr 值为 - 1,表示直接从 uselist 链表读取数据 /
//rxmsg.hdr_index = -1;
/ 阻塞等待接收信号量 /
rt_sem_take(&rx_sem, rt_waiting_forever);
/ 从 can 读取一帧数据 /
rt_device_read(can_dev, 0, &rxmsg, sizeof(rxmsg));
/ 打印数据 id 及内容 */
rt_kprintf(id:%x, rxmsg.id);
for (i = 0; i < 8; i++)
{
rt_kprintf(%2x, rxmsg.data[i]);
}
can_echo( &rxmsg.data[0]);
rt_kprintf(n);
}
}
static int can_echo( rt_uint8_t p_buff )
{
struct rt_can_msg msg = {0};
rt_size_t size;
msg.id = 0x03; / id 为 0x03 /
msg.ide = rt_can_stdid; / 标准格式 /
msg.rtr = rt_can_dtr; / 数据帧 /
msg.len = 8; / 数据长度为 8 /
rt_memcpy(&msg.data[0], p_buff, 8);
/ 发送一帧 can 数据 */
size = rt_device_write(can_dev, 0, &msg, sizeof(msg) );
if (size == 0)
{
rt_kprintf(can dev write data failed!n);
}
}
int can_test(int argc, char argv[])
{
struct rt_can_msg msg = {0};
rt_err_t res;
rt_size_t size;
rt_thread_t thread;
char can_name[rt_name_max];
if (argc == 2)
{
rt_strncpy(can_name, argv[1], rt_name_max);
}
else
{
rt_strncpy(can_name, can_dev_name, rt_name_max);
}
/ 查找 can 设备 /
can_dev = rt_device_find(can_name);
if (!can_dev)
{
rt_kprintf(find %s failed!n, can_name);
return rt_error;
}
/ 初始化 can 接收信号量 /
rt_sem_init(&rx_sem, rx_sem, 0, rt_ipc_flag_fifo);
/ 以中断接收及发送方式打开 can 设备 /
res = rt_device_open(can_dev, rt_device_flag_int_tx | rt_device_flag_int_rx);
rt_assert(res == rt_eok);
/ 设置 can 的工作模式为正常工作模式 /
//res = rt_device_control(can_dev, rt_can_cmd_set_mode, (void )rt_can_mode_normal);
/ 设置 can 通信的波特率为 100kbit/s /
//res = rt_device_control(can_dev, rt_can_cmd_set_baud, (void )can100kbaud);
/ 创建数据接收线程 /
thread = rt_thread_create(can_rx, can_rx_thread, rt_null, 1024, 25, 10);
if (thread != rt_null)
{
rt_thread_startup(thread);
}
else
{
rt_kprintf(create can_rx thread failed!n);
}
return res;
}
/ 导出到 msh 命令列表中 */
msh_cmd_export(can_test, can device sample);
3.代码验证
编译程序并下载到开发板
使用canfd(usb转can )发送和接收开发板can通信数据
4.章节总结
本章主要是验证了开发板和上位机can通信,rt-thread 开发板bsp 适配的很好,各种软件组件比较丰富,可以节省很多开发时间。

新款大疆无人机拆解中国芯超一半 但还有什么问题?
INS有哪几部组成-惯导专题
2020年真无线蓝牙耳机/618降噪耳机有哪些推荐?
2020年,国内半导体行业将在高精尖产品上继续取得进展
一文看懂2018手机面板的演进路线
RT-Thread Studio上的CAN实践步骤说明
VHDL仿真中的行为建模,让您可以在模拟过程中更轻松
解读传感器之于物联网的意义
Xsens与英伟达双方更紧密的战略关系将助力行业走上新的台阶
怎样在Arduino平台上点亮LCD1602驱动模块
媒体聚焦 | 对话瑞萨赵明宇:做中国汽车产业值得信赖的伙伴
区块链预言机可以预测币价的涨跌吗
欧司朗的HCL眼部穿戴装置你了解过吗?
松下HD605N降噪耳机评测 到底好不好用
三星发布视频用于检验自家OLED电视面板是有否烧屏现象
阿里宣布钉钉与淘宝打通,推出“智能导购”,正式入局新零售
铁电存储器的优势和发展趋势分析
三星Galaxy S21系列将有绿色版本
走进物联网:制备您自己的Wi-Fi开关 !
com推出光纤组件新产品,主要用于一系列带MPO连接器