打印
[STM32L1]

DHT12 i2c读取 死循环

[复制链接]
726|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
chenjunt|  楼主 | 2020-10-11 21:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
现在选用的STM32L52  去读取DHT12  通过I2C1  PB6 PB7 去读取,老是进入死循环,读取不了数据

使用特权

评论回复
沙发
huanghuac| | 2020-10-11 21:28 | 只看该作者

楼主程序可以公开吗?贴程序看下吧,这么说看不出什么原因

使用特权

评论回复
板凳
chenjunt|  楼主 | 2020-10-11 21:32 | 只看该作者

void I2C_IO_Init(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
        I2C_InitTypeDef I2C_InitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;

        RCC_AHBPeriphClockCmd( RCC_AHBPeriph_GPIOB, ENABLE);
        RCC_APB1PeriphClockCmd( RCC_APB1Periph_I2C1, ENABLE);
        
        GPIO_PinAFConfig(GPIOB, GPIO_PinSource7, GPIO_AF_I2C1);
  GPIO_PinAFConfig(GPIOB, GPIO_PinSource6, GPIO_AF_I2C1);
//        GPIOB->AFR[0] = 0x04;
//        GPIOB->AFR[0] = 0x04;
        
        
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
        GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_40MHz;               
        GPIO_Init( GPIOB, &GPIO_InitStructure);
        
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
  GPIO_Init(GPIOB, &GPIO_InitStructure);
        
        I2C_DeInit(I2C1);
        I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;//I2C_Mode_SMBusHost;//I2C_Mode_I2C;                                                //I2C¶¨Òå
        I2C_InitStructure.I2C_DutyCycle =  I2C_DutyCycle_2;
        I2C_InitStructure.I2C_OwnAddress1 = 0xa0;                                                //É豸×Ô¼ºµÄµØÖ· ----  ×÷Ϊ´ÓÉ豸ʱÓÐÓÃ
        I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
        I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
        I2C_InitStructure.I2C_ClockSpeed = 300000;
                I2C_Init(I2C1, &I2C_InitStructure);        
        I2C_Cmd(I2C1,ENABLE);
                                
        
        I2C_AcknowledgeConfig(I2C1, ENABLE);
}


//*********  ¶ÁÈ¡Ò»¸öÊý¾Ý  ***************
void I2C1_ReadByte( uchar ReadAddr, uchar *buf, uchar len)
{
        uchar i;
        
        I2C_AcknowledgeConfig( I2C1, ENABLE);                                                        //ʹÄÜÓ¦´ð  -----  Ô­À´Ã»ÓÐ
        while( I2C_GetFlagStatus( I2C1, I2C_FLAG_BUSY));        //µÈ´ýI2C²»Ã¦   wait i2c bus is not busy  µÈ´ý×ÜÏ߸´Î»
        
        I2C_GenerateSTART( I2C1, ENABLE);                                                                        //²úÉúÆðʼÐźŠ send start condition  ·¢ËÍÒ»¸ö¿ªÊ¼Î»
        while( !I2C_CheckEvent( I2C1, I2C_EVENT_MASTER_MODE_SELECT)) ;        //EV5  test on EV5 and clear it  µÈ´ýEV5

        I2C_Send7bitAddress( I2C1, ReadAddr, I2C_Direction_Transmitter);                //·¢Ë͵ØÖ·  send ADXL address for write ·¢ËÍÒ»¸öαдָÁî
        while( !I2C_CheckEvent( I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)) ;        //EV6  test on EV6 and clear it µÈ´ýEV6
        
        I2C_SendData( I2C1, 0);//ReadAddr);                //·¢ËͶÁµØÖ·   REG_HUMIDITY_HIGH
        //while( I2C_GetFlagStatus( I2C1, I2C_FLAG_BTF) == RESET) ;
        while( !I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED)) ;                //ÁíÍâÒ»ÖÖд·¨
        
        I2C_Send7bitAddress( I2C1, ReadAddr+1, I2C_Direction_Receiver);        //send ADXL address for read ·¢ËÍÒ»¸öαдָÁî
        while( I2C_GetFlagStatus(I2C1, I2C_FLAG_ADDR) == RESET) ;
        //while( !I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED)) ;        //ÁíÍâÒ»ÖÖд·¨
        
        for( i = 0 ; i < len; i++)
        {
                                while( !I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED)) ;
                                *buf = I2C_ReceiveData(I2C1);
                                buf++;                                
        }
        
        I2C_AcknowledgeConfig( I2C1, DISABLE);                //disable acknowledgement        
        I2C_GenerateSTOP( I2C1, ENABLE);                        //·¢ËÍֹͣλ
        I2C_AcknowledgeConfig(I2C1, ENABLE);
}


读取程序:
void ReadEnvirTempAndHump()
{
        GPIO_InitTypeDef GPIO_InitStructure;

        RCC_AHBPeriphClockCmd( RCC_AHBPeriph_GPIOB, ENABLE);
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_40MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
        GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
  GPIO_Init( GPIOB, &GPIO_InitStructure);
        
        SET_POWER();
        SET_NOINVASSENSOR();
        
        GPIO_SetBits( GPIOB, GPIO_Pin_6);
        Delay(10000);
        I2C_IO_Init();
        Delay(5000);
        
        I2C1_ReadByte( DHT12_I2C_ADDRESS, SendData, 5);

使用特权

评论回复
地板
chenjunt|  楼主 | 2020-10-11 21:38 | 只看该作者
一般都死在
I2C_Send7bitAddress( I2C1, ReadAddr, I2C_Direction_Transmitter);  
这句话下面。

使用特权

评论回复
5
xxrs| | 2020-10-11 21:41 | 只看该作者
用模拟i2c呀。

使用特权

评论回复
6
小明的同学| | 2020-10-11 21:43 | 只看该作者
这个芯片是I2C吗,不是单线协议吗

使用特权

评论回复
7
小明的同学| | 2020-10-11 21:44 | 只看该作者
搞错了,12确实是I2C,

使用特权

评论回复
8
chenjunt|  楼主 | 2020-10-11 21:46 | 只看该作者
我这上面挂了两个i2c器件,想着用模拟太烦了,所以想把这个调试通了

使用特权

评论回复
9
小明的同学| | 2020-10-11 21:49 | 只看该作者
没看出来问题。

使用特权

评论回复
10
chenjunt|  楼主 | 2020-10-11 21:49 | 只看该作者

我现在是  SCL  ---PB6 能看到波形图,  SDA---PB7 一直是低信号

使用特权

评论回复
11
chenjunt|  楼主 | 2020-10-11 21:55 | 只看该作者

I2C_SendData( I2C1, 0);//ReadAddr);         
while( !I2C_CheckEvent( I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED)) ;        

现在是到这一步就死机?????

使用特权

评论回复
12
zhanglli| | 2020-10-11 21:59 | 只看该作者
自己用普通的管脚模拟一下试试看

使用特权

评论回复
13
huanghuac| | 2020-10-11 22:03 | 只看该作者
用示波器看看 是不是严格的跟芯片要求相同

使用特权

评论回复
14
tian111| | 2020-10-11 22:08 | 只看该作者
估计是你时序有些许差距

使用特权

评论回复
15
pengf| | 2020-10-11 22:11 | 只看该作者
用示波器看看波形吧

使用特权

评论回复
16
llljh| | 2020-10-11 22:19 | 只看该作者
用模拟吧  如果你确认时序没有问题的话

使用特权

评论回复
17
yufe| | 2020-10-11 22:24 | 只看该作者
时序问题  微调一下试试看

使用特权

评论回复
18
chenjunt|  楼主 | 2020-10-11 22:28 | 只看该作者

嗯,那我按大家的说法挨个排查一下,谢谢哈

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

718

主题

7868

帖子

5

粉丝