烟花易冷 · 2022年02月13日

【xr806开发板试用】模拟IIC实现读取传感器数据并上报

整体介绍

根据文档成功编译能跑helloworld后,基于xr806使用模拟iic读取sht30温湿度,并通过串口打印到上位机,后续考虑mqtt实现数据上报

准备工作

1.搭建好编译环境(PS:已经有很多兄弟踩坑的经验了,再次不再赘述)
2.xr806开发板,sht30传感器用杜邦线将他们按照SCL和SDA连接起来,另外需要共地,所以我也把GND连接起来了,如下图
 title=

代码实现

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的时候,准备一个逻辑分析仪(或者示波器),可以用来抓取波形分析问题,如下就是我抓取的一个波形,如果出问题了,这样就可以很快的定位到哪个环节的故障
 title=

iic模拟部分代码

 title=
 title=
 title=
 title=
上述代码实现了基本的iic的功能,理论上可以用于任何一个外设的iic读取与写入

传感器读取部分代码

我们首先查阅sht30的手册可得
 title=
 title=
因此首先定义如下

#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);
推荐阅读
关注数
13823
内容数
139
全志XR806开发板相关的知识介绍以及应用专栏。
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息