注册 登录
电子工程世界-论坛 返回首页 EEWORLD首页 频道 EE大学堂 下载中心 Datasheet 专题
扬帆起航的个人空间 https://home.eeworld.com.cn/space-uid-433532.html [收藏] [复制] [分享] [RSS]
日志

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

已有 9045 次阅读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<<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语言水平之低下,让大家见笑了。


本文来自论坛,点击查看完整帖子内容。

评论 (0 个评论)

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 注册

热门文章