我是靠谱客的博主 香蕉大山,最近开发中收集的这篇文章主要介绍rtthread studio与正点原子apollo(10)--I2C设备之光环境传感器AP3216前言一、光传感器AP3216简介二、AP3216操作实例总结,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

rtthread studio与正点原子apollo[10]--I2C设备之光环境传感器AP3216

  • 前言
  • 一、光传感器AP3216简介
  • 二、AP3216操作实例
  • 总结


前言

本文继续介绍I2C设备的使用,带有I2C接口的传感器都可以采用此方法,只需要根据特定的通信协议进行简单的修改。


I2C设备的介绍和具体使用方法已在前章介绍,因此本文直接介绍I2C访问AP3216的过程

一、光传感器AP3216简介

AP3216C是敦南科技退出的一款三合一环境传感器,它包含了:数字环境光传感器(ALS)、接近传感器(PS)和一个红外LED(IR)。该芯片通过IIC接口和MCU连接,并支持中断(INT)输出。
AP3216内部结构如图:
在这里插入图片描述
引脚说明:
在这里插入图片描述
AP3216C与MCU只需要连接SCL、SDA和INT,就可以实现驱动。其SCL和SDA同24C02共用,连接在PH4和PH5上,INT脚连接在PCF8574的P1上。
在这里插入图片描述
AP3216寄存器的位定义及其功能描述:
在这里插入图片描述
AP3216的操作有写和读两种模式,写模式主要是配置其系统模式,读模式是将传感器数据读出到MCU中。
写模式的时序,这种模式比较简单,先写地址(0X1E),然后是结存器地址+寄存器内容:
在这里插入图片描述
读模式相对复杂,此过程除了读取操作还有写操作,其时序
在这里插入图片描述
先写从机地址+寄存器地址,之后再进行读操作,从机地址+寄存器。

二、AP3216操作实例

i2c的访问方法前文已介绍,这里不做过多说明,直接给出实例代码

#include <rtthread.h>
#include <board.h>
#include <rtdevice.h>


#define AP_IIC_DEV_NAME "i2c1"
#define AP_IIC_ADD 0x1E
static struct rt_i2c_bus_device *i2c_bus=RT_NULL;

static struct rt_thread thread1;
static char thread1_stack[2048];

static rt_err_t ap3216_write(struct rt_i2c_bus_device *bus, rt_uint8_t reg, rt_uint8_t data)//根据通信协议编写对应的写操作
{
    struct rt_i2c_msg msgs;
    rt_uint16_t buf_size=1;
    rt_uint8_t send_buf[2];

    send_buf[0]=reg;
    if(data!=RT_NULL)
    {
        send_buf[1]=data;
        buf_size=2;
    }

    msgs.addr=AP_IIC_ADD;
    msgs.buf=send_buf;
    msgs.flags=RT_I2C_WR;
    msgs.len=buf_size;

    if(rt_i2c_transfer(bus, &msgs, buf_size)==1)
        return RT_EOK;
    else
        return -RT_ERROR;
}

static rt_err_t ap3216_read(struct rt_i2c_bus_device *bus,rt_uint8_t reg, rt_uint8_t *buf)//根据通信协议编写相应的读操作
{
    struct rt_i2c_msg msgs[2];
    msgs[0].addr=AP_IIC_ADD;
    msgs[0].buf=&reg;
    msgs[0].flags=RT_I2C_WR;
    msgs[0].len=1;
    msgs[1].addr=AP_IIC_ADD;
    msgs[1].buf=buf;
    msgs[1].flags=RT_I2C_RD;
    msgs[1].len=1;
    if(rt_i2c_transfer(bus, msgs, 2)==2)
        return RT_EOK;
    else
        return -RT_ERROR;
}

static rt_err_t ap3216_init(void)
{
    rt_uint8_t temp;
    rt_uint8_t addr;
    rt_uint8_t data;

    addr=0x00;
    data=0x04;
    ap3216_write(i2c_bus,addr,data);//重启传感器
    rt_thread_mdelay(50);
    data=0x03;
    ap3216_write(i2c_bus,addr,data);//开启ALS、PS+IR
    rt_thread_mdelay(50);
    ap3216_read(i2c_bus,addr, &temp);
    if(temp == 0x03)
        return RT_EOK;
    else{
        rt_kprintf("init failedn");
        return -RT_ERROR;
    }
}
rt_uint16_t ir, als, ps;
static void ap3216_entry(void *parameter)
{
    rt_uint8_t i;
    rt_uint8_t buf[6];


    i2c_bus=(struct rt_i2c_bus_device *)rt_device_find(AP_IIC_DEV_NAME);
    if(i2c_bus==RT_NULL)
    {
        rt_kprintf("can't find s% device!n",AP_IIC_DEV_NAME);
        return;
    }
    else
        rt_kprintf("find s%!n",AP_IIC_DEV_NAME);
    ap3216_init();

    while(1){
        for(i = 0; i < 6; i++){
            ap3216_read(i2c_bus,0x0A+i, buf+i);
        }
        if(buf[0] & 0x80)
            ir=0;                        //IR_OF位为1,则数据无效
        else
            ir=((rt_uint16_t)buf[1]<<2)|(buf[0]&0x03);     //读取IR传感器的数据
        als=((rt_uint16_t)buf[3]<<8)|buf[2];                //读取ALS传感器的数据
        if(buf[4]&0x40)
            ps=0;                        //IR_OF位为1,则数据无效
        else
            ps=((rt_uint16_t)(buf[5] & 0x3F)<<4)|(buf[4]&0x0F); //读取PS传感器的数据
        rt_kprintf("%dt",ir);
        rt_kprintf("%dt",als);
        rt_kprintf("%dtn",ps);
        rt_thread_mdelay(500);
    }

}

int ap_thread_init(void)
{
    rt_thread_init(&thread1,"ap3216_thread", ap3216_entry, RT_NULL, &thread1_stack[0], sizeof(thread1_stack), 20, 10);
    rt_thread_startup(&thread1);
    return 0;
}

总结

I2C访问传感器的过程,重点是其读操作过程,需要根据特定的传感器协议编写代码。

最后

以上就是香蕉大山为你收集整理的rtthread studio与正点原子apollo(10)--I2C设备之光环境传感器AP3216前言一、光传感器AP3216简介二、AP3216操作实例总结的全部内容,希望文章能够帮你解决rtthread studio与正点原子apollo(10)--I2C设备之光环境传感器AP3216前言一、光传感器AP3216简介二、AP3216操作实例总结所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(46)

评论列表共有 0 条评论

立即
投稿
返回
顶部