Even Check 奇偶校验
在芯片的使用中,有的芯片存在数据的最后一位奇偶校验如图1所示。这个东西到底是怎么一回事?
图1:Parity bit check
奇偶校验添加到数据byte中用于错误检测,他用于检测数据的完整性,奇偶校验位的值会被分配成0或者1,具体要看你用的是奇校验,还是偶校验。
奇校验:消息中1的位数总是奇数
偶校验:消息中1的位数总是偶数
表1: 数据流表
奇Odd |
1 |
1 |
0 |
0 |
1 |
1 |
1 |
0 |
偶Even |
1 |
1 |
0 |
0 |
1 |
1 |
1 |
1 |
其中奇数校验中一共5个1,所以最后一位是0。
其中偶数校验中前面一共5个1,所以最后一位补1完成偶数校验。
那么在C语言中如何完成偶数校验呢?参考代码如下:
、、、
// 功能:奇偶校验
// 参数1:指针大小 Size
// 参数2:数组指针
// 返回值 0X01 or 0X00 用返回值或上指针最后一位
uint8_t Point_Even_check(uint8_t Size,uint8_t *Data)
{
uint8_t i,j,temp,Count=0,ODD=0;
//遍例指针Size
for(i=0;i<Size;i++)
{
temp=*(Data+i);
//判断指针最大值
for(j=0;j<8;j++)
{
//计算1出现的次数
if((temp&0x01)==0x01)
{
Count+=1;
}
//让Temp右移
temp>>=1;
}
}
//如果Count是偶数 Even Check 或上0X01
if(((Count%2)==1)||(Count==1))
{
Even=0X01;
return Even;
}
//如果Count是奇数 Even Check 返回默认值
else
{
return Even;
}
}
、、、
如果要把数据通过SPI发送,SPI的驱动程序如下:
、、、
// XXXX 读寄存器
void XXXX_Read(uint8_t addr,uint8_t *Data,uint8_t *Rdata)
{
//奇偶校验缓存
uint8_t EvenTemp;
//将指针第一位设置为寄存器地址
*Data=addr;
//获取奇偶校验结果
EvenTemp=Point_Even_check(4,Data);
//处理奇偶校验结果
*(Data+3)|=EvenTemp;
//写入并读取寄存器
Lpspi_Read(4,Data,Rdata);
Lpspi_Stop();
}
、、、
写入的数组的参数如下:
Data[4]={0X03,0x11,0x22,0x16}
Data数组换算成二进制的结果
0011 | 0001 | 0001 | 0010 | 0010 | 0001 | 0110
使用Even Check函数对数据进行补偶操作,测试的波形如下图2所示
图2:补偶参数
好了今天就先聊到这里了~在对自己做个简单的自我介绍
无论如何,我都热爱电路,热爱电路架构的探索与设计!加油UU们!
笔者简介:许同,8.5年工作经验,电路系统架构专家,在电路领域有14年的积累,精通应用电路系统架构设计,有10项以上电路架构专利,掌握多项电路设计技能,电路Spice仿真,C语言,Python,Verilog等。
私信我加电路群
文章来源:公众号xuyuntong
参考文档
What is a Parity Bit?
C Prime Plus the sixth edition