关于stm32驱动hx711的问题

2019-07-20 22:37发布

想写一个stm32驱动hx711模块的程序
初始化:

#define DT PEout(0)
#define SCK PEout(1)


void HX711_Init(void)        //???HX711??
{
        GPIO_InitTypeDef GPIO_InitStructure;
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE);

        GPIO_InitStructure.GPIO_Pin =GPIO_Pin_1;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //CLK?????¨??????????
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOE,&GPIO_InitStructure);

        GPIO_InitStructure.GPIO_Pin =GPIO_Pin_0;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//DATA?????¨??????????
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOE,&GPIO_InitStructure);       
}

读取数据值:
u32 DHT11_Read(void)
{
        u32 val = 0;
        u8 i = 0;
        DT=1;
        SCK=0;
        while(DT);   
        delay_us(5);
        for(i=0;i<24;i++)
        {
                SCK=1;
                val=val<<1;
                delay_us(5);  
                SCK=0;
                if(DT)  val++;
                delay_us(5);
        }
        SCK=1;
        val = val^0x800000;
        delay_us(5);
        SCK=0;
        delay_us(5);

        return val;
}


主函数:
while(1)
{
  printf("wendusi%f ",DHT11_Read());
  delay_ms(500);

}
一共25个脉冲,用A通道采集,VCC用的是3.3v,
结果一直没有打印出数据,好像是DT一直是高电平,陷在while循环那里。这是怎么回事
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
6条回答
yy21910115
2019-07-21 03:39
这是我移植的51的  你参考下, 我验证过是可以的
#include <hx711.h>
#include<delay.h>
u8 AMP;
u8 OFFSET;
u8 COEFFICIENT;

void HX711_Init(int amp,double co)
{
       
        RCC->APB2ENR|=1<<3;  //PORTB
        GPIOB->CRL&=0xFFFFFF00;
        GPIOB->CRL|=0x00000083; // PB0=SCK 输出  PB1=DOUT输入
        //GPIOB->ODR|=0<<0;
        //GPIOB->ODR|=1<<1;
        set_amp(amp);
        SCK=0;
        HX711_read();
       
       
}

void set_amp(int amp)
{
                switch (amp) {
        case 32: AMP = 2; break;
        case 64: AMP = 3; break;
        case 128: AMP = 1; break;
                }
}


long HX711_read()
{
        int i;
        long val=0;
        SCK=0;
       
       
        while(DOUT==0);
        for(i=0;i<24;i++)
        {
                pulse();
                val<<=1;
                if(DOUT==1)val++;
               
        }
        for(i=0;i<AMP;i++)
        {
                pulse();
        }
        return val& (1L << 23) ? val | ((-1L) << 24) : val;

       
}

void pulse()
{
        SCK=1;
        delay_us(3);
        SCK=0;
        delay_us(3);
}

double bias_read()
{
        return (HX711_read()-OFFSET)*COEFFICIENT;
       
}

一周热门 更多>