Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
RT-Thread Studio
RT-Thread活动
瑞萨_RA6M4
基于RT-Thread+RA6M4的虚拟仪器开发:第十一章CAN虚拟仪器设计
发布于 2022-07-21 12:01:28 浏览:618
订阅该版
[TOC] [演示视频1.mp4](https://club.rt-thread.org/file_download/bce34ab02b807d3d) [演示视频2.mp4](https://club.rt-thread.org/file_download/09da965afa0feb66) # RA6M4 CAN模块介绍 参考`《RA6M4 Group User’s Manual: Hardware》`的`《31. Controller Area Network (CAN) Module》`。 CAN模块符合ISO 11898-1 (CAN 2.0A/CAN 2.0B)标准,具备32个消息邮箱。 最大1Mbps速率。 ## 时钟 CANMCLK or PCLKB 我们使用PCLKB BSP_STARTUP_PCLKB_HZ可以获取时钟 ## 引脚 P401作为CTX0,P402作为CRX0 PSEL=10000 ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20220721/1c617e657c65d8bc7f52725ef17462df.png.webp) ## 模块使能 R_BSP_MODULE_START(FSP_IP_CAN, 0); CAN属于外设模块B 默认低功耗模块控制CAN模块是禁用的 需要配置MSTPCRB使能 bit1控制CAN1 bit0控制CAN0 设置为0使能 ## 中断 ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20220721/3415584ca4958234190d3325cf92b040.png.webp) vector_data.c g_interrupt_event_link_select中增加 ``` [10] = BSP_PRV_IELS_ENUM(EVENT_CAN0_ERROR), /* Error interrupt */ [11] = BSP_PRV_IELS_ENUM(EVENT_CAN0_FIFO_RX), /* Receive FIFO interrupt */ [12] = BSP_PRV_IELS_ENUM(EVENT_CAN0_FIFO_TX), /* Transmit FIFO interrupt */ [13] = BSP_PRV_IELS_ENUM(EVENT_CAN0_MAILBOX_RX), /* Reception complete interrupt */ [14] = BSP_PRV_IELS_ENUM(EVENT_CAN0_MAILBOX_TX), /* Transmission complete interrupt */ ``` g_vector_table中增加 ``` [10] = can0_rxerr_isr, /* Error interrupt */ [11] = can0_rxfifo_isr, /* Receive FIFO interrupt */ [12] = can0_txfifo_isr, /* Transmit FIFO interrupt */ [13] = can0_rx_isr, /* Reception complete interrupt */ [14] = can0_tx_isr, /* Transmission complete interrupt */ ``` vector_data.h VECTOR_DATA_IRQ_COUNT在原来基础上加5 增加 ``` void can0_rxerr_isr(void); void can0_rxfifo_isr(void); void can0_txfifo_isr(void); void can0_rx_isr(void); void can0_tx_isr(void); ``` E:\BOARD\RA6M4\proj\ra6m4\CPKRA6M4\ra\fsp\src\bsp\mcu\all\bsp_arm_exceptions.h中添加 ``` CAN0_RXERR_IRQn = 10, CAN0_RXFIFO_IRQn = 11, CAN0_TXFIFO_IRQn = 12, CAN0_RX_IRQn = 13, CAN0_TX_IRQn = 14, ``` 使能中断 ``` NVIC_SetPriority(CAN0_RXERR_IRQn, 2); NVIC_EnableIRQ(CAN0_RXERR_IRQn); NVIC_SetPriority(CAN0_RXFIFO_IRQn, 2); NVIC_EnableIRQ(CAN0_RXFIFO_IRQn); NVIC_SetPriority(CAN0_TXFIFO_IRQn, 2); NVIC_EnableIRQ(CAN0_TXFIFO_IRQn); NVIC_SetPriority(CAN0_RX_IRQn, 2); NVIC_EnableIRQ(CAN0_RX_IRQn); NVIC_SetPriority(CAN0_TX_IRQn, 2); NVIC_EnableIRQ(CAN0_TX_IRQn); ``` ## 寄存器 以下大概介绍下寄存器的功能,直到配置什么功能找什么寄存器,具体的位定义查阅手册 CTLR:控制寄存器,配置CAN操作模式,FIFO行为等。 BCR:位时序配置 MKR[k]:接收过滤 MKIVLR:接收过滤使能 AFSR:查询通过接收过滤的邮箱 FIDCRk:FIFO 接收ID比较寄存器 MBj_ID,MBj_DL,MBj_Dm,MBj_TS:收发消息邮箱,分别有ID,长度,数据,时间戳。 MIER,MIER_FIFO:中断使能 普通模式和FIFO MCTL_TX[j]:发送控制 MCTL_RX[j]:接收控制 RFCR RFPCR TFCR TFPCR:收发缓冲区控制 STR:状态寄存器 MSMR MSSR CSSR:邮箱搜索 EIER:错误中断使能 EIFR ECSR :错误中断标志 RECR,TECR收发错误计数 TSR:时间戳 TCR:测试模式配置 ## 配置过程 1.使能模块MSTPCRB 2.配置引脚 P401作为CTX0,P402作为CRX0 3.配置NVIC使能中断 4.配置CAN相关寄存器 频率 使用PCLKB=50000000 ``` /* 50000000 * 5分频 设置值为4 10M 0.1uS * tq最多8~25个 * 500K 2uS 20个tq * ss ts1 ts2 sjw * 1 14 5 4 * 注意寄存器值都比设置值小1 * */ /* 时序配置 * reset模式下配置 在进入halt和工作模式前一定要线配置一次有效的BCR 之后就可以在halt模式下配置了,而不需要再在reset模式下配置了 */ R_CAN0->BCR_b.CCLKS = 0; /* 选择PCLK作为时钟源头 */ R_CAN0->BCR_b.BRP = 4; R_CAN0->BCR_b.SJW = 3; R_CAN0->BCR_b.TSEG1 = 13; R_CAN0->BCR_b.TSEG2 = 4; ``` 过滤: MKRk & 接收ID = MKRk & MBj_ID 则通过 MKIVLR必须设置为0,即必须使能过滤器,否则数据无法进入到邮箱, 如果不需要过滤可以设置MKRk为0,则任意ID都可以通过. 收 R_CAN0->MCTL_RX_b[i].RECREQ = 1; 发 写邮箱后 R_CAN0->MCTL_TX_b[index].TRMREQ = 1; /* 启动发送 */ ## 中断服务函数处理 见代码 注意清除标志的处理 # RA6M4 CAN通讯设计 总的结构体如下,详见代码 ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20220721/e6f2e18f1f7ca59ccc64db37bc8afbf0.png.webp) # CAN虚拟仪器设计 ## 上位机 https://github.com/qinyunti/arduino-canbus-monitor下下载 CANHackerV2.00.01.exe 双击安装即可 ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20220721/d32ca868b6a95cd44bd7d453bb3e7f36.png.webp) ## SLCAN协议 开发板和上位机基于SLCAN协议进行通讯。 Slcan接口协议采用ASCII码的方式进行数据交互,所以效率低,并且没有差错控制,没办法分帧,组帧,后面考虑优化为16进制的自定义协议。 参见https://github.com/qinyunti/canable-fw的 README.md 1)关闭can接口 发送字符“C”。 2) 打开can接口 发送字符“O” 3) can波特率设置 发送字符”S”+一个ASCII码数字。具体含义如下: 序号 波特率(bps) 发送命令 1 10K “S0” 2 20K “S1” 3 50K “S2” 4 100K “S3” 5 125K “S4” 6 250K “S5” 7 500K “S6” 8 750K “S7” 9 1M “S8” 10 83.3K “S9” 4) 接收数据帧 数据帧的构成包括:帧类型字符+CANID+数据长度+数据+“\r“ 扩展帧: “T1234567890123456789ABCDEF” 帧类型:“T” CANid:12345678 dlc: 9 data:01 23 45 67 89 AB CD EF 标准帧:“t12340123456789ABCDEF” 帧类型:“t” CANid:123 dlc: 4 data:01 23 45 67 89 AB CD EF 标准远程帧: “r1234” 帧类型:“r” CANid:123 dlc: 4 扩展远程帧:“R123456789” 帧类型:“R” CANid:12345678 dlc: 9 5)发送数据帧 格式同接收 SLCAN协议解析代码 见slcan.c # 基于SLCAN协议的CAN盒子 数据流见`<
>` 代码见`app_cancomu.c,app_uartcomu.c,slcan.c` ### 演示 按照如下接USB转串口线到PC P304作为RXD6,P305作为TXD6。 打开CANHacker 点击菜单栏的Settings,配置串口 ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20220721/96c4399b9dbe8c2a9fa1096ad773a6e6.png.webp) 点击菜单栏的Connect 按如下Single Shot发送数据,点击菜单栏Tracer可以看到收到了发送的数据 因为代码中设置了测试模式bsp_can_settest(CAN_ID_0,1,3); 即内部循环CTX发出的数据回环到CRX。当然也可以接其他的CAN设备进行测试。 ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20220721/342b98b3f2680b30ac1cb8b12c9f3fd4.png.webp) 使能hal_entry的can_tx(CAN_ID_0,&msg,10);可以看到连续的收到数据 ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20220721/21cfbcfa3f35e11b122820e047c1f7c0.png.webp) 演示视频 [fcfd7e88f034d92a18e95f6667da2a8f.mp4](https://club.rt-thread.org/file_download/2e61a553d266022a) ## 待优化 增加数据分发处理 ## 虚拟仪器设计 按照上面过程实际我们已经实现了一个具备使用价值的CAN盒子。我们可以继续扩展下架构更具备可移植性和扩展性。我们专门设置及一个服务端进程去作上述的和下位机通讯的工作,该服务端设置tcp服务,只要有客户端连接tcp则相应的将收到的CAN数据转发到各客户端,而从各客户端收到的数据则转发给RA6M4。这样各个客户端可以实现自己具体的功能,比如实现OBD功能,比如模拟车窗电机,雨刮器等等。这就体现到了虚拟仪器真正是如何虚拟的了。 ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20220721/1d3213b8d2dca35c3ca34fbddf7aa60a.png.webp) # 总结 在完成CAN的驱动后,基于现成的SLCAN协议和上位机CANHaker可以快速实现一个CAN总线监视器。各任务之间通讯主要使用了RT-Thread的消息队列等组件。为了优化效率和可移植性后面可以实现自定义协议,并实现C/S设计模式,实现远程连接和多客户端连接。
1
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
qinyunti
这家伙很懒,什么也没写!
文章
30
回答
1
被采纳
0
关注TA
发私信
相关文章
1
(苏州站)RT-Thread物联网开发者沙龙【已结束】
2
(成都站)RT-Thread物联网开发者沙龙
3
(深圳站)RT-Thread物联网开发者沙龙
4
(西安站)RT-Thread物联网开发者沙龙
5
成都站2018 RT-Thread开发者沙龙回顾及PPT下载
6
2018 RT-Thread物联网开发者沙龙(北京站)
7
2018 RT-Thread物联网开发者沙龙(南京站)
8
第十三届研电赛RT-Thread企业专项奖发布通知
9
RT-Thread应用作品征集大赛开始啦!
10
你的投票将决定RT-Thread官网应该优先准备的文档是哪些
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
UART
WIZnet_W5500
ota在线升级
freemodbus
PWM
flash
cubemx
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
flashDB
GD32
socket
中断
编译报错
Debug
SFUD
rt_mq_消息队列_msg_queue
msh
keil_MDK
ulog
C++_cpp
MicroPython
本月问答贡献
a1012112796
10
个答案
1
次被采纳
踩姑娘的小蘑菇
4
个答案
1
次被采纳
红枫
4
个答案
1
次被采纳
张世争
4
个答案
1
次被采纳
Ryan_CW
4
个答案
1
次被采纳
本月文章贡献
catcatbing
3
篇文章
5
次点赞
YZRD
2
篇文章
5
次点赞
qq1078249029
2
篇文章
2
次点赞
xnosky
2
篇文章
1
次点赞
Woshizhapuren
1
篇文章
5
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部