|
SMBus是在I2C硬件通讯协议上设计的一款应用层协议,一般工作在100KHz速率下。随着SMBus协议的发展,SMBus协议又对I2C硬件外设提出需求,影响到I2C外设的发展。SMBus的应用层有一个附属字节——PEC字节。 PEC(Packet Error Checking)是SMBus协议中基于CRC-8算法的错误检测机制,通过计算数据包的校验值来保障传输可靠性。其核心流程包括: 计算范围:覆盖从设备地址(含读写位)、命令码及所有数据字节,不包含起始/停止信号等协议层信息。 算法实现:采用多项式C(X)=X⁸+X²+X¹+1(0x07)的CRC-8校验,生成1字节校验值附加于数据包末尾。 验证机制:接收端重新计算校验值并与接收到的PEC字节比对,若不一致则判定传输错误。
再附一下PEC的生成源代码: - /**
- * SMBus PEC计算函数
- * 使用CRC-8多项式: x + x + x + 1 (0x07)
- *
- * @param data 待计算的数据缓冲区
- * @param len 数据长度
- * [url=/u/return]@return[/url] 计算得到的PEC字节
- */
- uint8_t smbus_calculate_pec(const uint8_t *data, uint8_t len) {
- uint8_t crc = 0;
-
- for (uint8_t i = 0; i < len; i++) {
- crc ^= data[i];
-
- for (uint8_t bit = 0; bit < 8; bit++) {
- if (crc & 0x80) {
- crc = (crc << 1) ^ 0x07;
- } else {
- crc = crc << 1;
- }
- }
- }
-
- return crc;
- }
PEC的优势 确保读数在长线缆或噪声环境下的准确性 增加1字节传输开销,但显著降低重传率
我在EEPROM的读写操作上面就应用了PEC的校验,只不过EEPROM并不支持SMBus模式,而PEC校验也是占用最后一个字节数据来实现的。损失了一个字节,增加了传输可靠性。
|