Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
CAN总线
30
CAN回环模式下示波器测CAN_TX无法收到波形?
发布于 2022-03-10 11:22:29 浏览:2048
订阅该版
如题所示,下图是我在RT-Thread Studio串口终端打印到的数据,开启了can_rx_thread接收来自main()主函数线程发送的数据 ![1.jpg](https://oss-club.rt-thread.org/uploads/20220310/56e06a903fd5dfea73a2c10f6715a962.jpg.webp) 下面是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 ![2.jpg](https://oss-club.rt-thread.org/uploads/20220310/a62973b06e680aef659b10de9e07876b.jpg.webp) 使用正点原子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来计算的,见下图(看英文的绿色注释) ![4.jpg](https://oss-club.rt-thread.org/uploads/20220310/395e6ff13123ae1e3e301be08743fb4c.jpg.webp) 并且我在debug模式下跑过整个流程,各个寄存器的值在执行过程中的变化是没问题的,按道理来说是不会出现测不到波形的状况,求赐教 下图是debug模式中设置完500kHz波特率后bxCAN控制器中寄存器的值 ![3.jpg](https://oss-club.rt-thread.org/uploads/20220310/d63e5ff9ced8ec2d0d13848cbcab0066.jpg.webp)
查看更多
Code_Monkey
2022-03-10
这家伙很懒,什么也没写!
建议查看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
这家伙很懒,什么也没写!
已解决,居然是正点原子STM32F103RBT6 Nano板MCU本身的问题,有可能是里面的输出PMOS和NMOS出问题了(使用电压表测得GPIOA_Pin_12脚电压比正常工作的STM32F103RBT6的电压低0.5V左右) 我换成STM32F103RBT6最小系统板(除去了所有外设,只剩下MCU本身&Boot电路&复位电路&晶振)就可以了
撰写答案
登录
注册新账号
关注者
0
被浏览
2k
关于作者
GeorgeZZQ
这家伙很懒,什么也没写!
提问
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
国产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组件
最新文章
1
使用RC522软件包驱动FM1722
2
常量数据类型和表达式陷阱分享
3
进行i2c驱动移植的经验总结
4
在VSCode中使用clang-format
5
我该如何使用这个微雪的WIFI400 WIFI-LPB-100在rtt里或者我该怎样为它开发驱动
热门标签
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
GD32
flashDB
socket
中断
编译报错
Debug
rt_mq_消息队列_msg_queue
SFUD
msh
keil_MDK
ulog
C++_cpp
MicroPython
本月问答贡献
出出啊
1517
个答案
342
次被采纳
小小李sunny
1444
个答案
289
次被采纳
张世争
809
个答案
175
次被采纳
crystal266
547
个答案
161
次被采纳
whj467467222
1222
个答案
148
次被采纳
本月文章贡献
catcatbing
3
篇文章
5
次点赞
qq1078249029
2
篇文章
2
次点赞
xnosky
2
篇文章
1
次点赞
Woshizhapuren
1
篇文章
5
次点赞
YZRD
1
篇文章
2
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部