STM32F103C8T6与HX711的通讯方式
时间: 2023-07-29 18:05:55 浏览: 110
STM32F103C8T6 HAL库 , 串口1 、串口3、通过DMA通讯
STM32F103C8T6与HX711的通讯方式有两种,分别是模拟方式和数字方式。
1. 模拟方式
HX711通过模拟方式向STM32F103C8T6输出数据。具体通讯步骤如下:
(1) 将HX711的PD_SCK引脚拉低,等待一段时间,使HX711进入待机状态。
(2) 将HX711的PD_SCK引脚拉高,等待一段时间,使HX711进入工作状态。
(3) 读取HX711的DOUT引脚的电平,获取数据。
(4) 重复上述步骤,直到获取所需数据。
具体代码如下:
```C
//GPIO口初始化
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure);
//读取数据
int32_t HX711_ReadData()
{
uint32_t i;
uint32_t data = 0;
GPIO_ResetBits(GPIOA,GPIO_Pin_4);
while(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_6));
for(i = 0; i < 24; i++)
{
GPIO_SetBits(GPIOA,GPIO_Pin_5);
data = data << 1;
if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_6))
{
data++;
}
GPIO_ResetBits(GPIOA,GPIO_Pin_5);
}
for(i = 0; i < 1; i++)
{
GPIO_SetBits(GPIOA,GPIO_Pin_5);
GPIO_ResetBits(GPIOA,GPIO_Pin_5);
}
GPIO_SetBits(GPIOA,GPIO_Pin_4);
return (int32_t)data;
}
```
2. 数字方式
HX711通过数字方式向STM32F103C8T6输出数据。具体通讯步骤如下:
(1) 将HX711的PD_SCK引脚拉低,等待一段时间,使HX711进入待机状态。
(2) 将HX711的DOUT引脚连接到STM32F103C8T6的一个GPIO口,将该口配置为输入模式。
(3) 向HX711发送24个时钟脉冲,每个时钟脉冲之间等待一段时间,使得HX711完成数据转换。
(4) 读取GPIO口的电平,获取数据。
(5) 将HX711的PD_SCK引脚拉高,等待一段时间,使HX711进入工作状态。
(6) 重复上述步骤,直到获取所需数据。
具体代码如下:
```C
//GPIO口初始化
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure);
//读取数据
int32_t HX711_ReadData()
{
uint32_t i;
uint32_t data = 0;
GPIO_ResetBits(GPIOA,GPIO_Pin_4);
while(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_6));
for(i = 0; i < 24; i++)
{
GPIO_SetBits(GPIOA,GPIO_Pin_5);
delay_us(1);
data = data << 1;
if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_6))
{
data++;
}
GPIO_ResetBits(GPIOA,GPIO_Pin_5);
delay_us(1);
}
GPIO_SetBits(GPIOA,GPIO_Pin_4);
delay_us(1);
return (int32_t)data;
}
```
以上两种通讯方式都可以实现HX711与STM32F103C8T6之间的数据交互。选择哪一种方式,需要根据实际情况来决定。如果使用模拟方式,可以减少GPIO口的使用,但需要注意时序的问题;如果使用数字方式,可以更加灵活控制时序,但需要使用更多的GPIO口。
阅读全文