我在用软件模拟I2C过程中,写入硬件写地址(address)和数据(data)都是正确的,能够得到waitask响应。在waitask响应后master将SCL电平拉低,SDA电平自动释放(高电平)。这些都正确。
但是当我写入硬件读地址(address+1)的时候,能得到waitask响应,但是响应后我master拉低SCL电平后,SDA电平还是被拉低,即使通过master软件拉高SDA的IO口都不能将之电平拉高。因此可知,写入硬件读地址(address+1)后,能得到正确的的响应,但是slave就是不释放SDA数据端口。这是怎么回事呢,哪里出了问题?
下面是一些代码:
//单字节读取*****************************************
unsigned char I2C_ReadByte(unsigned char REG_Address)
{
unsigned char REG_data;
if(!I2C_Start())return FALSE;
I2C_SendByte(SlaveAddress);
if(!I2C_WaitAck()){I2C_Stop(); return FALSE;}
I2C_SendByte((u8) REG_Address); //设置低起始地址
I2C_WaitAck();
I2C_Start();
I2C_SendByte(SlaveAddress+1); //就是这里发送读地址
I2C_WaitAck(); //这个waitack里面出问题,最后的scl拉低,slave不释放SDA电平
REG_data= I2C_ReceiveByte();
I2C_NoAck();
I2C_Stop();
//return TRUE;
return REG_data;
}
//这里就是waitack()
bool I2C_WaitAck(void) //返回为:=1有ACK,=0无ACK
{
SCL_L;
I2C_delay();
SDA_H;
I2C_delay();
SCL_H;
I2C_delay();
if(SDA_read)
{
SCL_L;
I2C_delay();
return FALSE;
}
SCL_L; //这里拉低SCL电平,但是slave不释放sda(一直是低电平)
I2C_delay();
return TRUE;
}
unsigned char I2C_ReceiveByte(void) //数据从高位到低位//
{
u8 i=8;
u8 ReceiveByte=0;
SDA_H; //slave一直拉低sda,在这master写入SDA高电平都不能将SDA电平拉高
I2C_delay();
while(i--)
{
ReceiveByte<<=1;
SCL_L;
I2C_delay();
SCL_H;
I2C_delay();
if(SDA_read)
{
ReceiveByte|=0x01;
}
}
SCL_L;
return ReceiveByte;
}
求帮助,这是哪问题呢
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
是响应了ack信号。是在scl从低电平到高电平的时候,从机将sda线拉低了,这里没问题。但是在从机拉低了sda电平后,我将scl再拉低,从机不释放sda线(还是低电平)。而且此时通过主机将设置sda高电平,sda电平还是低电平。
一周热门 更多>