奇偶校验算法(Parity Check Algorithm)是一种简单的错误检测方法,用于验证数据传输中是否发生了位错误。通过在数据中添加一个附加的奇偶位(即校验位),来实现错误的检测和纠正。
在奇偶校验算法中,假设每个字节由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长度时,可以采用此方法。
|