【RA6M3 HMI Board评测挑战】-瑞萨RA6M3上的CAN实践

一.准备
基于rt-thread studio
1.1安装bsp包
注意gnu工具链版本
1.2 芯片资料
1.3fsp
1.4代码仓库
1.5创建工程
菜单栏
文件->新建->rt-thread项目
设置如下
接上串口p205 p206
115200-8-n-1
二.can模块硬件部分介绍
tp5设置了一个测试点,可以测试vref的vdd/2的电压,辅助确认芯片是否正常。
r76 r77构成了120欧终端电阻,c67起到滤波作用,这个电容不能大,否则影响高速时信号边沿,导致边沿变迟缓可能导致采样错误。
rs用于slope-control控制输入,默认接gnd即high-speed模式。
三.can模块介绍
参考《renesas ra6m3 group user’s manual: hardware》的《37. controller area network (can) module》
3.1特征
支持iso11898-1 标准和扩展帧
支持最高1 mbps
32个消息邮箱:每一个都可以独立配置为接收或发送;或者24个配置为接受或发送,剩余的8个配置为4级收发fifo。
支持数据帧和远程帧接收,可配置只接收标准帧或者扩展帧或者混合帧,可配置单次接收模式,可配置溢出时数据是保存还是丢弃,每个邮箱可单独配置接收完成中断使能。
4个邮箱共用一个,一共8个接收过滤器,每个邮箱可单独使能过滤。
支持数据帧和远程帧发送,可配置只发送标准帧或者扩展帧或者混合帧,可配置单次发送模式,广播功能,优先级可由id或者邮箱序号决定,支持发送中止且有中止完成标志,每个邮箱可单独配置接发送成中断使能。
从总线断开状态恢复的模式转换可选择为:1.符合iso11898-1规范2.总线断开进入时自动进入can停止模式3.总线断开完成时自动进入can停止模式4.通过软件进入can停止模式5.通过软件转换到错误活动状态。
监控can总线错误,包括填充错误、格式错误、ack错误、15位crc错误、位错误和ack分隔符错误。检测到错误状态的转换,包括错误警告、被动错误、总线关闭进入和总线关闭恢复。支持读取错误计数器。
使用16位计数器的时间戳功能,可选择1位、2位、4位和8位时间周期的参考时钟
支持五种中断源:接收完成、发送完成、接收fifo、发送fifo和错误中断。
停止can时钟以降低功耗。
三个软件支持单元:接收过滤器;邮箱搜索支持,包括接收邮箱搜索、发送邮箱搜索和邮件丢失搜索;通道搜索支持。
时钟源来自pclkb 或 canmclk
可用于评估的三种测试模式:仅听模式;自检模式0(外部环回);自检模式1(内部环回)。
可以设置模块停止状态以降低功耗.
3.2框图
3.3操作模式
can模块的操作模式包括:can复位模式,can停止模式,can操作模式,can睡眠模式。状态切换如下图:
3.4时序设置
时序设置很重要
时钟源
can模块有一个can时钟发生器,可通过bcr寄存器中的cclks和brp[9:0]位进行设置。图显示了can时钟发生器的框图
cclks选择时钟源来自与pclkb还是extal
bpr设置时钟分频最后得到fcanclk
3.5时序设置
3.6中断
四.can驱动介绍
4.1添加can驱动
按如下设置并保存,也可以使用env设置
添加的代码位置如下
4.2使能硬件can
右键点击工程,打开env环境
4.3测试代码
canboardsconscript下添加
if getdepend(['rt_using_can']):
src += glob('ports/can_test.c')
刷新scons配置
添加的测试代码如下
该代码使用can0,创建接收线程接收can数据,接收到后打印信息,同时导出命令can_sample,执行一次命令发送一帧can数据。
五.回环测试
rt_device_open后添加一行,设置为回环模式
rt_device_control(can_dev,rt_can_cmd_set_mode,rt_can_mode_loopback);
编译运行,help可以看到对应的命令can_sample
六.问题
can_sample can0
只能执行一次
static rt_device_t can_dev = null;
设置只有未初始化才初始化
if(can_dev == null){ if (argc == 2) { rt_strncpy(can_name, argv[1], rt_name_max); } else { rt_strncpy(can_name, can_dev_name, rt_name_max); } can_dev = rt_device_find(can_name); if (!can_dev) { rt_kprintf(find %s failed!n, can_name); return rt_error; } rt_sem_init(&rx_sem, rx_sem, 0, rt_ipc_flag_fifo); res = rt_device_open(can_dev, rt_device_flag_int_tx | rt_device_flag_int_rx); rt_assert(res == rt_eok); rt_device_control(can_dev,rt_can_cmd_set_mode,rt_can_mode_loopback); 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); }}
这样就可以反复进行can_sample测试
七.can驱动分析
7.1测试代码
boardportscan_test.c
见前面的测试
7.2硬件抽象层
librarieshal_driversdrv_can.c drv_can.h
导出了初始化函数,启动时自动根据链接脚本放置的位置调用该函数
init_board_export(rt_hw_can_init);
通过接口
result = rt_hw_can_register(&can_obj[i].can_dev, can_obj[i].config->name, can_obj[i].can_dev.ops, rt_null);
注册几个关键的数据结构
重点是如下结构体,即操作底层硬件的接口,驱动层即通过注册的该opt结构进行底层硬件操作
const struct rt_can_ops ra_can_ops =
{
.configure = ra_can_configure,
.control = ra_can_control,
.sendmsg = ra_can_sendmsg,
.recvmsg = ra_can_recvmsg
};
librarieshal_driversconfigra2l1can_config.h中的
#if defined(bsp_using_can0)
#ifndef can0_config
#define can0_config
{
.name = can0,
.num_of_mailboxs = can_no_of_mailboxes_g_can0,
.p_api_ctrl = &g_can0_ctrl,
.p_cfg = &g_can0_cfg,
}
#endif /* can0_config /
#endif / bsp_using_can0 */
则定义的芯片相关的操作数据结构和设备名字。
7.3组件层
rt-threadcomponentsdriverscancan.c
导出了命令
msh_cmd_export_alias(cmd_canstat, canstat, stat can device status);
rt_hw_can_register注册以下接口,即组件设备的驱动api
device- >init = rt_can_init;device- >open = rt_can_open;device- >close = rt_can_close;device- >read = rt_can_read;device- >write = rt_can_write;device->control = rt_can_control;
7.4设备层
更通用的设备层通过设备名找到设备句柄
rt_device_find
设备打开等操作时rt_device_open通过设备句柄调用组件层的api,
rt_can_open等,而组件层调用硬件抽象层的接口,硬件抽象层再调用ic的固件库实现硬件操作。
八.总结
得益于rt_thread比较好的设备驱动框架,设备驱动的扩展非常方便,直接配置ic固件库,实现硬件抽象层即可,组件层和设备层驱动都是通用的。

TAS6424-Q1 D类音频放大器的作用
133.5米的长度刷新了国内最长风电钢桩的记录
5G手机时代的到来,vivo隆重推出5G智慧手机
固态硬盘与机械盘相比它的优势是什么
一文掌握IIC转USB的转换技术
【RA6M3 HMI Board评测挑战】-瑞萨RA6M3上的CAN实践
为什么诺基亚会痛失中国市场?
2021MWC上海展将全球首秀“5G创新地带”
可视化监测并能够开启水浸破损防盗监测报警的智慧井盖
全球动力电池、材料及整车的头部企业上游原材料“卡位战”愈演愈烈
携高性能、长航时海骑兵SD-40垂直起降无人机重磅亮相
三种失电延装置的构成原理及优缺点
华为申请鸿蒙手表新专利
【案例分享】微智达Linux触控一体机助力智慧农业应用
气缸磁感应开关故障案例分析
时间继电器的接线方法_时间继电器的注意事项
当然咯,现在买iPhone5s还值得!!!
能源互联网9大概念股价值解析
大疆新款产品盛气凌人 无人机厂商该如何突围?
基于A/D转换器AD7677的原理、工作特性及应用分析