Stm32F103 Hal库硬件iic 访问AM2320温湿度传感器

news/2024/11/24 8:30:03/

Stm32F103 Hal库硬件iic 访问AM2320温湿度传感器

管脚配置 PB6 PB7
之前用库函数,一直读不到,换hal库后正常了,因为要在android板上调试,但是板卡没来,只好用stm32 先调试下。
很简单,先初始化i2C1
i2c.c

I2C_HandleTypeDef hi2c1;/* I2C2 init function */
void MX_I2C1_Init(void)
{hi2c1.Instance = I2C1;hi2c1.Init.ClockSpeed = 100000;hi2c1.Init.DutyCycle = I2C_DUTYCYCLE_2;hi2c1.Init.OwnAddress1 = 0;hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;hi2c1.Init.OwnAddress2 = 0;hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;if (HAL_I2C_Init(&hi2c1) != HAL_OK){//_Error_Handler(__FILE__, __LINE__);}
}void HAL_I2C_MspInit(I2C_HandleTypeDef* i2cHandle)
{GPIO_InitTypeDef GPIO_InitStruct;if(i2cHandle->Instance==I2C1){/* USER CODE BEGIN I2C2_MspInit 0 */__HAL_RCC_I2C1_CLK_ENABLE(); //默认情况下这句时钟初始化代码放在了GPIO初始化之后,需要调整到这里,即GPIO初始化前/* USER CODE END I2C2_MspInit 0 */__HAL_RCC_GPIOB_CLK_ENABLE();/**I2C2 GPIO Configuration    PB6     ------> I2C2_SCLPB7     ------> I2C2_SDA */GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7;GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);/* I2C2 clock enable *///    __HAL_RCC_I2C2_CLK_ENABLE();/* USER CODE BEGIN I2C2_MspInit 1 *//* USER CODE END I2C2_MspInit 1 */}
}void HAL_I2C_MspDeInit(I2C_HandleTypeDef* i2cHandle)
{if(i2cHandle->Instance==I2C1){/* USER CODE BEGIN I2C2_MspDeInit 0 *//* USER CODE END I2C2_MspDeInit 0 *//* Peripheral clock disable */__HAL_RCC_I2C1_CLK_DISABLE();/**I2C2 GPIO Configuration    PB6     ------> I2C2_SCLPB7    ------> I2C2_SDA */HAL_GPIO_DeInit(GPIOB, GPIO_PIN_6|GPIO_PIN_7);/* USER CODE BEGIN I2C2_MspDeInit 1 *//* USER CODE END I2C2_MspDeInit 1 */}
} 

i2c.h

#ifndef __i2c_H
#define __i2c_H
#ifdef __cplusplusextern "C" {
#endif/* Includes ------------------------------------------------------------------*/
#include "stm32f1xx_hal.h"
#include "main.h"/* USER CODE BEGIN Includes *//* USER CODE END Includes */extern I2C_HandleTypeDef hi2c1;/* USER CODE BEGIN Private defines *//* USER CODE END Private defines *///extern void _Error_Handler(char *, int);void MX_I2C1_Init(void);/* USER CODE BEGIN Prototypes *//* USER CODE END Prototypes */#ifdef __cplusplus
}
#endif

main.c

#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "key.h"
#include "exti.h"
#include "i2c.h"u8 read = 0;
u8 write[8] = {0x56,0x57,0x58,0x59,0x60,0x61,0x62,0x63};#define AM2320_ADDRESS  0xB8uint8_t IIC_TX_Buffer[]={0x03,0x00,0x04}; 
uint8_t IIC_RX_Buffer[12]; 
int16_t pTemperature;
uint16_t pHumidity;void dataPrint(double a, double b)
{printf("humidity : %.1f  Temp:%.1f\n\r", a,b);printf("\n\r");
}int main(void)
{HAL_Init();                    	   Stm32_Clock_Init(RCC_PLL_MUL9);   delay_init(72);               	uart_init(115200);					LED_Init();							KEY_Init();							EXTI_Init();MX_I2C1_Init();//HAL_I2C_Mem_Write(&hi2c1,0xA0,248,I2C_MEMADD_SIZE_8BIT,write,8,1000);//delay_ms(5);//HAL_I2C_Mem_Read(&hi2c1,0xA1,255,I2C_MEMADD_SIZE_8BIT,&read,1,100);//HAL_I2C_Mem_Write(&hi2c1,0xa0,254,I2C_MEMADD_SIZE_8BIT,&write,8,100);//HAL_I2C_Mem_Read(&hi2c1,0xA1,254,I2C_MEMADD_SIZE_8BIT,&read,8,100);HAL_I2C_Master_Transmit(&hi2c1,AM2320_ADDRESS,0,0,10); //唤醒delay_ms(3);//写温度 湿度指令,对照规格书HAL_I2C_Master_Transmit(&hi2c1,AM2320_ADDRESS,IIC_TX_Buffer,3,10);delay_ms(3);//读温湿度HAL_I2C_Master_Receive(&hi2c1,AM2320_ADDRESS,IIC_RX_Buffer,8,10);//根据规格书计算温湿度值pHumidity  =((IIC_RX_Buffer[2] << 8) | IIC_RX_Buffer[3] )/10.0;pTemperature =((IIC_RX_Buffer[4] << 8) | IIC_RX_Buffer[5])/10.0;	while(1){delay_ms(1000);    //打印        dataPrint(pHumidity,pTemperature);}
}

其他初始化,找个正点原子的hal库模板工程就行了。


http://www.ppmy.cn/news/139326.html

相关文章

洛谷 2320

解题思路&#xff1a; 首先所有的钱袋都可以看成一个取或不取的情况。那么这些钱袋取或不取就可以看作0或1&#xff0c;也就是说&#xff0c;要使用一些数字表示一个范围里的所有数&#xff0c;同时这又很二进制&#xff08;取或不取&#xff09;。所以我们就把钱袋里钱的数量定…

AM2320 温湿度计 单总线读取数据

温湿度计 用单总线方式读取数据 AM2320支持IIC通信和单总线通信&#xff0c;这里只用单总线&#xff1a; 使用单总线时的接线方式时&#xff0c;只需接第二引脚SDA&#xff0c;SCL接地就行。 通信时序图&#xff1a; 由时序可见通信非常简单&#xff0c;关键点要把握好每个时序…

ESP8266-Arduino编程实例-AM2320温度湿度传感器驱动

AM2320温度湿度传感器驱动 1、AM2320介绍 温湿度复合传感器 AM2320数字温湿度传感器是一个经过校准的数字信号输出。 采用特殊的温湿度采集技术,确保产品具有极高的可靠性和优异的长期稳定性。 传感器由一个电容式湿度元件和一个集成的高精度温度测量装置组成,并与一个高性…

AM2320 linux驱动程序

AM2320 linux驱动程序 采集&#xff0c;上报input 子系统 #include <linux/init.h> #include <linux/kernel.h> #include <linux/module.h> #include <linux/workqueue.h>#include <linux/platform_device.h> #include <linux/gpio.h> #…

慧荣SM2320是什么主控?一文便知固态主控SM2320+固件下载

在移动SSD还没有兴起的时期&#xff0c;U盘被看做是传输数据非常好的载体。它身材小巧&#xff0c;性能不俗&#xff0c;偶然的不小心跌落也不会损坏数据。 不过随着固态硬盘的兴起&#xff0c;现在的移动硬盘也是以NAND存储介质为主流了&#xff0c;意味着它的体积可以进一步…

P2320 [HNOI2006]鬼谷子的钱袋

H y p e r l i n k Hyperlink Hyperlink https://www.luogu.com.cn/problem/P2320 D e s c r i p t i o n Description Description 求用若干个正整数表示 ∀ i ∈ [ 1 , n ] , i ∈ N \forall i\in[1,n],i\in \mathbb{N} ∀i∈[1,n],i∈N的最小正整数个数以及这些正整数 这…

AM2320单总线定时器中断方式驱动(stm32)

AM2320是一款具有I2C、单总线通信的温湿度传感器&#xff0c;精度也比较高&#xff0c;适合日常的一些应用场景。对于单总线通信&#xff0c;已经有很多人分享其实现的代码了&#xff0c;但多是使用延时法进行读取&#xff0c;今天给大家带来一个通过单总线定时器中断方式读取。…

洛谷 2320 bzoj 1192 题解 (思维,构造)

原题链接&#xff1a; 洛谷 bzoj 题意简述 给定一个 n ( < 1 e 9 ) n(<1e9) n(<1e9)&#xff0c;构造一个序列使得&#xff1a; [ 1 , n ] [1,n] [1,n]中所有整数是这个序列中某些元素的和字典序最小 输出这个序列 思路 我们一开始认为&#xff1a; n n n是 1 e…