智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 4697|回复: 4
打印 上一主题 下一主题

[单片机] STM32软件模拟I2C程序中有问题?

[复制链接]

5

主题

19

帖子

0

精华

知名人物

Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15

积分
44740
威望
37147
贡献
7523
兑换币
84
注册时间
2014-2-27
在线时间
35 小时
毕业学校
华中科技大学
跳转到指定楼层
1#
发表于 2015-10-25 16:20:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我在用软件模拟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;
}


求帮助,这是哪问题呢
回复

使用道具 举报

5

主题

19

帖子

0

精华

知名人物

Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15

积分
44740
威望
37147
贡献
7523
兑换币
84
注册时间
2014-2-27
在线时间
35 小时
毕业学校
华中科技大学
推荐
 楼主| 发表于 2015-10-28 20:52:03 | 只看该作者
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


回复 支持 0 反对 1

使用道具 举报

5

主题

19

帖子

0

精华

知名人物

Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15

积分
44740
威望
37147
贡献
7523
兑换币
84
注册时间
2014-2-27
在线时间
35 小时
毕业学校
华中科技大学
3#
 楼主| 发表于 2015-10-25 17:39:30 | 只看该作者
这么有意思的问题怎么没有人回答呢????

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

而前面写入addr+w后,没出现这种问题。在从机响应拉低了sda后,我将scl设置低电平时,sda将被释放(处于高电平)。。。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关于我们|联系我们|小黑屋|智能车制作 ( 黑ICP备2022002344号

GMT+8, 2024-9-30 20:15 , Processed in 0.042942 second(s), 30 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表