AT32 读取sht30 温湿度数据

AT32F403A 获取sht30数据 官方库V2.0 需要官方iic扩展库 i2c_application的支持

AT32 BSP和 i2c_application 扩展库在官网可下载。

想用 RT-Thread studio 来写AT32代码来着 但同样的代码在keil5 正常, RT-Thread studio 就不正常 iic 时钟线一直被拉低。可能是时钟配置或者库版本不同的原因 ,暂时未解决 mark一下。

1.逻辑分析仪

 通信正常

2.效果如下 摄氏度 华氏度 相对湿度

3.代码如下

main.c

/*主程序 main.c*/
int main(void)
{
  /* 时钟配置 */
  system_clock_config();
  at32_board_init();
  /* 串口配置 */	 
  uart_print_init(115200);
  /* sht30 配置 */	
  sht30_iic_init();
  printf("Hardware init Down !\r\n");	

  while(1)
  {
   /*读取sht30 数据并打印*/
   sht30_info();
   delay_ms(500);

  }
}

sht30.c 

/*sht30.c*/
#include "sht30.h"
#include "i2c_application.h"
i2c_handle_type hi2cx;
/**
  * @brief  I2C错误回调
  * @param  none
  * @retval none
  */
void error_handler(uint32_t error_code)
{
  while(1)
  {
    printf("iic_error\r\n");
    delay_ms(500);
  }
}
/**
  * @brief  初始化I2C接口
  * @param  none
  * @retval none
  */
void i2c_lowlevel_init(i2c_handle_type* hi2c)
{
  gpio_init_type gpio_initstructure;
  if(hi2c->i2cx == I2Cx_PORT)
  {
    /* 开启 IIC与其引脚时钟 */
    crm_periph_clock_enable(I2Cx_CLK, TRUE);
    crm_periph_clock_enable(I2Cx_SCL_GPIO_CLK, TRUE);
    crm_periph_clock_enable(I2Cx_SDA_GPIO_CLK, TRUE);
    /* IIC GPIO配置 上拉 */
    gpio_initstructure.gpio_out_type       = GPIO_OUTPUT_OPEN_DRAIN;
    gpio_initstructure.gpio_pull           = GPIO_PULL_UP;
    gpio_initstructure.gpio_mode           = GPIO_MODE_MUX;
    gpio_initstructure.gpio_drive_strength = GPIO_DRIVE_STRENGTH_MODERATE;
    /* 配置IIC SCL 引脚 */
    gpio_initstructure.gpio_pins = I2Cx_SCL_PIN;
    gpio_init(I2Cx_SCL_GPIO_PORT, &gpio_initstructure);
    /* 配置IIC SDA 引脚 */
    gpio_initstructure.gpio_pins = I2Cx_SDA_PIN;
    gpio_init(I2Cx_SDA_GPIO_PORT, &gpio_initstructure);
    /* 初始化IIC */
    i2c_init(hi2c->i2cx, I2C_FSMODE_DUTY_2_1, I2Cx_SPEED);
	/* IIC 主机 7BIT模式 主机地址 */
    i2c_own_address1_set(hi2c->i2cx, I2C_ADDRESS_MODE_7BIT, I2Cx_ADDRESS);
  }
}
/**
  * @brief  sht30 初始化
  * @param  none
  * @retval none
  */
void sht30_iic_init(void)
{
    hi2cx.i2cx = I2Cx_PORT;
    i2c_config(&hi2cx);
}
i2c_status_type i2c_status;
/**
  * @brief  sht30 读取温湿度数据
  * @param  none
  * @retval none
  */
void sht30_info(void)
{
    /* 发送数据查询命令 0x2c06 */
    static uint8_t tx_buf[2] = {0x2c,0x06};
    static uint8_t rx_buf[6] = {0};
    uint16_t temp_raw,hum_raw ;
    float cTemp,fTemp,Humidity;
    if((i2c_status = i2c_master_transmit(&hi2cx, sht30_addr, tx_buf, 2, I2C_TIMEOUT)) != I2C_OK)
    {
      error_handler(i2c_status);
    }
    delay_ms(100);/* sht30 测量需要时间间隔 过短则数据误差过大 */
    /* 接收数据 */
    if((i2c_status = i2c_master_receive(&hi2cx, sht30_addr, rx_buf, 6, I2C_TIMEOUT)) != I2C_OK)
    {
      error_handler(i2c_status);
    }
    /* 数据拼接 */
    temp_raw = (rx_buf[0] << 8 | rx_buf[1]);
    hum_raw  = (rx_buf[3] << 8 | rx_buf[4]);
	/* 转换为实际摄氏度 华氏度 相对湿度 */
    cTemp     = (((float)temp_raw / 65535.0f) * 175) - 45;
	fTemp     = (cTemp * 1.8f) + 32;
    Humidity  = ( (float)hum_raw / 65535.0f) * 100;
	/* 错误数据过滤 */
	if((cTemp>125)&&(cTemp<-20)&&(Humidity<0)&&(Humidity>100))
	{
		cTemp=0;fTemp=0;Humidity=0;
		#ifdef sht30_error
		printf("sht30_data_error\r\n");
		#endif
	}
    /* 打印温度 */
    printf("cTemp = %.2fC,fTemp = %.2fC,humidity = %.2f%% \r\n",cTemp,fTemp,Humidity);
}

 sht30.h

/*sht30.h*/
#ifndef __SHT30_H
#define __SHT30_H
#include "at32f403a_407_board.h"
/*iic config*/
#define I2C_TIMEOUT                      0xFFFFFFFF

#define I2Cx_SPEED                       1000000
#define I2Cx_ADDRESS                     0xA0

#define I2Cx_PORT                        I2C2
#define I2Cx_CLK                         CRM_I2C2_PERIPH_CLOCK

#define I2Cx_SCL_PIN                     GPIO_PINS_10
#define I2Cx_SCL_GPIO_PORT               GPIOB
#define I2Cx_SCL_GPIO_CLK                CRM_GPIOB_PERIPH_CLOCK

#define I2Cx_SDA_PIN                     GPIO_PINS_11
#define I2Cx_SDA_GPIO_PORT               GPIOB
#define I2Cx_SDA_GPIO_CLK                CRM_GPIOB_PERIPH_CLOCK

/*sht30 config*/
#define sht30_error
#define sht30_addr                       0x44<<1  //0X44 //0X45
void sht30_iic_init(void);
void sht30_info(void);


#endif

提一嘴 AT32 性价比挺高的 ,官网资料也挺多 ,就是不太详细 ,外设例程有点少,需要花时间摸索。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值