全部文档
概述 硬件支持 快速开发指南 内核 驱动 通用组件 专业组件 常见问题

SENSOR设备用户开发


以I2C接口的sensor为例,进行配置。

一、工程配置

使用 Menuconfig 配置工程选项

  1. 在对应的 oneos\projects\xxxxx(project文件夹) 目录下打开 OneOS-Cube 工具,在命令行输入 menuconfig 打开可视化配置界面;

  2. 如下图示,通过空格或向右方向键选择 Drivers->I2C 下的 Using I2C device drivers 和 Use GPIO to simulate I2C 以及Use GPIO to simulate I2C下面的Enable I2C1 BUS (software simulation选项;

         [*] Using I2C device drivers
         [*]     Use GPIO to simulate I2C
         (10)        simulate I2C bus delay(us) (NEW)
         [*]         Enable I2C1 BUS (software simulation)  --->
         [ ]         Enable I2C2 BUS (software simulation) (NEW)  ----
         [ ]         Enable I2C3 BUS (software simulation) (NEW)  ----
         [ ]         Enable I2C4 BUS (software simulation) (NEW)  ----
         [ ]     Use at24cxx eeprom
    
  3. 进入Enable I2C1 BUS (software simulation),设置scl、sda的具体引脚编号(根据板子实际电路设置 );

         *** Notice: PC0 --> 32; PC1 --> 33 ***
     (32) i2c1 scl pin number (NEW)
     (33) I2C1 sda pin number (NEW)
    
  4. 选择Drivers->Sensors,使能Using sensor device drivers,然后选择具体的sensor型号,如bmp180;

[*] Using SENSOR device drivers
[ ]     Using SENSOR CMD (NEW)
[ ]     Enable infrared (NEW)  ----
[ ]     Enable sth20 (NEW)  ----
[ ]     Enable Audio Device  ----
[ ]     Enable adxl345 (NEW)  ----
[ ]     Enable bh1750 (NEW)  ----
[*]     Enable bmp180  --->
[ ]     Enable mpu6xxx (NEW)  ----
[ ]     Enable ak8963 (NEW)  ----
[ ]     Enable lsm6dsl (NEW)  ----
  1. 进行bmp180配置;

    (i2c1) bmp180 i2c bus name (NEW)
    (0x77) bmp180 i2c addr(7bit) (NEW)
    
  2. 退出并保存设置

    使用键盘Q键或Esc退出, Save configuration?中选择键盘单击Y保存设置即可。

使用 Scons 构建工程

在上一步打开的 OneOS-Cube 工具命令行输入 scons --ide=mdk5 构建工程;

二、工程编译及实现

  1. 打开对应的 oneos\projects\xxxxx(project文件夹) 目录下的 project.uvprojx 工程文件;
  2. 在工程中加入具体sensor设备的控制或测试实现代码;
  3. 编译并下载工程,运行程序;
  4. 打开串口工具如xshell等,通信成功后,即可进行sensor设备的控制或数据读取测试。

三、SENSOR设备API 列表

接口 说明
os_device_find() 根据传感器设备名称查找设备
os_device_open() 打开传感器设备
os_device_read_nonblock() 读取数据
os_device_control() 控制传感器设备
os_device_close() 关闭传感器设备

os_device_find

该函数根据传感器设备名称查找设备,函数原型如下:

os_device_t *os_device_find(const char* name);
参数 说明
name 传感器设备名称
返回 说明
设备指针 查找到对应设备将返回相应的设备指针
OS_NULL 没有找到相应的设备对象

os_device_open

该函数用于打开设备,函数原型如下:

os_err_t os_device_open(os_device_t *dev);
参数 说明
dev 设备指针
返回 说明
OS_EOK 设备打开成功
OS_EBUSY 设备忙
其他错误码 设备打开失败

os_device_read_nonblock

该函数用于读取传感器接收到的数据,函数原型如下:

os_size_t os_device_read_nonblock(os_device_t *dev, os_off_t pos, void* buffer, os_size_t size);
参数 说明
dev 设备指针
pos 读取数据偏移量,此参数传感器未使用
buffer 缓冲区指针,读取的数据将会被保存在缓冲区中
size 读取数据的大小
返回 说明
读到数据的实际大小 返回读取到数据的个数
0 需要读取当前线程的 errno 来判断错误状态

os_device_control

该函数用于对传感器设备进行配置,函数原型如下:

os_err_t os_device_control(os_device_t *dev, int cmd, void* arg);
参数 说明
dev 设备指针
cmd 命令控制字
arg 控制的参数
返回 说明
OS_EOK 函数执行成功
OS_ENOSYS 执行失败,dev 为空
其他错误码 执行失败

其中的 cmd 目前支持以下几种命令控制字:

#define  OS_SENSOR_CTRL_GET_ID         (0)  /* Get device id */
#define  OS_SENSOR_CTRL_GET_INFO       (1)  /* Get sensor info */
#define  OS_SENSOR_CTRL_SET_RANGE      (2)  /* Set the measure range of sensor */
#define  OS_SENSOR_CTRL_SET_ODR        (3)  /* Set output date rate. unit is HZ */
#define  OS_SENSOR_CTRL_SET_MODE       (4)  /* Set sensor's work mode */
#define  OS_SENSOR_CTRL_SET_POWER      (5)  /* Set power mode */
#define  OS_SENSOR_CTRL_SELF_TEST      (6)  /* Take a self test */

os_device_close

该函数用于关闭传感器设备,函数原型如下:

os_err_t os_device_close(os_device_t *dev);
参数 说明
dev 设备句柄
返回 说明
OS_EOK 关闭设备成功
OS_ERROR 设备已经完全关闭,不能重复关闭设备
其他错误码 关闭设备失败

关闭设备接口和打开设备接口需配对使用,打开一次设备对应要关闭一次设备,这样设备才会被完全关闭,否则设备仍处于未关闭状态。

使用示例

本例程为测试acce类型的sensor icm20608:

#include <drv_cfg.h>
#include <os_tick.h>
#include <stdio.h>
#include <shell.h>
#include <sensors/sensor.h>

static int sensor_acce_test(int argc, char *argv[])
{
    int i;
    char sensor_name[24];
    struct os_sensor_data sensor_data;

    if (argc != 2)
    {
        os_kprintf("usage:sensor_acce_test <sensor_name>\r\n");
        return -1;
    }

    snprintf(sensor_name, sizeof(sensor_name) - 1, "acce_%s", argv[1]);

    os_device_t *sensor = os_device_find(sensor_name);
    OS_ASSERT(sensor != NULL);
    os_device_open(sensor, OS_DEVICE_FLAG_RDWR);

    for (i = 0; i < 10; i++)
    {
        os_device_read_nonblock(sensor, 0, &sensor_data, sizeof(struct os_sensor_data));
        os_kprintf("sensor acce (%d, %d, %d)\r\n", 
                    sensor_data.data.acce.x, 
                    sensor_data.data.acce.y, 
                    sensor_data.data.acce.z);

        os_task_mdelay(1000);
    }

    return 0;
}
SH_CMD_EXPORT(sensor_acce_test, sensor_acce_test, "sensor_acce_test");

运行结果如下:

sh>sensor_acce_test icm20608
sensor acce (296, -642, 724)
sensor acce (385, 840, 150)
sensor acce (-183, -322, 912)
sensor acce (398, 1034, 194)
sensor acce (774, 325, -299)
sensor acce (894, 566, 204)
sensor acce (136, 274, -915)
sensor acce (448, 354, 494)
sensor acce (688, -463, -373)
sensor acce (833, 255, -166)

results matching ""

    No results matching ""