基于C51的INA226 IIC数据通信中遇到的问题
时间:10-02
整理:3721RD
点击:
最近想用INA226做个电流电压测量的工具监视铅酸电池充放电状态,遇到点问题,情况是这样的
在主函数体中只是先运行
INA226_WriteReg(INA226_CONFIG,0x4127);
然后
tmp=INA226_ReadReg(INA226_BUS);
使用串口输出tmp变量时候一直显示输出为零,搞不清是什么情况,恳请各位老师帮帮忙指导一下,不胜感激
以下是INA226.c 文件代码:
#define INA226_W 0x80 #define INA226_R 0x81 #define INA226_CONFIG 0x00 #define INA226_SHUNT 0x01 #define INA226_BUS 0x02 #define INA226_POWEER 0x03 #define INA226_CURRENT 0x04 #define INA226_CAL 0x05 #define INA226_MAEN 0x06 #define INA226_AIERT 0x07 #define INA226_DIEID 0xFF sbit SCL=P0^0; sbit SDA=P0^1; void Delay1us(); void INA226_Start(); void INA226_Stop(); void INA226_GetACK(); void INA226_WriteByte(unsigned char tmp); void INA226_SendACK(); unsigned char INA226_ReadByte(); void INA226_SetPoint(unsigned char addr); void INA226_WriteReg(unsigned char addr,unsigned int dat); unsigned int INA226_ReadReg(unsigned char addr); void Delay1us() //@33.1776MHz { unsigned char i; _nop_(); _nop_(); _nop_(); i = 5; while (--i); } void INA226_Start(){ SDA=1; Delay1us(); SCL=1; Delay1us(); SDA=0; Delay1us(); } void INA226_Stop(){ Delay1us();Delay1us(); SCL=1; Delay1us(); SDA=0; Delay1us(); SDA=1; Delay1us(); } void INA226_GetACK(){ Delay1us(); SCL=0; SDA=1; Delay1us();Delay1us(); SCL=1; while(SDA==1); Delay1us(); SCL=0; } void INA226_WriteByte(unsigned char tmp){ unsigned char i; for(i=0;i<8;i++){ Delay1us(); SCL=0; SDA=(tmp<<i)&0x80; Delay1us();Delay1us(); SCL=1; } INA226_GetACK(); } void INA226_SendACK(){ Delay1us(); SCL=0; SDA=0; Delay1us();Delay1us(); SCL=1; Delay1us(); SCL=0; } unsigned char INA226_ReadByte(){ unsigned char i,tmp; SDA=1; for(i=0;i<8;i++){ Delay1us(); SCL=0; tmp<<=1; Delay1us();Delay1us(); SCL=1; if(SDA)tmp|=0x01; } INA226_SendACK(); } void INA226_SetPoint(unsigned char addr){ INA226_Start(); INA226_WriteByte(INA226_W); INA226_WriteByte(addr); } void INA226_WriteReg(unsigned char addr,unsigned int dat){ INA226_SetPoint(addr); INA226_WriteByte(dat>>8); INA226_WriteByte(dat&0x00ff); INA226_Stop(); } unsigned int INA226_ReadReg(unsigned char addr){ unsigned int tmp; INA226_SetPoint(addr); INA226_Stop(); INA226_Start(); INA226_WriteByte(INA226_R); tmp=INA226_ReadByte(); tmp<<=8; tmp|=INA226_ReadByte(); INA226_Stop(); return tmp; }
好好地看了一下你的程序, 从时序上看, 看不出问题来.
能否检查一下硬件, 或者用示波器看看通信波形有没有问题
可是我在发送字节后都会等待器件的ACK返回,在函数里
void INA226_GetACK(){ Delay1us(); SCL=0; SDA=1; Delay1us();Delay1us(); SCL=1; while(SDA==1); Delay1us(); SCL=0; }
如果没有ACK返回会进入死循环的啊,之前也有因为时序问题进入死循环是没有输出的,但是问题来了,器件有返回,而且输出全零,说明通信应该没问题,读配置寄存器的值输出也是全零,就不知道为什么了
你得先看一下从器件是否有返回数据,使用示波器看一下,看看有没有信号传到单片机SDA线上,这个确定了再走下一步。
根据你的GetACK看是有 ACK信号的,你再示波器看一下ACK后是否真的全是0