[两个普通IO读取HX711数据的函数-主芯片是STM32F407]
以下是.h文件中的内容:
#ifndef __hx711_h
#define __hx711_h
#define HX711CH1_DIO_GROUP GPIOA
#define HX711CH1_CLK_GROUP GPIOA
#define HX711CH1_DIO_PIN GPIO_Pin_1
#define HX711CH1_CLK_PIN GPIO_Pin_5
#define HX711CH1_SCK_high GPIO_SetBits( HX711CH1_CLK_GROUP,HX711CH1_CLK_PIN)
#define HX711CH1_SCK_low GPIO_ResetBits(HX711CH1_CLK_GROUP,HX711CH1_CLK_PIN)
#define HX711CH1_DIO_READ GPIO_ReadInputDataBit(HX711CH1_DIO_GROUP,HX711CH1_DIO_PIN)
void hx711_Init(void);
unsigned long HX711_CH1_read(void);
#endif
以下是.c文件中的内容:
#include “hx711.h”
#include “includes.h”
void hx711_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOC, ENABLE);
/CH1/
GPIO_InitStructure.GPIO_Pin = HX711CH1_CLK_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_Init(HX711CH1_CLK_GROUP, &GPIO_InitStructure);
GPIO_SetBits(HX711CH1_CLK_GROUP,HX711CH1_CLK_PIN);
GPIO_InitStructure.GPIO_Pin = HX711CH1_DIO_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;//输入
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(HX711CH1_DIO_GROUP, &GPIO_InitStructure);
}
unsigned long HX711_CH1_read(void)
{
unsigned int val=0;
HX711CH1_SCK_low; //先设置为低电平
while(HX711CH1_DIO_READ);
delay_us(1);
while(HX711CH1_DIO_READ); //再次判断hx711是否准备好
for(int i=0;i<24;i++)
{
HX711CH1_SCK_high;
delay_us(1);
HX711CH1_SCK_low;
val=val<<1;
if(HX711CH1_DIO_READ)
val++;
delay_us(1);
}
//选择增益,第25个时钟。增益为128,通道1 只是发送第25个时钟。增益128对应25个时钟,详见手册
HX711CH1_SCK_high;
delay_us(1);
val=val^0x800000; //转换数据?? 应该是数据最高位为1的时候,默认为负数
HX711CH1_SCK_low;
delay_us(1);
// printf(“HX711_CH1_val=%d\n”,val);
return val;
}
static unsigned long hx711data_toHex(unsigned long val)
{
uint8_t data=0;
data=val>>24;
data=(val<<8)>>24;
data=(val<<16)>>24;
data=(val<<24)>>24;
return 0;
}