Toggle navigation
首页
问答
文章
话题
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
CAN
30
CAN回环模式下示波器测CAN_TX无法收到波形?
发布于 2022-03-10 11:22:29 浏览:296
如题所示,下图是我在RT-Thread Studio串口终端打印到的数据,开启了can_rx_thread接收来自main()主函数线程发送的数据  下面是main主线程发送数据代码,发送和接收的代码都是用例程给的,发送模式设置成环回模式,我的理解是STM32内置的bxCAN控制器只能向总线发送数据,接收不到总线数据,并且CAN_TX引脚在控制器内部就将数据交给CAN_RX 我在无RT_Thread情况下,回环模式和正常模式都调通了,并且这两种模式测得都有波形,并且PC中CAN分析仪的上位机软件可以收到CAN帧 ``` /*CAN设备操作*/ rt_err_t can_ret = 0; rt_size_t size = 0; struct rt_can_msg msg = { 0 }; //can1使用PA11 PA12引脚 can_dev = rt_device_find(CAN_DEV_NAME); if (can_dev == RT_NULL) { LOG_E("rt_device_find [can1] failed...\n"); return -EINVAL; } //以中断接收及发送模式打开 CAN设备 can_ret = rt_device_open(can_dev, RT_DEVICE_FLAG_INT_TX | RT_DEVICE_FLAG_INT_RX); if (can_ret < 0) { LOG_E("rt_device_open [can1] failed...\n"); return can_ret; } //设置 CAN 通信的波特率为 500kbit/s can_ret = rt_device_control(can_dev, RT_CAN_CMD_SET_BAUD, (void *) CAN500kBaud); can_ret = rt_device_control(can_dev, RT_CAN_CMD_SET_MODE, (void *)RT_CAN_MODE_LOOPBACK); //获取 CAN 总线设备的状态 can_ret = rt_device_control(can_dev, RT_CAN_CMD_GET_STATUS, &status); LOG_D("can bus current status:%d", can_ret); //初始化CAN接收信号量 rt_sem_init(&can_sem, "can_sem", 0, RT_IPC_FLAG_FIFO); //创建CAN接收线程,并开启 can_th = rt_thread_create("can_rx", can_rx_thread, RT_NULL, 1024, 25, 10); if (can_th != RT_NULL) { rt_thread_startup(can_th); } else { rt_kprintf("create can_rx thread failed!\n"); } while (1) { msg.id = 0x78; /* ID 为 0x78 */ msg.ide = RT_CAN_STDID; /* 标准格式 */ msg.rtr = RT_CAN_DTR; /* 数据帧 */ msg.len = 8; /* 数据长度为 8Byte */ /* 待发送的 8 字节数据 */ msg.data[0] = 0x30; msg.data[1] = 0x31; msg.data[2] = 0x32; msg.data[3] = 0x33; msg.data[4] = 0x34; msg.data[5] = 0x35; msg.data[6] = 0x36; msg.data[7] = 0x37; /* 发送一帧 CAN 数据 */ size = rt_device_write(can_dev, 0, &msg, sizeof(msg)); //&msg:CAN帧起始地址 if (size == 0) { rt_kprintf("can_dev write data failed!\n"); } rt_thread_delay(1000); } ``` 以下是can_rx_thread接收数据代码 ``` 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_callback); #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:0x100~0x1ff,hdr 为 - 1,设置默认过滤表 */ RT_CAN_FILTER_ITEM_INIT(0x300, 0, 0, 0, 0x700, RT_NULL, RT_NULL), /* std,match ID:0x300~0x3ff,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 = -1; /* 阻塞等待接收信号量 */ rt_sem_take(&can_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]); } rt_kprintf("\n"); } } ``` 下图是示波器测不到波形,探头接CAN_TX,鳄鱼夹接GND  使用正点原子STM32F103RBT6 开发板,无外部高速晶振HSE,所以PLL倍频后时钟SYSCLK最高速=64MHz,经过AHB,APB1预分频后APB1CLK=32MHz(在drv_clk.c的system_clock_config()配置),导致我修改了drv_can.c中的波特率数组 CAN500kBaud, (CAN_SJW_2TQ | CAN_BS1_4TQ | CAN_BS2_3TQ | 8)},即(32/(3+4+1)*8=500KHz),修改的原因是原数据是使用APB1CLK=36MHz来计算的,见下图(看英文的绿色注释)  并且我在debug模式下跑过整个流程,各个寄存器的值在执行过程中的变化是没问题的,按道理来说是不会出现测不到波形的状况,求赐教 下图是debug模式中设置完500kHz波特率后bxCAN控制器中寄存器的值 
查看更多
Code_Monkey
2022-03-10
This guy hasn't written anything yet
建议查看CAN_BTR寄存器,并认真查看ST的参考手册 --- CAN_BTR 寄存器的 SILM 位置 1,将 bxCAN 置于静默模式。 - RX和TX内部短接,示波器只能测量到RX信号 CAN_BTR 寄存器的 LBKM 位置 1,将 bxCAN 置于环回模式。 - RX和TX内部短接,示波器只能测量到TX信号 CAN_BTR 寄存器的 LBKM 和 SILM 位置 1,将环回模式和静默模式组合起来。 - RX和TX内部短接,示波器不能测量到信号
2
个回答
默认排序
按发布时间排序
GeorgeZZQ
2022-03-15
This guy hasn't written anything yet
已解决,居然是正点原子STM32F103RBT6 Nano板MCU本身的问题,有可能是里面的输出PMOS和NMOS出问题了(使用电压表测得GPIOA_Pin_12脚电压比正常工作的STM32F103RBT6的电压低0.5V左右) 我换成STM32F103RBT6最小系统板(除去了所有外设,只剩下MCU本身&Boot电路&复位电路&晶振)就可以了
撰写答案
登录
注册新账号
关注者
0
被浏览
296
关于作者
GeorgeZZQ
This guy hasn't written anything yet
提问
3
回答
3
被采纳
0
关注TA
发私信
相关问题
1
我也来传一个CANOpen移植,RTT+STM32F107+CanOpenNode
2
谁有STM32裸跑的CANopen程序啊???
3
CAN驱动程序框架
4
CAN驱动接口如何规范一下
5
RTT无法进入线程.Cannot access Memory
6
编译提示arm-none-eabi/bin/ld: cannot find crt0.o: No such file o
7
rtt 2.1.0 正式版 mdk4 bsp/stm32 编译canapp.c错误
8
STM32F10XCAN驱动使用的问题
9
2.1版本stm32f10x分支bxcan驱动波特率设置的bug
10
rtthread2.1.0下,找不到can1设备
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
五分钟玩转RT-Thread新社区
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
国产MCU移植系列教程汇总,欢迎查看!
最新文章
1
MQTT协议栈的原理及交互流程图
2
LVGL例程学习——get_started
3
瑞萨RA6M4 SPI0 W5500
4
这才是优美的文件系统挂载方式,亲测有效
5
基于RT-Thread+RA6M4的智能安防系统
热门标签
RT-Thread Studio
串口
LWIP
FinSH
ART-Pi
Env
AT
SPI
Bootloader
USB
Hardfault
CAN
文件系统
studio
DMA
RT-Thread
线程
Nano
stm32
ota
MQTT
SCons
rtthread
ESP8266
freemodbus
I2C
UART
软件包
flash
cubemx
RTC
定时器
W5500
FAL
BSP
rt-smart
rtt
PWM
AB32VG1
ADC
编译报错
msh
socket
SDIO
C++
dfs
at_device
SFUD
MicroPython
RT-Studio
本月问答贡献
小小李sunny
38
个答案
10
次被采纳
出出啊
29
个答案
7
次被采纳
lchnu
11
个答案
5
次被采纳
红枫
23
个答案
4
次被采纳
rcp
14
个答案
4
次被采纳
本月文章贡献
张世争
11
篇文章
30
次点赞
吉利咕噜2022
4
篇文章
5
次点赞
crystal266
3
篇文章
7
次点赞
Liutao
3
篇文章
4
次点赞
RTT_逍遥
2
篇文章
11
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部