【实验】关于 R4850G2 的 CAN 通讯协议
zvs吧
全部回复
仅看楼主
level 11
wait1210day 楼主
一转眼间就是三年了,这次回到 Z 吧看看,多了好多新面孔啊
三年前,我发了个拆解华为 R4850G2 的帖子(https://tieba.baidu.com/p/5568795188),并扬言「要是能搞到它的通信协议才好玩」[滑稽]
几天前我突然想起这事,参考了诸多国内外论坛上关于 R4850G2 的帖子、华为官方的手册,并加上我自己的一些分析和猜测,发现了 R4850G2 CAN 总线的一些玩法和功能,在此帖中一一实验并记录下来,以示后人[滑稽]
咱二楼开始
2021年08月02日 07点08分 1
level 11
wait1210day 楼主
不了解 R4850G2 电源的吧友,可以看一下我之前拆机的那个帖子。这里仅仅简单地介绍一下它。R4850G2 是华为制造的一款通信电源,标称 53.5V 56.1A。在当年因为低廉的二手价格和它优异的性能、严谨的做工在 DIY 圈非常受欢迎。电源有两个版本,在主拓扑和 PFC 部分有些许区别,一个版本是三相交错 LLC,另一个版本是普通 LLC。
2021年08月02日 07点08分 2
level 11
wait1210day 楼主
这是 R4850G2 的尾部接口部分,除了必要的市电输入以及直流输出端口外,还有四个较细的金手指(有两个在背面),其中左侧上下两个金手指是 slot detection(槽位检测),右侧上下两个金手指就是 CAN 总线的 CANL 和 CANH 了
2021年08月02日 07点08分 3
level 11
wait1210day 楼主
在真正谈及 CAN 之前,我们先来说说这个电源的 slot detection。我们暂且把上面的槽位检测金手指记为 SLOT_1,下面的记为 SLOT_2。
lz 有幸搞到了一块 R4850G2 的尾插电路板,经过简单地抄板研究,画出了关于槽位检测部分的电路。其中所有标记 SW 开头的节点都连接到了一个 DIP8 拨码开关,SWx_A 和 SWx_B 连接到第 x 个开关的两端。VCC 直接取了 R4850G2 的 53.5V 输出。(实际上这个电路在我之前一篇帖子里发布过,不过当时那个电路画得非常混乱,这个是重新检查+整理之后的版本[滑稽])
2021年08月02日 08点08分 4
@琴酒-GIN 很抱歉,我现在 R4850 不在手边,最近很忙也没空,不能帮上忙很抱歉[委屈]
2024年10月29日 00点10分
然后最近我在设计电源的过程中用到了并机均流,其基本原理就是离输出端较远的电源模块由于输出线较长因此电流会较小,因此通过一根均流线薇薇的提高一点输出电压就可以了,我看到您画的这张图猜想会不会也是类似的功能
2024年10月28日 16点10分
楼主您好,我在去年因为工作需要在研究R4875,然后看到您的帖子,真是受益匪浅,实在佩服[真棒][真棒][真棒][真棒]
2024年10月28日 16点10分
就是对于较距离输出线较远的槽位通过设置slot上的相对电源微调输出电压,从而较好的实现offline模式下的均流,避免开机过程或CAN总线掉线时出现较大的电流不均衡情况
2024年10月28日 17点10分
level 11
wait1210day 楼主
简单地分析一下这个电路:
R4, R5, R6, R3, U1 构成一个基于 TL432(电气特性与 TL431 基本相同,但有些厂商的 TL432 基准电压为 1.25V)的稳定电压源,然后接到一个电阻分压网络上,最后分压器的输出接到 R4850G2 的 SLOT_1。
若 C13 两端电压为 Vm
R6, R3 构成基本的分压器,根据分压器的特性,可知 TL432 1 脚电压 Vref' = Vm * R3 / (R6 + R3)
根据 TL432 的特性,其 1 脚电压 Vref = 2.5V
明显 Vref=Vref',可得 Vm = Vref * (R6/R3 + 1) = 27.5V
也就是说这里用 TL432 构造了一个稳定在 27.5V 的电压源,这为后面的电阻分压网络提供了基本的固定电压。
2021年08月02日 08点08分 5
level 11
wait1210day 楼主
拨码开关可以选择性地短路掉分压网络中的一些电阻,在输出端获得不同的电压。实测这个电压最大值为 2.8V(拨码开关全部断开),最小为 0V(拨码开关全部闭合)。
而 SLOT_2 端则直接通过一个电阻接到输出负极了,到底 slot detection 对这个电源来说意味着什么,以及这些拨码开关究竟在设置什么,lz 也暂时不清楚[滑稽]
唯一已知的是,SLOT_1 和 SLOT_2 必须被拉低到一定电压(0V 都可以)电源才会启动。[阴险]
2021年08月02日 08点08分 6
level 11
wait1210day 楼主
ok 咱正式来看看神秘的 CAN 协议部分。
测试环境 lz 使用了一块 MCP2515 芯片作为 CAN 收发器,配合 Arduino Uno 连接到电脑上观察 CAN 总线上的数据传输。电脑端用的 Linux 系统,用安装了 PlatformIO 拓展的 VS Code 作为 Arduino 的 IDE(vscode 基于 clangd 的代码补全和智能提示比 Arduino 官方的那个破 IDE 强多了[阴险])
R4850G2 采用 125Kbps 速率的 CAN 总线,29 位拓展的 CAN ID。
2021年08月02日 08点08分 7
[what][what][惊哭][惊哭]求这个IDE的部署方法,原版IDE简直用的全身肿胀难受啊[泪][真棒][真棒]
2021年08月02日 12点08分
@wait1210day 哦哦哦谢谢大佬[真棒][真棒][小乖]
2021年08月03日 00点08分
level 11
wait1210day 楼主
测试环境,别问为啥不是双绞线,问就是没有也懒得绕[滑稽]
2021年08月02日 08点08分 8
level 11
wait1210day 楼主
* 实验 I:仅读取 CAN 总线不发送任何数据
在上电瞬间,R4850G2 每间隔 131ms 以 ID:1000107E 发送了两条内容一样的报文:
30 01 24 68 63 60 06 69 [十六进制表示]
间隔 254ms,以同样的 ID 发送同样的报文,不过第二字节内容变成了 02
30 02 24 68 63 60 06 69
此后,每间隔 325ms 以 ID:1001107E 发送了 7 条一样的报文:
30 01 24 68 63 60 06 69
间隔 1931ms,再次以 ID:1001107E 发送了 1 条报文:
30 01 24 68 63 60 06 69
2021年08月02日 09点08分 9
level 11
wait1210day 楼主
上述共 11 条报文,只看 ID 暂且不论其数据内容,我们可以归为一组报文,暂且称为报文组 PG_A。
接着, PG_A 再次出现,除了最后一条报文数据有变外,其它报文数据同 PG_A 第一次出现时完全一致。
最后一条报文数据变为:
00 02 00 00 00 00 00 00
2021年08月02日 09点08分 10
level 11
wait1210day 楼主
接着,间隔 353ms,以 ID:100011FE 发送:
00 01 00 0x 00 00 00 00
接着每间隔 377ms 以 ID: 1001117E 发送 7 条报文:
00 01 00 0y 00 00 00 00
接着每间隔 16ms 再次以 ID:1001117E 发送一条报文:
00 02 00 00 00 00 00 00
把上述 9 条报文归为一组,暂且称为报文组 PG_B。
同时观测输出电压,发现当上电之后,发送 PG_A 两次,其中风扇开始运作,输出电压开始上升时正好对应 PG_A 第一次发送的最后一条报文。
当输出电压上升至设定值并稳定时,PG_B 开始被反复发送。
2021年08月02日 09点08分 11
level 11
wait1210day 楼主
当市电输入被切断,PG_B 仍然继续发送,但此时输出电压开始下降,楼上描述的报文中的 x=y=1,正常情况下(具有稳定输出时)x=y=0
2021年08月02日 09点08分 12
[大拇指]
2023年11月09日 08点11分
level 12
cy[滑稽]
2021年08月02日 09点08分 13
level 11
wait1210day 楼主
明天继续更。明天咱来看看如何轮询电源的输出电压,以及调整输出电压、电流。[滑稽]
2021年08月02日 14点08分 14
实际上,对 R4850G2 发起状态查询请求,它不仅会返回当前的输出电压,还会附带输入电压、输入功率、输入电流、输入市电频率、效率、输出电流、输出功率、温度等等参数[滑稽]
2021年08月02日 14点08分
level 13
好家伙,失踪人口大回归
2021年08月03日 07点08分 15
[滑稽]
2021年08月03日 07点08分
1 2 3 尾页