我是靠谱客的博主 热情苗条,最近开发中收集的这篇文章主要介绍I2C相关实验2,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

本次实验要用到的一个I2C从器件AP3216C。

AP3216C简介
I.MX6U-ALPHA开发板上通过I2C1连接了一个三合一环境传感器:AP3216C,AP3216C是由敦南科技推出的一款传感器,其支持环境光强度(ALS)、接近距离(PS)和红外线强度(IR)这三个环境参数检测。该芯片可以通过IIC接口与主控制相连,并且支持中断,AP3216C的特点如下:
①、I2C接口,快速模式下波特率可以到400Kbit/S
②、多种工作模式选择:ALS、PS+IR、ALS+PS+IR、PD等等。
③、内建温度补偿电路。
④、宽工作温度范围(-30°C ~ +80°C)。
⑤、超小封装,4.1mm x 2.4mm x 1.35mm
⑥、环境光传感器具有16位分辨率。
⑦、接近传感器和红外传感器具有10位分辨率。
AP3216C常被用于手机、平板、导航设备等,其内置的接近传感器可以用于检测是否有物体接近,比如手机上用来检测耳朵是否接触听筒,如果检测到的话就表示正在打电话,手机就会关闭手机屏幕以省电。也可以使用环境光传感器检测光照强度,可以实现自动背光亮度调节。
在这里插入图片描述

AP3216的设备地址为0X1E,同几乎所有的I2C从器件一样,AP3216C内部也有一些寄存器,通过这些寄存器我们可以配置AP3216C的工作模式,并且读取相应的数据。

寄存器地址 位 寄存器功能 描述
0X00 2:0 系统模式 000:掉电模式(默认)。
001:使能ALS。
010:使能PS+IR。
011:使能ALS+PS+IR。
100:软复位。
101:ALS单次模式。
110:PS+IR单次模式。
111:ALS+PS+IR单次模式。
0X0A 7 IR低位数据 0:IR&PS数据有效,1:无效
1:0 IR最低2位数据。
0X0B 7:0 IR高位数据 IR高8位数据。
0X0C 7:0 ALS低位数据 ALS低8位数据。
0X0D 7:0 ALS高位数据 ALS高8位数据。
0X0E 7 PS低位数据 0,物体在远离;1,物体在接近。
6 0,IR&PS数据有效;1,IR&PS数据无效
3:0 PS最低4位数据。
0X0F 7 PS高位数据 0,物体在远离;1,物体在接近。
6 0,IR&PS数据有效;1,IR&PS数据无效
5:0 PS最低6位数据。
0X00这个寄存器是模式控制寄存器,用来设置AP3216C的工作模式,一般开始先将其设置为0X04,也就是先软件复位一次AP3216C。接下来根据实际使用情况选择合适的工作模式,比如设置为0X03,也就是开启ALS+PS+IR。从0X0A~0X0F这6个寄存器就是数据寄存器,保存着ALS、PS和IR这三个传感器获取到的数据值。如果同时打开ALS、PS和IR则读取间隔最少要112.5ms,因为AP3216C完成一次转换需要112.5ms。开机会先检测AP3216C是否存在,一般的芯片是有个ID寄存器,通过读取ID寄存器判断ID是否正确就可以检测芯片是否存在。但是AP3216C没有ID寄存器,所以我们就通过向寄存器0X00写入一个值,然后再读取0X00寄存器,判断读出得到值和写入的是否相等,如果相等就表示AP3216C存在,否则的话AP3216C就不存在。

AP3216C是在I.MX6U-ALPHA开发板底板上,原理图如图26.2.1所示:


  #include "bsp_ap3216c.h"
   #include "bsp_i2c.h"
   #include "bsp_delay.h"
   #include "cc.h"
   #include "stdio.h"

 unsigned char ap3216c_init(void)
  {
      unsigned char data = 0;
      IOMUXC_SetPinMux(IOMUXC_UART4_TX_DATA_I2C1_SCL, 1);
      IOMUXC_SetPinMux(IOMUXC_UART4_RX_DATA_I2C1_SDA, 1);
      IOMUXC_SetPinConfig(IOMUXC_UART4_TX_DATA_I2C1_SCL, 0x70B0);
      IOMUXC_SetPinConfig(IOMUXC_UART4_RX_DATA_I2C1_SDA, 0X70B0);
  
      /* 2、初始化I2C1 */
      i2c_init(I2C1);  
      /* 3、初始化AP3216C 	*/
  	/* 复位AP3216C        	*/
      ap3216c_writeonebyte(AP3216C_ADDR, AP3216C_SYSTEMCONG, 0X04);   
      delayms(50); /* AP33216C复位至少10ms */      
  
 	 	/* 开启ALS、PS+IR    	*/
      ap3216c_writeonebyte(AP3216C_ADDR, AP3216C_SYSTEMCONG, 0X03);   
  
  	/* 读取刚刚写进去的0X03 */
      data = ap3216c_readonebyte(AP3216C_ADDR, AP3216C_SYSTEMCONG);   
      if(data == 0X03)
          return 0;   /* AP3216C正常    */
      else 
          return 1;   /* AP3216C失败    */
  }
unsigned char ap3216c_writeonebyte(unsigned char addr,
unsigned char reg, 
unsigned char data)
  {
      unsigned char status=0;
      unsigned char writedata=data;
      struct i2c_transfer masterXfer;
      
      /* 配置I2C xfer结构体 */
      masterXfer.slaveAddress = addr;    	/* 设备地址            	*/
      masterXfer.direction = kI2C_Write;	/* 写入数据             	*/
      masterXfer.subaddress = reg;       	/* 要写入的寄存器地址  	*/
      masterXfer.subaddressSize = 1;    	/* 地址长度一个字节    	*/
      masterXfer.data = &writedata;      	/* 要写入的数据         	*/
      masterXfer.dataSize = 1;            	/* 写入数据长度1个字节	*/
  
      if(i2c_master_transfer(I2C1, &masterXfer))
          status=1;
          
      return status;
  }

unsigned char ap3216c_readonebyte(unsigned char addr,
unsigned char reg)
  {
      unsigned char val=0;
      
      struct i2c_transfer masterXfer; 
      masterXfer.slaveAddress = addr;   	/* 设备地址          	*/
      masterXfer.direction = kI2C_Read;	/* 读取数据            	*/
      masterXfer.subaddress = reg;       	/* 要读取的寄存器地址   	*/
      masterXfer.subaddressSize = 1;    	/* 地址长度一个字节    	*/
      masterXfer.data = &val;           	/* 接收数据缓冲区       	*/
      masterXfer.dataSize = 1;         	/* 读取数据长度1个字节	*/
      i2c_master_transfer(I2C1, &masterXfer);
  
      return val;
  }
 void ap3216c_readdata(unsigned short *ir, unsigned short *ps, unsigned short *als)
 {
     unsigned char buf[6];
     unsigned char i;
 
     /* 循环读取所有传感器数据 */
     for(i = 0; i < 6; i++)  
     {
         buf[i] = ap3216c_readonebyte(AP3216C_ADDR, 
AP3216C_IRDATALOW + i);  
     }
     
     if(buf[0] & 0X80)   	/* IR_OF位为1,则数据无效 	*/
         *ir = 0;                    
     else                	/* 读取IR传感器的数据  		*/
         *ir = ((unsigned short)buf[1] << 2) | (buf[0] & 0X03);          
     
     *als = ((unsigned short)buf[3] << 8) | buf[2];/* 读取ALS数据 */  
     
     if(buf[4] & 0x40)   	/* IR_OF位为1,则数据无效	*/
         *ps = 0;                                                        
     else                	/* 读取PS传感器的数据    */
         *ps = ((unsigned short)(buf[5] & 0X3F) << 4) | 
(buf[4] & 0X0F);     
 }

最后

以上就是热情苗条为你收集整理的I2C相关实验2的全部内容,希望文章能够帮你解决I2C相关实验2所遇到的程序开发问题。

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

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

评论列表共有 0 条评论

立即
投稿
返回
顶部