1.c语言获取pmbus pec值方法
#include <stdio.h>
#include <string.h>
unsigned char _psu_crc8(unsigned char initial,unsigned char *data, int size)
{
unsigned char crc = initial;
unsigned char poly = 0x07;
int bit;
while (size--)
{
crc ^= *data++;
for (bit = 0; bit < 8; bit++)
{
if (crc & 0x80)
{
crc = (crc << 1) ^ poly;
}
else
{
crc <<= 1;
}
}
}
return crc;
}
unsigned char psu_check_frame(unsigned char slave_addr,unsigned char reg,
unsigned char rw_flag,unsigned char *data,
unsigned int len)
{
unsigned char crc8_val = 0;
#define CRC8_READ 0
#define CRC8_WRITE 1
unsigned char tmp[3];
if(rw_flag == CRC8_READ){
tmp[0] = (slave_addr<<1);
tmp[1] = reg;
tmp[2] = ((slave_addr<<1) | 1);
crc8_val = _psu_crc8(0,tmp,3);
}
else{
tmp[0] = (slave_addr<<1);
crc8_val = _psu_crc8(0,tmp,1);
}
crc8_val = _psu_crc8(crc8_val,data,len);
return crc8_val;
}
int main()
{
unsigned char WR_BUF[64];
unsigned char WR_Count;
unsigned char SlaveAddr = (0xb0 >> 1);
unsigned char registerval = 0x4f;
WR_Count = 4;
WR_BUF[0] = registerval; //register
WR_BUF[1] = 0x74;
WR_BUF[2] = 0x00;
WR_BUF[3] = psu_check_frame(SlaveAddr,registerval,1,WR_BUF,WR_Count-1);
printf("WR_BUF[3]:0x%0x\r\n",WR_BUF[3]);
return 0;
}
以上代码片段中,WR_BUF[1]
与WR_BUF[2]
是需要向寄存器写的数据值。WR_BUF[3]
也就是最后的crc8(pec)结果。