关于I2C通讯方式的问题
我有块芯片,通讯方式是I2C的,但是写的程序总是有问题,应答的时候都是高电平。check_ACK得到的都是0, 就是无应答http://cache.amobbs.com/bbs_upload782111/files_39/ourdev_640647TXJM19.JPG
逻辑分析仪抓出来的图形 (原文件名:1.JPG)
//**********************************************************
// Send Byte
//**********************************************************
void Send_Byte( unsigned char nByte )
{
unsigned char i;
for( i=0; i<8; i++ )
{
if( (nByte & BIT7)==BIT7 ) IC_DATA_OUT |= IC_DATA_BIT;
else IC_DATA_OUT &=~IC_DATA_BIT;
nByte <<= 1;
IC_CLK_OUT |= IC_CLK_BIT;
_NOP();
_NOP();
IC_CLK_OUT &=~IC_CLK_BIT;
//_NOP();
}
IC_CLK_OUT &=~IC_CLK_BIT;
}
/*******************************************************************************
* 函 数 名 : check_ACK
功 能:检查从机的应答操作
参 数:无
返回值 :从机是否有应答:1--有,0--无
*******************************************************************************/
unsigned char wait_ack(void)
{
uchar slaveack;
IC_DATA_OUT |=IC_DATA_BIT;
_NOP(); _NOP();
IC_CLK_OUT |=IC_CLK_BIT;
_NOP(); _NOP();
IC_DATA_DIR &=~IC_DATA_BIT;
_NOP(); _NOP();
slaveack = IC_DATA_IN & IC_DATA_BIT;; //读入SDA数值
IC_CLK_OUT &=~IC_CLK_BIT;
delay_Nus(1);
IC_DATA_DIR |= IC_DATA_BIT;
if(slaveack) return 0;
else return 1;
} 我也是这样的,你解决了吗 if you look at the i2c spec, what you should do for ack detection, after a write command, is to float sda to high, bring scl to high, and then read the sda. 楼上的意思是写命令之后要进行应答信号的检测 有很多现成程序吧
页:
[1]