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

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_SCL
		PB7     ------> 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_SCL
		PB7    ------> 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 __cplusplus
 extern "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  0xB8
    
uint8_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库模板工程就行了。

  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值