免費論壇 繁體 | 簡體
Sclub交友聊天~加入聊天室當版主
分享
返回列表 回復 發帖

PM_BUS CRC

uint8_t crc8(const uint8_t *data, int len)
{
        return crc8_arg(data, len, 0);
}
uint8_t crc8_arg(const uint8_t *data, int len, uint8_t previous_crc)
{
        unsigned crc = previous_crc << 8;
        int i, j;
        for (j = len; j; j--, data++) {
                crc ^= (*data << 8);
                for (i = 8; i; i--) {
                        if (crc & 0x8000)
                                crc ^= (0x1070 << 3);
                        crc <<= 1;
                }
        }
        return (uint8_t)(crc >> 8);
}


TI參考資料連結

CRC 即循环冗余校验码(Cyclic Redundancy Check),是数据通信领域中最常用的一种差错校验码,
其特征是信息字段和校验字段的长度可以任意选定。利用 CRC 进行检错的过程可简单描述为:在发送端
根据要传送的 k 位二进制码序列,以一定的规则产生一个校验用的 r 位监督码(CRC 码),附在原始信息后
边,构成一个新的二进制码序列数共 k+r 位,然后发送出去。在接收端,根据信息码和 CRC 码之间所遵
循的规则进行检验,以确定传送中是否出错。这个规则,在差错控制理论中称为“生成多项式”。
在 UCD 系列控制器中采用 8 位循环冗余校验(CRC-8),生成多项式为:C(x) = x8 + x2 + x1 + 1,表
示成二进制是 0b100000111。



0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 = CRC
      1 0 0 0 0 0 1 1 1 异或(生成多项式)
      0 0 0 0 1 0 1 1 1 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 = CRC
                 1 0 0 0 0 0 1 1 1 异或(生成多项式)
                 0 0 1 1 1 0 1 1 1 0 0 0 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 = CRC
                       1 0 0 0 0 0 1 1 1 异或(生成多项式)
                       0 1 1 0 1 1 0 1 1 0 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 = CRC
                          1 0 0 0 0 0 1 1 1 异或(生成多项式)
                          0 1 0 1 1 0 0 0 1 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 = CRC
                             1 0 0 0 0 0 1 1 1 异或(生成多项式)
                             0 0 1 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 = CRC
                                   1 0 0 0 0 0 1 1 1 异或(生成多项式)
                                   0 1 0 0 1 0 1 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 = CRC
                                      1 0 0 0 0 0 1 1 1 异或(生成多项式)
                                      0 0 0 1 0 1 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 = CRC
                                              1 0 0 0 0 0 1 1 1 异或(生成多项式)
                                              0 0 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 = CRC
                                                    1 0 0 0 0 0 1 1 1 异或(生成多项式)
                                                    0 0 0 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 = CRC
                                                             1 0 0 0 0 0 1 1 1 异或(生成多项式)
                                                             0 0 0 0 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 = CRC
                                                                        1 0 0 0 0 0 1 1 1 异或(生成多项式)
                                                                        0 1 1 1 1 0 1 1 1 0 0 0 0 0 0 = CRC
                                                                           1 0 0 0 0 0 1 1 1 异或(生成多项式)
                                                                           0 1 1 1 0 1 0 0 1 0 0 0 0 0 = CRC
                                                                              1 0 0 0 0 0 1 1 1 异或(生成多项式)
                                                                              0 1 1 0 1 0 1 0 1 0 0 0 0 = CRC
                                                                                 1 0 0 0 0 0 1 1 1 异或(生成多项式)
                                                                                 0 1 0 1 0 1 1 0 1 0 0 0 = CRC
                                                                                    1 0 0 0 0 0 1 1 1 异或(生成多项式)
                                                                                     0 0 1 0 1 1 1 0 1 0 0 = CRC
                                                                                           1 0 0 0 0 0 1 1 1 异或(生成多项式)
                                                                                           0 0 1 1 1 0 0 1 1 = CRC (0x73)
返回列表