4、SSI协议详解(下):多圈数据扩展、CRC校验实现、常见问题与调试技巧
4.1 多圈数据扩展:不止是位置
上一讲我们聊了SSI单圈数据的读取。但实际项目中,光有单圈位置往往不够。你想想看,一个机械臂转了好几圈,你只知道它在当前圈内的角度,不知道它转了多少圈——这怎么行?
多圈数据扩展,说白了就是在SSI的帧结构里,把单圈位置数据后面再塞几个字节,用来记录圈数。我最早接触这个是在做AGV小车的转向轮编码器时,轮子转起来没完没了,没有多圈数据,系统根本不知道方向盘打了多少圈。
常见的多圈数据格式是这样的:
| 单圈位置 (12~17 bits) | 多圈计数 (12~25 bits) | 状态位 (1~4 bits) | CRC (6~8 bits) |
举个例子,一个25位SSI帧结构:
- Bit 24 ~ Bit 13:单圈位置,12位分辨率,对应0~4095
- Bit 12 ~ Bit 1:多圈计数,12位,最大4096圈
- Bit 0:状态位,比如奇偶校验或报警标志
这里有个坑——多圈数据的有效范围取决于编码器的机械设计。有些编码器用齿轮减速机构来记录圈数,最多只能记4096圈。你如果硬要它记10000圈,数据就会溢出回零。我在调试一个龙门吊的编码器时就遇到过,吊臂升到一半,圈数突然归零了,吓得我赶紧查手册——原来是多圈范围设错了。
4.2 CRC校验实现:给数据上把锁
SSI协议本身没有强制要求CRC,但工业现场干扰多,数据出错是常事。我习惯在SSI帧尾加上CRC校验,尤其是长距离传输时。
常用的CRC算法是CRC-8,多项式为 x^8 + x^2 + x + 1(即0x07)。实现起来不复杂,我直接贴代码:
// CRC-8 查表法实现
uint8_t crc8_table[256];
void crc8_init(void) {
for (uint16_t i = 0; i < 256; i++) {
uint8_t crc = i;
for (uint8_t j = 0; j < 8; j++) {
if (crc & 0x80)
crc = (crc << 1) ^ 0x07;
else
crc <<= 1;
}
crc8_table[i] = crc;
}
}
uint8_t crc8_calc(uint8_t *data, uint8_t len) {
uint8_t crc = 0;
for (uint8_t i = 0; i < len; i++) {
crc = crc8_table[crc ^ data[i]];
}
return crc;
}
使用时,把单圈位置和多圈计数的字节依次喂进去,算出来的CRC值放在帧尾。接收端同样算一遍,比对一下。不一致?说明数据有问题,直接丢弃。
4.3 常见问题与调试技巧
做SSI调试,说白了就是跟时序和噪声作斗争。我总结了几条高频问题,你对照着排查,能省不少时间。
4.3.1 时钟频率不匹配
SSI的时钟频率范围很宽,从100kHz到2MHz都有。频率太高,线缆长了信号会衰减;频率太低,数据更新慢。我一般先看编码器手册,找到最大时钟频率,然后降一半用。比如手册写1MHz,我就用500kHz起步。
4.3.2 数据错位
有时候读出来的数据忽大忽小,像是乱码。这多半是时钟沿没对齐。SSI协议规定数据在时钟上升沿采样,但有些编码器是下降沿。我习惯用示波器同时抓CLK和DATA,数一下时钟脉冲个数,看数据位对不对得上。
4.3.3 单稳态时间设置不当
SSI帧结束的标志是时钟停止超过单稳态时间(通常12~25μs)。如果这个时间设得太短,主控会误判帧结束,提前开始下一帧。设得太长,又影响更新率。我一般取20μs,大部分编码器都兼容。
4.3.4 线缆干扰
工业现场电机、变频器一开,编码器数据就乱。解决办法:
- 用屏蔽双绞线,屏蔽层单端接地
- 时钟线和数据线分开走,别跟动力电缆捆一起
- 加RC滤波,电阻100Ω,电容100pF,放在接收端
我曾经在一个变频器柜旁边调试编码器,数据死活读不对。后来发现柜门一关就好,一开就乱——原来是变频器辐射干扰。最后加了磁环才搞定。
4.4 调试工具与流程
我调试SSI的标配工具:
- 示波器:至少2通道,抓CLK和DATA
- 逻辑分析仪:解码SSI帧,看数据位对不对
- 串口助手:打印原始数据,方便比对
调试流程我一般这样走:
- 先确认硬件连接:CLK、DATA、GND,三根线别接反
- 用示波器看CLK波形:频率对不对?幅值够不够?
- 用逻辑分析仪抓一帧数据:数一下位数,跟手册对一下
- 读出来的原始数据转成二进制,看单圈和多圈值是否合理
- 转动编码器,看数据是否连续变化
嗯,这套流程我用了十年,基本没翻过车。
4.5 知识体系总览
下面这张图把SSI多圈扩展、CRC校验和调试要点串起来了,你保存下来,以后调试时对照着看:
好了,SSI协议的核心内容就这些。多圈扩展让你知道位置的历史,CRC校验保证数据的清白,调试技巧帮你快速定位问题。这三样东西,你吃透了,SSI这块基本就稳了。