智能车制作

标题: STM32软件模拟I2C程序中有问题? [打印本页]

作者: huster_tjs    时间: 2015-10-25 16:20
标题: STM32软件模拟I2C程序中有问题?
我在用软件模拟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;
}


求帮助,这是哪问题呢

作者: huster_tjs    时间: 2015-10-25 17:39
这么有意思的问题怎么没有人回答呢????

补充点:
也就是说,在从写入addr+R后,从机将sda线拉低响应了,但是将scl设置为低电平时,从机不释放sda线(还是低电平)。。。。

而前面写入addr+w后,没出现这种问题。在从机响应拉低了sda后,我将scl设置低电平时,sda将被释放(处于高电平)。。。
作者: huster_tjs    时间: 2015-10-28 20:52
la9998372 发表于 2015-10-25 22:03
你GPIO口怎么配置的呀?

#define SCL_H         GPIOB->BSRR = GPIO_Pin_6
#define SCL_L         GPIOB->BRR  = GPIO_Pin_6

#define SDA_H         GPIOB->BSRR = GPIO_Pin_7
#define SDA_L         GPIOB->BRR  = GPIO_Pin_7

#define SCL_read      GPIOB->IDR  & GPIO_Pin_6
#define SDA_read      GPIOB->IDR  & GPIO_Pin_7







欢迎光临 智能车制作 (http://dns.znczz.com/) Powered by Discuz! X3.2