硬汉嵌入式论坛

 找回密码
 立即注册
查看: 232|回复: 6
收起左侧

[CAN/FDCAN] 急急急请教各位大佬们一个关于can通信的问题

[复制链接]

6

主题

6

回帖

24

积分

新手上路

积分
24
发表于 2025-5-22 15:51:42 | 显示全部楼层 |阅读模式

  • 我是使用ESP32S3作为主机,雅特力AT32F437VGT6做的从机,他们的波特率都设置成了1M,通过CAN总线主机一次发送2K的数据给从机然后等待从机返回响应,从机收到2K数据后,会置位计数器以及将收到的这2K数据写入flash中进行升级过程,然后写入flash后返回响应,依此继续一直发送以及接收知道bin文件数据发送完成。
  • 目前遇到的问题是我在ESP32S3上通过CAN发送数据的时候都是有打印log的,然后我查看了每次发送的都是正确的数据,但是AT32F437VGT6从机收完所有的包之后,我通过烧录器查看flash内容却和上传的bin内容有很多不一样的地方,这不知道是为什么。导致我一直无法更新程序,会不会是主机那边发送太快了?然后从机这边接收就一直再收然后覆盖了?有大佬帮忙看看不,给小弟提供点思路。

1747900109262.png
1747900198648.jpg
回复

使用道具 举报

6

主题

268

回帖

286

积分

高级会员

积分
286
发表于 2025-5-22 21:58:06 | 显示全部楼层
每发送8字节数据就响应一次,你连续发送2K中间没有回应么?
回复

使用道具 举报

0

主题

30

回帖

30

积分

新手上路

积分
30
发表于 2025-5-23 08:00:49 | 显示全部楼层
你这个协议设计的太阳春了,没有考虑丢包等处理


在 can 头部弄几个位存放 cnt 和是否回复的标志,下面是我打印机传文件的协议,虽然是基于串口的,但也可以参考:


### 端口 0x14: 写入打印数据

```
H -> D: src_port  14         data
H <- D: 14        src_port   err_flags_8 p_state_8 quad_cnt_16 free_space_32
```

这是 cdnet 数据包,开头固定是原端口和目标端口两个字节,外部还有 cdbus 帧头(原地址 目标地址 数据长度)和 帧尾(modbus crc)没有写

命令原端口号为 ≥ 0x40 的临时端口,也可以看做命令序列号;目标端口 0x14 为打印数据传输功能

#### 命令

此命令对原端口号的低 4 位有要求:

bit3 为 1 时该端口不回复,为 0 正常回复  
bit[2:0] 为包序号 cnt,每收到一个正确序号的包加 1(先回复再加),如果序号校验不正确,则置位对应错误标记,并丢弃数据。  

每个文件的首包 cnt 为 0,可通过寄存器通道读写,或者使用 d_ctrl 寄存器清零

也可以写一个 data 为 0 长度的包清除 cnt 错误,和清零 cnt


#### 回复

- err_flags 为 0 时表示没有错误,为 1 时表示存在错误,譬如 cnt 检查不通过
- p_state_8 为打印机当前状态
- quad_cnt_16 是位置编码器当前计数
- free_space_32 是当前剩余空间,单位是字节


#### 传输流程

打印机支持一边打印一边传输下一行打印文件。

传输一个文件结束后,要往 d_ctrl 寄存器写入 0x02 告诉打印机传输完毕,进行文件更新。  
如果上一个文件正在打印,要等待打印完成再进行文件更新,否则会干扰当前打印。

如果传入一份打印数据后不再更新,则每次打印相同内容。


#### 高效传输方式

每个命令都要求回复可以确保数据正确写入,但是传输效率会很低,为了提高传输效率,建议使用以下方式:

先传输两组数据包到打印机,每组有多个数据包,仅最后一个包要求回复;  
每当接收到前一组的回复包,若没有错误,则再追加一组数据包。

更简单的做法是:仅最后一个包请求回复,如果出错,清除数据再整体重新传输。

回复

使用道具 举报

2

主题

69

回帖

75

积分

初级会员

积分
75
发表于 2025-5-23 08:40:09 | 显示全部楼层
flash要先擦后写,否则结果会不符合预期
回复

使用道具 举报

2

主题

9

回帖

15

积分

新手上路

积分
15
发表于 2025-5-23 09:48:29 | 显示全部楼层
要把包号记录好,防止丢包与错位包现象,一问一答式。从机发送需求包号,主机发该包号的数据,从机正确收到该包号,再请求下一包!
回复

使用道具 举报

6

主题

6

回帖

24

积分

新手上路

积分
24
 楼主| 发表于 2025-5-23 10:21:05 | 显示全部楼层
fxyc87 发表于 2025-5-22 21:58
每发送8字节数据就响应一次,你连续发送2K中间没有回应么?

这个有 会等待flash写入完 然后从机响应
回复

使用道具 举报

6

主题

6

回帖

24

积分

新手上路

积分
24
 楼主| 发表于 2025-5-23 10:24:26 | 显示全部楼层
dukelec 发表于 2025-5-23 08:00
你这个协议设计的太阳春了,没有考虑丢包等处理

感谢感谢大佬的回复,我给主机端发送放慢 我发现我写入flash的错误数据就减少很多
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-6-10 06:27 , Processed in 0.241022 second(s), 26 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表