STM32软件模拟I2C程序中有问题?

2019-07-14 21:39发布

我在用软件模拟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;
}


求帮助,这是哪问题呢
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
1条回答
陶醉了的猫
2019-07-15 10:54
茶缸子 发表于 2015-10-26 13:35
你的意思是你写了addr+R/W以后,在紧随其后的应答位上,从机拉低了SDA线,发出了ACK信号是么?如果是这样描述的,那么从器件就是应该发ACK,因为这帧数据是Master给Slave的,该Slave应答,详见I2C协议,如果不是这样描述的,请楼主继续描述问题。 ...

是响应了ack信号。是在scl从低电平到高电平的时候,从机将sda线拉低了,这里没问题。但是在从机拉低了sda电平后,我将scl再拉低,从机不释放sda线(还是低电平)。而且此时通过主机将设置sda高电平,sda电平还是低电平。

一周热门 更多>