乘风飞扬
发表于 2023-7-24 14:41:41
stcstc 发表于 2023-7-24 10:14
楼主这个程序是官方例程修改的,例程我没有修改我这个怎么一直1ms发送一次呢?定时器的值修改和计算器1000 ...
如果使用屠龙刀板子,将两路CAN的收发器都焊上,就可以进行收发通信了。
屠龙刀例程包里面“14-CAN1-CAN2总线标准帧扩展帧同时使用收发测试”这个例程可以直接烧录到板子上进行测试。
只开一路CAN控制器想自发自收是不行的,要同时打开两组CAN并将它们连在一起才可以进行通信。
stcstc
发表于 2023-7-24 15:57:35
乘风飞扬 发表于 2023-7-24 14:41
如果使用屠龙刀板子,将两路CAN的收发器都焊上,就可以进行收发通信了。
屠龙刀例程包里面“14-CAN1-CAN2 ...
以下来至百度// 0:离线状态的退出过程是,软件对INRQ位进行置1随后清0后,一旦硬件检测到128次11位连续的隐性位,则退出离线状态 //
刚刚百度其它论坛的描述,如果按128次应答错误就重复发128次,实测一帧数据1ms左右数据串也只占定时器1000ms的四分之一,剩下来的四分之三时间应该进入空闲电平吧!
感谢飞扬的回答
乘风飞扬
发表于 2023-7-24 17:02:32
stcstc 发表于 2023-7-24 15:57
以下来至百度// 0:离线状态的退出过程是,软件对INRQ位进行置1随后清0后,一旦硬件检测到128次11位连续 ...
STC CAN控制器是通过以下指令退出BUS-OFF状态:
CANAR = MR;
CANDR &= ~0x04;//清除 Reset Mode, 从BUS-OFF状态退出
检查一下你使用的程序,看都有哪些地方有进行BUS-OFF恢复的。
神农鼎
发表于 2023-7-24 17:30:37
【新提醒】CAN 的 入门参考资料,第三方 - CAN/Lin/CANOpen - 国芯论坛-STC全球32位8051爱好者互助交流社区 - STC全球32位8051爱好者互助交流社区 (stcaimcu.com)
llyymm
发表于 2023-8-8 09:24:35
乘风飞扬 发表于 2023-7-24 17:02
STC CAN控制器是通过以下指令退出BUS-OFF状态:
检查一下你使用的程序,看都有哪些地方有进行BUS-OFF恢 ...
你在两个发送指令中间加一个1ms的延时试试,先试试能否成功
llyymm
发表于 2023-8-8 09:35:07
还有一个事情你要确认,接收端是否能及时处理接收的数据,如果第一条收到但是还没有处理完,第二条没有延时直接发送,接收端数据会冲掉的,你看看是不是这个原因,因为我的项目就遇到过,接收端我是用了两个数组保存的,接收中断如果发现接收数组1不是空的就直接存放到数组2里,如果同时接收到三个,就没办法解决了,这也是我比较困扰的地方,不知道其他朋友有没有好办法
乘风飞扬
发表于 2023-8-8 10:48:00
llyymm 发表于 2023-8-8 09:35
还有一个事情你要确认,接收端是否能及时处理接收的数据,如果第一条收到但是还没有处理完,第二条没有延时 ...
CAN总线数据帧接收缓冲区有64字节,就算前面帧接收完没处理,新的帧也会收到缓冲区里,只要在缓冲区溢出之前读取就不会丢失。
llyymm
发表于 2023-8-10 21:08:43
乘风飞扬 发表于 2023-8-8 10:48
CAN总线数据帧接收缓冲区有64字节,就算前面帧接收完没处理,新的帧也会收到缓冲区里,只要在缓冲区溢出 ...
我CAN网络有8个模块,有一块是代替上位机接收其他7块CAN数据,并根据数据发送CAN指令让下位机执行,我用的是早期的官方CAN程序,看来我要抽时间看看新代码了{:4_167:}
魔右手
发表于 2023-8-22 11:03:38
例程CAN发送里使用WHILE(B_Can2Send);死等,如果CAN没接节点或者故障,单片机就会一直死等,建议 改成while(B_Can2Send && --t);
乘风飞扬
发表于 2023-8-22 11:20:43
魔右手 发表于 2023-8-22 11:03
例程CAN发送里使用WHILE(B_Can2Send);死等,如果CAN没接节点或者故障,单片机就会一直死等,建议 改成wh ...
增加超时退出,故障中断里清除发送标志,这样会稳妥一些,谢谢提醒。