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 性价比挺高的 ,官网资料也挺多 ,就是不太详细 ,外设例程有点少,需要花时间摸索。