OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6202|回复: 17

纯新求助,stm32f051模拟i2c数据读取一直为0

[复制链接]

3

主题

15

帖子

0

精华

新手上路

积分
31
金钱
31
注册时间
2016-5-21
在线时间
3 小时
发表于 2016-5-22 10:46:35 | 显示全部楼层 |阅读模式
1金钱
如题,用的是f051,读取GY-30光强传感器的数据,硬件i2c不会用,参考了http://www.openedv.com/thread-31163-2-1.html这个帖子里大神的模拟I2C程序,应答正常,可是SDA线的数据读出来一直是0,请问各位大神,这会是什么原因呢?模块换了一个也是一样,应该不是模块的问题。

最佳答案

查看完整内容[请看2#楼]

那只能先从外围电路排查了,I2C线上拉电阻了么?新手这个容易忽略. 再看示波器是不是发送正确的波形,很多人都栽在波形上. 最后一步再看是否发送的是正确的命令数据过去. 建议你去百度文科看看I2C协议要点和本模块的I2C协议配合食用. 没逻辑分析仪就是这样啊,很麻烦. 其实这东西也不贵.一双球鞋钱. 搞电子,装备都是慢慢攒的.
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

头像被屏蔽

52

主题

440

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1237
金钱
1237
注册时间
2013-1-9
在线时间
151 小时
发表于 2016-5-22 10:46:36 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

3

主题

15

帖子

0

精华

新手上路

积分
31
金钱
31
注册时间
2016-5-21
在线时间
3 小时
 楼主| 发表于 2016-5-22 10:47:54 | 显示全部楼层
这是I2C.c
//3õê¼»ˉIIC
void i2c_Port_Init(void)
{                                             
        GPIO_InitTypeDef GPIO_InitStructure;
        RCC_AHBPeriphClockCmd( RCC_AHBPeriph_GPIOA, ENABLE);
          
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT ;  
        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOA, &GPIO_InitStructure);

        GPIO_SetBits(GPIOA,GPIO_Pin_8);
        GPIO_SetBits(GPIOA,GPIO_Pin_9);

}
void SDA_OUT(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
  
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
  GPIO_Init(GPIOA,&GPIO_InitStructure);
}
void SDA_IN(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
  
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
  GPIO_Init(GPIOA,&GPIO_InitStructure);
}
//2úéúIICÆeê¼DÅoÅ
void I2C_Start(void)
{
        SDA_OUT();     //sdaÏßêä3ö
        GPIO_SetBits(GPIOA,GPIO_Pin_9);                    
        GPIO_SetBits(GPIOA,GPIO_Pin_8);
        delay_us(4);
        GPIO_ResetBits(GPIOA,GPIO_Pin_9);//START:when CLK is high,DATA change form high to low
        delay_us(4);
        GPIO_ResetBits(GPIOA,GPIO_Pin_8);//ÇˉסI2C×üÏߣ¬×¼±¸·¢Ëí»ò½óêÕêy¾Y
       
}          
//2úéúIICí£Ö1DÅoÅ
void I2C_Stop(void)
{
        SDA_OUT();//sdaÏßêä3ö
        GPIO_ResetBits(GPIOA,GPIO_Pin_8);
        GPIO_ResetBits(GPIOA,GPIO_Pin_9);//STOP:when CLK is high DATA change form low to high
        delay_us(4);
        GPIO_SetBits(GPIOA,GPIO_Pin_8);
        GPIO_SetBits(GPIOA,GPIO_Pin_9);//·¢ËíI2C×üÏß½áêøDÅoÅ
        delay_us(4);                                                                  
}
//μè′yó|′eDÅoÅμ½à′
//·μ»ØÖμ£o1£¬½óêÕó|′eê§°ü
//        0£¬½óêÕó|′e3é1|
unsigned int I2C_Wait_Ack(void)
{
        uint8_t ucErrTime=0;
//        SDA_IN();      //SDAéèÖÃÎaêäèë  
        GPIO_SetBits(GPIOA,GPIO_Pin_9);
        delay_us(4);          
        GPIO_SetBits(GPIOA,GPIO_Pin_8);
        delay_us(4);
        //
        SDA_IN();      //SDAéèÖÃÎaêäèë       
        while(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_9))
        {
                ucErrTime++;
                if(ucErrTime>250)
                {
                        I2C_Stop();
                        return 1;
                }
        }
        GPIO_ResetBits(GPIOA,GPIO_Pin_8);//ê±Öóêä3ö0           
        return 0;  
}
//2úéúACKó|′e
void I2C_Ack(void)
{
        GPIO_ResetBits(GPIOA,GPIO_Pin_8);
        SDA_OUT();
        GPIO_ResetBits(GPIOA,GPIO_Pin_9);
        delay_us(2);
        GPIO_SetBits(GPIOA,GPIO_Pin_8);
        delay_us(2);
        GPIO_ResetBits(GPIOA,GPIO_Pin_8);
}
//2»2úéúACKó|′e                    
void I2C_NAck(void)
{
        GPIO_ResetBits(GPIOA,GPIO_Pin_8);
        SDA_OUT();
        GPIO_SetBits(GPIOA,GPIO_Pin_9);
        delay_us(2);
        GPIO_SetBits(GPIOA,GPIO_Pin_8);
        delay_us(2);
        GPIO_ResetBits(GPIOA,GPIO_Pin_8);
}                                                                              
//IIC·¢Ëíò»¸ö×Ö½ú
//·μ»Ø′ó»úóDÎTó|′e
//1£¬óDó|′e
//0£¬ÎTó|′e                          
void I2C_Send_Byte(unsigned int txd)
{                        
    uint8_t t;   
                SDA_OUT();             
    GPIO_ResetBits(GPIOA,GPIO_Pin_8);//à-μíê±Öó¿aê¼êy¾Y′«êä
    for(t=0;t<8;t++)
    {              
      if(((txd&0x80)>>7)==1)
                                GPIO_SetBits(GPIOA,GPIO_Pin_9);
                        else
                                GPIO_ResetBits(GPIOA,GPIO_Pin_9);
      txd<<=1;           
                        delay_us(4);   //&#182;&#212;TEA5767&#213;aèy&#184;&#246;&#209;óê±&#182;&#188;ê&#199;±&#216;D&#235;μ&#196;
                        GPIO_SetBits(GPIOA,GPIO_Pin_8);
                        delay_us(4);
                        GPIO_ResetBits(GPIOA,GPIO_Pin_8);       
                        delay_us(4);
    }         
}             
//&#182;á1&#184;&#246;×&#214;&#189;ú£&#172;ack=1ê±£&#172;·¢&#203;íACK£&#172;ack=0£&#172;·¢&#203;ínACK   
unsigned int I2C_Read_Byte(unsigned char ack)
{
        unsigned char i,receive=0;
        SDA_IN();//SDAéè&#214;&#195;&#206;aê&#228;è&#235;
    for(i=0;i<8;i++ )
                {
      GPIO_ResetBits(GPIOA,GPIO_Pin_8);
      delay_us(10);
                        GPIO_SetBits(GPIOA,GPIO_Pin_8);
      receive<<=1;
      if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_9))
                        receive++;   
                        delay_us(10);
    }                                         
    if (!ack)
        I2C_NAck();//·¢&#203;ínACK
    else
        I2C_Ack(); //·¢&#203;íACK   
    return receive;
}
回复

使用道具 举报

3

主题

15

帖子

0

精华

新手上路

积分
31
金钱
31
注册时间
2016-5-21
在线时间
3 小时
 楼主| 发表于 2016-5-22 10:48:31 | 显示全部楼层
这是BH1750.c
float result_lx=0;
uint8_t BUF[2];
unsigned int  result=0;

//3&#245;ê&#188;&#187;ˉ
void Init_BH1750(void)
{
        i2c_Port_Init();
}

void Cmd_Write_BH1750(unsigned int cmd)
{
    I2C_Start();                  //&#198;eê&#188;D&#197;o&#197;
    I2C_Send_Byte(BH1750_Addr+0);   //·¢&#203;íéè±&#184;μ&#216;&#214;·+D′D&#197;o&#197;
        while(I2C_Wait_Ack());
    I2C_Send_Byte(cmd);    //&#196;ú2&#191;&#188;&#196;′&#230;&#198;÷μ&#216;&#214;·
        while(I2C_Wait_Ack());
    //BH1750_SendByte(REG_data);       //&#196;ú2&#191;&#188;&#196;′&#230;&#198;÷êy&#190;Y£&#172;
    I2C_Stop();                   //·¢&#203;íí£&#214;1D&#197;o&#197;
        delay_nms(5);
}
void Start_BH1750(void)
{
        Cmd_Write_BH1750(BH1750_ON);         //power on
        Cmd_Write_BH1750(BH1750_RSET);        //clear
        Cmd_Write_BH1750(BH1750_ONE);  //ò&#187;′&#206;H·&#214;±&#230;&#194;ê&#196;£ê&#189;£&#172;&#214;áéù120ms£&#172;&#214;&#174;oó×&#212;&#182;ˉ&#182;&#207;μ&#231;&#196;£ê&#189;  
}
void Read_BH1750(void)
{          
    I2C_Start();                          //&#198;eê&#188;D&#197;o&#197;
    I2C_Send_Byte(BH1750_Addr+1);         //·¢&#203;íéè±&#184;μ&#216;&#214;·+&#182;áD&#197;o&#197;
                while(I2C_Wait_Ack());
                BUF[0]=I2C_Read_Byte(1);  //·¢&#203;íACK
                BUF[1]=I2C_Read_Byte(0);  //·¢&#203;íNACK

    I2C_Stop();                          //í£&#214;1D&#197;o&#197;
    delay_nms(5);
}
void Convert_BH1750(void)
{
       
        result=BUF[0];
        result=(result<<8)+BUF[1];  //o&#207;3éêy&#190;Y£&#172;&#188;′1a&#213;&#213;êy&#190;Y
       
        result_lx=(float)result/1.2;

}
回复

使用道具 举报

3

主题

15

帖子

0

精华

新手上路

积分
31
金钱
31
注册时间
2016-5-21
在线时间
3 小时
 楼主| 发表于 2016-5-22 10:57:12 | 显示全部楼层
没人理我吗
回复

使用道具 举报

3

主题

15

帖子

0

精华

新手上路

积分
31
金钱
31
注册时间
2016-5-21
在线时间
3 小时
 楼主| 发表于 2016-5-22 11:36:07 | 显示全部楼层
别这样啊,大神们,真心求教啊,比较急的
回复

使用道具 举报

3

主题

15

帖子

0

精华

新手上路

积分
31
金钱
31
注册时间
2016-5-21
在线时间
3 小时
 楼主| 发表于 2016-5-22 14:36:33 | 显示全部楼层
要哭了,打完球回来还没人回
回复

使用道具 举报

头像被屏蔽

52

主题

440

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1237
金钱
1237
注册时间
2013-1-9
在线时间
151 小时
发表于 2016-5-22 18:54:52 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

3

主题

15

帖子

0

精华

新手上路

积分
31
金钱
31
注册时间
2016-5-21
在线时间
3 小时
 楼主| 发表于 2016-5-22 19:29:20 | 显示全部楼层
hexboot 发表于 2016-5-22 18:54
有时间打球,没空搞IIC....IIC注意时序.自己弄个逻辑分析仪插上面分析写的时序对不对.

我搞这个已经好几天了,打会球放松一下。。普通大学生没这设备,不好搞啊,程序是根据论坛里的一位大神的程序改得,时序应该不会有问题吧?请问大神还有可能是什么原因啊?
回复

使用道具 举报

3

主题

15

帖子

0

精华

新手上路

积分
31
金钱
31
注册时间
2016-5-21
在线时间
3 小时
 楼主| 发表于 2016-5-22 20:16:52 | 显示全部楼层
hexboot 发表于 2016-5-22 20:05
那只能先从外围电路排查了,I2C线上拉电阻了么?新手这个容易忽略.
再看示波器是不是发送正确的波形,很多 ...

板子是f051的开发板,应该是有上拉电阻的吧?还有一个问题,模拟I2C中的GPIO设置该怎样设置呢?初始化应该设置为推挽输出吗?SDA_IN应该设置为Mode_IN,PuPd_NOPULL是吗?这算是浮空输入了吗?麻烦大神了
回复

使用道具 举报

头像被屏蔽

52

主题

440

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1237
金钱
1237
注册时间
2013-1-9
在线时间
151 小时
发表于 2016-5-22 20:36:14 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

3

主题

15

帖子

0

精华

新手上路

积分
31
金钱
31
注册时间
2016-5-21
在线时间
3 小时
 楼主| 发表于 2016-5-22 20:43:36 | 显示全部楼层
hexboot 发表于 2016-5-22 20:36
SCL是推挽输出模式 ,SDA 要分 输出时候 是推挽,输入时候要浮空输入.
这个要看你什么时候用什么模式了.没记 ...

嗯嗯,f051不像f103可以设置IN_Floating,它只有UP,DOWN和NOPULL,请问NOPULL就算是浮空输入了吗?
回复

使用道具 举报

头像被屏蔽

52

主题

440

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1237
金钱
1237
注册时间
2013-1-9
在线时间
151 小时
发表于 2016-5-22 20:49:20 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

3

主题

15

帖子

0

精华

新手上路

积分
31
金钱
31
注册时间
2016-5-21
在线时间
3 小时
 楼主| 发表于 2016-5-22 20:51:44 | 显示全部楼层
hexboot 发表于 2016-5-22 20:49
F0没玩过,不晓得了.

好吧,麻烦大神了
回复

使用道具 举报

7

主题

76

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
249
金钱
249
注册时间
2016-4-11
在线时间
55 小时
发表于 2016-12-19 17:33:12 | 显示全部楼层
我也是这个问题,只有FF  或00  无奈!!  调试好几天了,还是读不到数据     快郁闷死我了,大神求助  
回复

使用道具 举报

xiaoyi 该用户已被删除
发表于 2017-4-19 15:26:36 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

0

主题

2

帖子

0

精华

新手上路

积分
20
金钱
20
注册时间
2017-4-18
在线时间
2 小时
发表于 2017-4-25 16:02:43 | 显示全部楼层
你们解决了没,我也是这个问题数据一直为FFFF,我的用的是stm32f030和gy-45,i2c波形图用示波器看了波形没问题,就是读取到值一直为F
回复

使用道具 举报

1

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
118
金钱
118
注册时间
2017-2-9
在线时间
27 小时
发表于 2017-4-25 16:57:26 | 显示全部楼层
同样是建议用逻辑分析仪去分析波形,你会很快发现问题的
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-8-21 20:58

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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