最近调试INA226芯片,由于使用的是STC12C系列的51单片机做主控,所以需要用IO口模拟IC总线与INA226通信,但是调试期间暴露出了自己C语言基础之差。
遇到的问题一:写入I2C地址后一直没有应答信号。字节写入的代码如下
/************************************************************
*
* I2C 字节写
*
/************************************************************/
void i2c_byte_write(unsigned char dat){
unsigned char i =0;
for( i = 0; i < 8; i++ ){
if((dat<<i)
&& 0x80){
I2C_SDA=1;
}else{
I2C_SDA=0;
}
Delay1us(1);
I2C_SCL = 1;
Delay1us(5);
I2C_SCL = 0;
}
}
原因: 如上代码中,&&错误的当成了按位与运算。导致写入的数据错误,所以没有应答信号。
问题二: 读寄存器,一直返回0,自己读的代码如下。
/************************************************************
*
* I2C 字节读
*
************************************************************/
unsigned char i2c_byte_read(void){
unsigned char i =0;
unsigned char dat=0;
I2C_SCL = 0;
Delay1us(3);
I2C_SDA = 1;
for( i = 0; i < 8; i++ ){
Delay1us(3);
I2C_SCL = 1;
Delay1us(2);
if(I2C_SDA == 1 ){
dat =
dat<<1 + 1;
}else{
dat =
dat<<1 + 0;
}
Delay1us(3);
I2C_SCL = 0;
Delay1us(3);
}
return dat;
}
原因:如上红色部分代码,正确的运算式, dat左移一位,然后根据读到的数据线电平决定加0还是加1,但是如上红色部分代码错误,因为<<的优先级低于+,所以上边的代码是相当于 dat= dat<<(1+1); 下面的代码相当于dat=dat<<1,所以dat的结果一直是0。正确的写法应该是dat=(dat<<1)+1;
哎,通过调试INA226芯片,充分的暴露出鄙人C语言水平之低下,让大家见笑了。
本文来自论坛,点击查看完整帖子内容。