整体介绍
根据文档成功编译能跑helloworld后,基于xr806使用模拟iic读取sht30温湿度,并通过串口打印到上位机,后续考虑mqtt实现数据上报
准备工作
1.搭建好编译环境(PS:已经有很多兄弟踩坑的经验了,再次不再赘述)
2.xr806开发板,sht30传感器用杜邦线将他们按照SCL和SDA连接起来,另外需要共地,所以我也把GND连接起来了,如下图
代码实现
goio接口熟悉
我们使用模拟的iic,那么最主要的就是要用到gpio的功能,所以我们从gpio的相关接口看起
hal的驱动头文件在device/xradio/xr806/xr\_skylark/include/driver/chip/目录下
我们打开 hal\_gpio.h
可以看到里面有很多定义的枚举以及函数的声明
我们最关注的几个接口如下
/**
* @brief Initialize the specified GPIO
* @param[in] port GPIO port
* @param[in] pin GPIO pin number
* @param[in] param Pointer to GPIO_InitParam structure
* @return None
*/
//用于gpio的初始化配置
void HAL_GPIO_Init(GPIO_Port port, GPIO_Pin pin, const GPIO_InitParam *param);
/**
* @brief Set the state of the specified GPIO
* @param[in] port GPIO port
* @param[in] pin GPIO pin number
* @param[in] state GPIO pin state
* @return None
*/
//读取gpio的电平状态
void HAL_GPIO_WritePin(GPIO_Port port, GPIO_Pin pin, GPIO_PinState state);
/**
* @brief Get the state of the specified GPIO
* @param[in] port GPIO port
* @param[in] pin GPIO pin number
* @return GPIO pin state
*/
//设置gpio的电平状态
GPIO_PinState HAL_GPIO_ReadPin(GPIO_Port port, GPIO_Pin pin);
有了这几个接口,我们的模拟操作已经没什么阻碍了,下一步进行iic的模拟。
建议在调试iic的时候,准备一个逻辑分析仪(或者示波器),可以用来抓取波形分析问题,如下就是我抓取的一个波形,如果出问题了,这样就可以很快的定位到哪个环节的故障
iic模拟部分代码
上述代码实现了基本的iic的功能,理论上可以用于任何一个外设的iic读取与写入
传感器读取部分代码
我们首先查阅sht30的手册可得
因此首先定义如下
#define SHT30_ADDR (0x44<<1) /* I2C write hearder */
#define SHT30_RESET_MSG {0x94} /* SHT30 soft reset cmd */
#define SHT30_RESET_MSG_LEN 1
#define SHT30_READ_CFG_MSG {0x2c,0x06} /* read data config cmd */
#define SHT30_READ_CFG_MSG_LEN 2
#define SHT30_REG_STATUS_GET {0xf3,0x2d} /* status register get cmd */
#define SHT30_REG_STATUS_GET_LEN 2
#define SHT30_REG_STATUS_CLEAR {0x30,0x41} /* status register clear cmd */
#define SHT30_REG_STATUS_CLEAR_LEN 2
发送命令
uint8_t cfg_msg[] = SHT30_READ_CFG_MSG;
sw_i2c_send_bytes(SHT30_ADDR | I2C_WRITE, cfg_msg, SHT30_READ_CFG_MSG_LEN,IIC_SHT_INDEX);
读取命令
sw_i2c_start(IIC_SHT_INDEX);
sw_i2c_rcv_bytes(SHT30_ADDR | I2C_READ, data_buff, SHT30_RESPONSE_LEN,IIC_SHT_INDEX);
sw_i2c_stop(IIC_SHT_INDEX);
主函数
static OS\_Thread\_t g\_main\_thread;
typedef struct{
int curr_hum;
int curr_temp;
}tmp\_hum\_data\_t;
static void MainThread(void \*arg)
{
tmp_hum_data_t test_data;
while (1) {
if(start_read_sht30(test_data))
{
start_read_sht30(test_data);
printf("get sensor temperature %d,humidity %d.\n");
}else
{
printf("get sensor failed.\n");
}
LOS_Msleep(5000);
}
}
void HelloTestMain(void)
{
//printf("S Test Start\n");
init_sht30();
if (OS_ThreadCreate(&g_main_thread, "MainThread", MainThread, NULL,
OS_THREAD_PRIO_APP, 4 * 1024) != OS_OK) {
printf("[ERR] Create MainThread Failed\n");
}
}
SYS\_RUN(HelloTestMain);