在奇偶校验算法中,假设每个字节由8个比特(位)组成。奇偶校验位的值取决于数据字节中的1的个数。如果数据字节中1的个数是偶数个,奇偶校验位被设置为0;如果1的个数是奇数个,奇偶校验位被设置为1。这样,在接收端,通过统计接收到的数据字节中1的个数,就可以检测出位错误。

原理比较简单,我们再来看看在MCU中如何实现?我们设计以下应用场景,使用偶校验来验证保存在内存中一个word长度的数值,其最高为偶校验位,剩余31bit为有效位为例。C代码如下:
/** * @brief: even check for uint32_t * * @param: * @return: 0= pass; 1= failed; * @note: */ int even_check(uint32_t dat) { uint8_t i; uint8_t cnt = 0; for (i = 0; i < 32; i++) { if ((dat & 0x01) == 0x01) { cnt++; } dat = dat >> 1; } return (cnt & 0x01); } void even_ck_gen(uint32_t *buf) { uint8_t i; uint8_t cnt = 0; uint32_t dat; *buf &= ~(0x80000000); dat = *buf; printf("dat = 0x%08X\r\n", dat); for (i = 0; i < 31; i++) { if ((dat & 0x01) == 0x01) { cnt++; printf("cnt = %d, dat= %08X\r\n", cnt, dat); } dat = dat >> 1; } if ((cnt & 0x01) == 0x01) { *buf |= 0x80000000; } }
在没有ECC这样外置校验位的情况下,通过bit32来代表奇偶校验位,虽然舍弃了一位,但可以实现数据的自校验,带来一定的可靠性。在数据量不需要32bit长度时,可以采用此方法。