[讨论] 最近调试INA226芯片,严重暴露了自己编程水平之低下。。。

扬帆起航   2016-1-1 18:01 楼主
最近调试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<&& 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语言水平之低下,让大家见笑了。


回复评论 (9)

记得清楚也建议加括号
training
点赞  2016-1-1 18:51
呵呵,程序是调出来的!细节的错误,只要是战战兢兢的态度,很快就能纠正!
在只有一把铁锤的人眼里,世界万物都是钉子!
点赞  2016-1-1 18:51
引用: 白丁 发表于 2016-1-1 18:51
记得清楚也建议加括号

恩恩,是的。以后全都加上
点赞  2016-1-3 12:57
引用: caojp2008 发表于 2016-1-1 18:51
呵呵,程序是调出来的!细节的错误,只要是战战兢兢的态度,很快就能纠正!

恩,确实是调出来。不过我还是得先重新看下书了,尽量减少这种低级错误!
点赞  2016-1-3 12:58
没关系,写的程序多了,出现的错误就会变少的。一步一步调试,找到出错的地方就好了。
点赞  2016-1-9 20:45
楼主能不能共享一下调通的程序
点赞  2016-7-5 17:23
这个很不错啦
点赞  2017-4-28 13:42

楼主可以分享一下调试完成的工程代码学习一下吗

点赞  2020-9-10 15:00

精度怎么控制的呢

点赞  2022-1-11 11:01
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复