17 Star 58 Fork 24

Talkweb_OpenHarmony / Niobe

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
README.md 10.54 KB
一键复制 编辑 原始数据 按行查看 历史
angeyan 提交于 2021-11-16 14:48 . update

OpenHarmony驱动子系统开发—IIC_GYRO开发

本示例将演示如何在Niobe WiFi IoT开发板上进行IIC_GYRO开发

Niobe

IIC_GYRO API分析

osThreadNew()

osThreadId_t osThreadNew(osThreadFunc_t	func, void *argument,const osThreadAttr_t *attr )

描述:

函数osThreadNew通过将线程添加到活动线程列表并将其设置为就绪状态来启动线程函数。线程函数的参数使用参数指针*argument传递。当创建的thread函数的优先级高于当前运行的线程时,创建的thread函数立即启动并成为新的运行线程。线程属性是用参数指针attr定义的。属性包括线程优先级、堆栈大小或内存分配的设置。可以在RTOS启动(调用 osKernelStart)之前安全地调用该函数,但不能在内核初始化 (调用 osKernelInitialize)之前调用该函数。

注意 :不能在中断服务调用该函数

参数:

名字 描述
func 线程函数.
argument 作为启动参数传递给线程函数的指针
attr 线程属性

GPIO函数使用

IoTGpioInit()

IoTGpioInit函数是一个初始化GPIO管脚的函数,函数返回初始化结果。此函数在管脚使用之前调用,避免重复调用,避在再中断中使用。

函数参数值传递需要使用到的引脚号,可选引脚参数有如下:

typedef enum {
    IOT_GPIO_IO_GPIO_0 = 0,
    IOT_GPIO_IO_GPIO_1,
    IOT_GPIO_IO_GPIO_2,
    IOT_GPIO_IO_GPIO_3,
    IOT_GPIO_IO_GPIO_4,
    IOT_GPIO_IO_GPIO_5,
    IOT_GPIO_IO_GPIO_6,
    IOT_GPIO_IO_GPIO_7,
    IOT_GPIO_IO_GPIO_8,
    IOT_GPIO_IO_GPIO_9,
    IOT_GPIO_IO_GPIO_10,
    IOT_GPIO_IO_GPIO_11,
    IOT_GPIO_IO_GPIO_12,
    IOT_GPIO_IO_GPIO_13,
    IOT_GPIO_IO_GPIO_14,
    IOT_GPIO_IO_GPIO_MAX
} IOT_GPIO_IO_NAME;

IoTGpioSetDir()

IoTGpioSetDir函数用来设置GPIO引脚方向,函数传递两个参数,一个是需要设置的引脚号,一个是引脚方向。函数返回设置结果。

参数 描述
id 引脚号,参考初始化函数的引脚设置
dir 引脚方向,参考IotGpioDir枚举值。
/**
 * @brief Enumerates GPIO directions.
 */
typedef enum {
    /** Input */
    IOT_GPIO_DIR_IN = 0,
    /** Output */
    IOT_GPIO_DIR_OUT
} IotGpioDir;

IotIoSetFunc()

IoTGpioSetDir函数用来设置GPIO的复用功能,函数传递两个参数,一个是需要设置的引脚号,一个是复用为什么功能。函数返回设置结果。

参数 描述
id 引脚号,参考初始化函数的引脚设置
val 复用为什么功能,参考各个GPIO的复用枚举值。
/**
* GPIO_13 pin function.CNcomment:GPIO_13管脚功能。CNend
 */
typedef enum {
    HI_IO_FUNC_GPIO_13_SSI_DATA,
    HI_IO_FUNC_GPIO_13_UART0_TXD,
    HI_IO_FUNC_GPIO_13_UART2_RTS_N,
    HI_IO_FUNC_GPIO_13_SDIO_D0,
    HI_IO_FUNC_GPIO_13_GPIO,
    HI_IO_FUNC_GPIO_13_PWM4_OUT,
    HI_IO_FUNC_GPIO_13_I2C0_SDA,
    HI_IO_FUNC_GPIO_13_I2S0_WS,
} hi_io_func_gpio_13;

IotIoSetPull()

IotIoSetPull函数用来设置GPIO的pull功能,函数传递两个参数,一个是需要设置的引脚号,一个是设置GPIO为上拉还是下拉。函数返回设置结果。

参数 描述
id 引脚号,参考初始化函数的引脚设置
val GPIO的pull值,参考IOT_IO_PULL枚举。
typedef enum {
    /** No pull */
    IOT_IO_PULL_NONE,
    /** Pull-up */
    IOT_IO_PULL_UP,
    /** Pull-down */
    IOT_IO_PULL_DOWN,
    /** Maximum value */
    IOT_IO_PULL_MAX,
} IOT_IO_PULL;

IoTGpioRegisterIsrFunc()

unsigned int IoTGpioRegisterIsrFunc(unsigned int id, IotGpioIntType intType, IotGpioIntPolarity intPolarity, GpioIsrCallbackFunc func, char *arg);

/**

  • @brief Enables the interrupt feature for a GPIO pin.
  • This function can be used to set the interrupt type, interrupt polarity, and interrupt callback for a GPIO pin.
  • @param id Indicates the GPIO pin number.
  • @param intType Indicates the interrupt type.
  • @param intPolarity Indicates the interrupt polarity.
  • @param func Indicates the interrupt callback function.
  • @param arg Indicates the pointer to the argument used in the interrupt callback function.
  • @return Returns {@link IOT_SUCCESS} if the interrupt feature is enabled;
  • returns {@link IOT_FAILURE} otherwise. For details about other return values, see the chip description.
  • @since 2.2
  • @version 2.2 */

I2C概述

I2C(Inter Integrated Circuit)总线是由Philips公司开发的一种简单、双向二线制同步串行总线。
I2C以主从方式工作,通常有一个主设备和一个或者多个从设备,主从设备通过SDA(SerialData)串行数据线以及SCL(SerialClock)串行时钟线两根线相连,如图1 所示。
I2C数据的传输必须以一个起始信号作为开始条件,以一个结束信号作为传输的停止条件。数据传输以字节为单位,高位在前,逐个bit进行传输。
I2C总线上的每一个设备都可以作为主设备或者从设备,而且每一个设备都会对应一个唯一的地址,当主设备需要和某一个从设备通信时,通过广播的方式,将从设备地址写到总线上,如果某个从设备符合此地址,将会发出应答信号,建立传输。
I2C接口定义了完成I2C传输的通用方法集合,包括:
I2C控制器管理: 打开或关闭I2C控制器
I2C消息传输:通过消息传输结构体数组进行自定义传输

接口说明

  1. I2C初始化函数:unsigned int IoTI2cInit(unsigned int id, unsigned int baudrate) 参数说明: id: 对应的I2C号 baudrate: I2C通信速率 return: IOT_SUCCESS表示初始化成功
2. I2C去初始化函数:unsigned int IoTI2cDeinit(unsigned int id)
    参数说明: 
        id:      对应的I2C号
        return:   IOT_SUCCESS表示去除初始化成功

3. I2C写数据函数:unsigned int IoTI2cWrite(unsigned int id, unsigned short deviceAddr, const   unsigned char *data, unsigned int dataLen)
    参数说明: 
        id:         对应的I2C号
        deviceAddr: I2C设备地址
        data:       写入的数据缓冲区地址
        dataLen:    写入的数据字节数
        return:     IOT_SUCCESS表示写入成功

4. I2C读数据函数:unsigned int IoTI2cRead(unsigned int id, unsigned short deviceAddr, unsigned char *data, unsigned int dataLen)
    参数说明: 
        id:         对应的I2C号
        deviceAddr: I2C设备地址
        data:       读取数据缓冲区地址
        dataLen:    读取的字节数
        return:     IOT_SUCCESS表示读取成功

5. I2C速率设置函数:unsigned int IoTI2cSetBaudrate(unsigned int id, unsigned int baudrate)
    参数说明: 
        id:       对应的I2C号  
        baudrate: 设置的I2C速率值     

案例程序解析

本案例通过不断循环读取MPU6050的Accel和Gyro数据,通过这个算法条件X + 100 < Gyro_Data.Accel[0] || X - 100 > Gyro_Data.Accel[0] ||
Y + 100 < Gyro_Data.Accel[1] || Y - 100 > Gyro_Data.Accel[1] || Z + 100 < Gyro_Data.Accel[2] || Z - 100 > Gyro_Data.Accel[2]来控制LED1 和LED2的亮灭变化

static void GryoExampleTask(void)
{
    GyroInit();

    while (1)
    {
        printf("=======================================\r\n");
        printf("*************E53_SC2_example***********\r\n");
        printf("=======================================\r\n");
        GyroReadData();
        printf("\r\n******************************Temperature      is  %d\r\n", (int)Gyro_Data.Temperature);
        printf("\r\n******************************Accel[0]         is  %d\r\n", (int)Gyro_Data.Accel[0]);
        printf("\r\n******************************Accel[1]         is  %d\r\n", (int)Gyro_Data.Accel[1]);
        printf("\r\n******************************Accel[2]         is  %d\r\n", (int)Gyro_Data.Accel[2]);

        printf("\r\n******************************Gyro[0]         is  %d\r\n", (int)Gyro_Data.Gyro[0]);
        printf("\r\n******************************Gyro[1]         is  %d\r\n", (int)Gyro_Data.Gyro[1]);
        printf("\r\n******************************Gyro[2]         is  %d\r\n", (int)Gyro_Data.Gyro[2]);
        if (X == 0 && Y == 0 && Z == 0)
        {
            X = (int)Gyro_Data.Accel[0];
            Y = (int)Gyro_Data.Accel[1];
            Z = (int)Gyro_Data.Accel[2];
        }
        else
        {
            printf("MPU6050 second ReadAcc Gyro_Data.Accel[0] ==%d\t Gyro_Data.Accel[1] ==%d\t Gyro_Data.Accel[2] ==%d\n",Gyro_Data.Accel[0],Gyro_Data.Accel[1],Gyro_Data.Accel[2]);
            if (X + 100 < Gyro_Data.Accel[0] || X - 100 > Gyro_Data.Accel[0] || Y + 100 < Gyro_Data.Accel[1] || Y - 100 > Gyro_Data.Accel[1] || Z + 100 < Gyro_Data.Accel[2] || Z - 100 > Gyro_Data.Accel[2])
            {
                printf("\r\n*******************led1 off led2 on******************\r\n");
                LEDD1StatusSet(OFF);
                LEDD2StatusSet(ON);
            }
            else
            {
                printf("\r\n*******************led2 off led1 on******************\r\n");
                LEDD1StatusSet(ON);
                LEDD2StatusSet(OFF);
            }
            X = (int)Gyro_Data.Accel[0];
            Y = (int)Gyro_Data.Accel[1];
            Z = (int)Gyro_Data.Accel[2];
            printf("MPU6050 second ReadAcc X ==%d\t Y ==%d\t Z ==%d\n",X,Y,Z);
        }
        usleep(1000000);
    }
}

编译调试

修改 BUILD.gn 文件

修改 applications\app路径下 BUILD.gn 文件,指定 gpio_led_example 参与编译。

# "TW001_OS_helloworld:helloworld",
#"TW002_OS_thread:os_thread_example",
#"TW003_OS_timer:os_timer_example",
#"TW004_OS_event:os_event_example",
#"TW005_OS_mutex:os_mutex_example",
#"TW006_OS_semp:os_semp_example",
#"TW007_OS_message:os_message_example",
#"TW101_GPIO_led:gpio_led_example",
#"TW102_EXTI_key:exti_key_example",
#"TW103_PWM_led:pwm_led_example",
#"TW104_ADC_voltage:adc_voltage_example",
#"TW105_I2C_sht30:i2c_sht30_example",
#"TW106_UART:uart_example",
"TW207_Module_gyro:module_gyro_example",
#"TW301_APP_oled:app_oled_example",
#"TW302_APP_nfc:app_nfc_example"

修改好BUILD.gn,代码编译烧录代码后,按下开发板的RESET按键。不同角度LED1、LED2会有不同的亮灭变化,打开串口工具也能看到相对应的log打印

1
https://gitee.com/talkweb_oh/niobe.git
git@gitee.com:talkweb_oh/niobe.git
talkweb_oh
niobe
Niobe
master

搜索帮助