企业网站怎么做连接,做学历的网站,网站建设实训心得体会300字,apache创建WordPress参考#xff1a;I2C 总线协议详解 作者#xff1a;一只青木呀 发布时间#xff1a;2020-09-21 11:41:25 网址#xff1a;https://blog.csdn.net/weixin_45309916/article/details/108705297 目录I2C 简介I2C 协议I2C协议有关术语1、起始位2、停止位3、数据传输4、应答信号5… 参考I2C 总线协议详解 作者一只青木呀 发布时间2020-09-21 11:41:25 网址https://blog.csdn.net/weixin_45309916/article/details/108705297 目录I2C 简介I2C 协议I2C协议有关术语1、起始位2、停止位3、数据传输4、应答信号5、I2C 写时序主机向从机6、I2C 读时序主机向从机7、I2C 多字节读写时序I.MX6U I2C 简介AP3216C 简介硬件原理分析实验程序编写编译下载验证编写Makefile 和链接脚本编译下载I2C 是最常用的通信接口众多的传感器都会提供I2C 接口来和主控相连比如陀螺仪、加速度计、触摸屏等等。所以I2C 是做嵌入式开发必须掌握的I.MX6U 有4 个I2C 接口可以通过这4 个I2C 接口来连接一些I2C 外设。I.MX6U-ALPHA 使用I2C1 接口连接了一个距离传感器AP3216C本章我们就来学习如何使用I.MX6U 的I2C 接口来驱动AP3216C读取AP3216C 的传感器数据。 I2C 简介
I2C 是很常见的一种总线协议 I2C 是 NXP 公司设计的 I2C 使用两条线在主控制器和从机之间进行数据通信。一条是 SCL(串行时钟线)另外一条是 SDA(串行数据线)这两条数据线需要接上拉电阻总线空闲的时候 SCL 和 SDA 处于高电平。 I2C 总线标准模式下速度可以达到 100Kb/S快速模式下可以达到 400Kb/S。 I2C 总线工作是按照一定的协议来运行的接下来就看一下 I2C 协议。
I2C 协议
I2C 是支持多从机的也就是一个 I2C 控制器下可以挂多个 I2C 从设备这些不同的 I2C从设备有不同的器件地址这样 I2C 主控制器就可以通过 I2C 设备的器件地址访问指定的 I2C设备了一个 I2C 总线连接多个 I2C 设备如下图所示 上图中 SDA 和 SCL 这两根线必须要接一个上拉电阻一般是 4.7K。其余的 I2C 从器件都挂接到 SDA 和 SCL 这两根线上这样就可以通过 SDA 和 SCL 这两根线来访问多个 I2C设备。
I2C协议有关术语
1、起始位
顾名思义也就是 I2C 通信起始标志通过这个起始位就可以告诉 I2C 从机“我”要开始进行 I2C 通信了。在 SCL 为高电平的时候 SDA 出现下降沿就表示为起始位如下图所示
2、停止位
停止位就是停止 I2C 通信的标志位和起始位的功能相反。在 SCL 位高电平的时候 SDA出现上升沿就表示为停止位如下图所示
3、数据传输
I2C 总线在数据传输的时候要保证在 SCL 高电平期间 SDA 上的数据稳定因此 SDA 上的数据变化只能在 SCL 低电平期间发生如下图所示
4、应答信号
当 I2C 主机发送完 8 位数据以后会将 SDA 设置为输入状态等待 I2C 从机应答也就是等到 I2C 从机告诉主机它接收到数据了。应答信号是由从机发出的主机需要提供应答信号所需的时钟主机发送完 8 位数据以后紧跟着的一个时钟信号就是给应答信号使用的。从机通过将 SDA 拉低来表示发出应答信号表示通信成功否则表示通信失败。
5、I2C 写时序主机向从机
主机通过 I2C 总线与从机之间进行通信不外乎两个操作写和读 I2C 总线单字节写时序如下图所示 上图就是 I2C 写时序我们来看一下写时序的具体步骤
1)、开始信号。2)、发送 I2C 设备地址每个 I2C 器件都有一个设备地址通过发送具体的设备地址来决定访问哪个 I2C 器件。这是一个 8 位的数据其中高 7 位是设备地址最后 1 位是读写位为1 的话表示这是一个读操作为 0 的话表示这是一个写操作。3)、 I2C 器件地址后面跟着一个读写位为 0 表示写操作为 1 表示读操作。4)、从机发送的 ACK 应答信号。5)、重新发送开始信号。6)、发送要写写入数据的寄存器地址。7)、从机发送的 ACK 应答信号8)、发送要写入寄存器的数据。9)、从机发送的 ACK 应答信号。10)、停止信号。
6、I2C 读时序主机向从机
I2C 总线单字节读时序如下图所示 I2C 单字节读时序比写时序要复杂一点读时序分为 4 大步第一步是发送设备地址第二步是发送要读取的寄存器地址第三步重新发送设备地址最后一步就是 I2C 从器件输出要读取的寄存器值我们具体来看一下这步。
1)、主机发送起始信号。2)、主机发送要读取的 I2C 从设备地址。3)、读写控制位因为是向 I2C 从设备发送数据因此是写信号。4)、从机发送的 ACK 应答信号。5)、重新发送 START 信号。6)、主机发送要读取的寄存器地址。7)、从机发送的 ACK 应答信号。8)、重新发送 START 信号。9)、重新发送要读取的 I2C 从设备地址。10)、读写控制位这里是读信号表示接下来是从 I2C 从设备里面读取数据。11)、从机发送的 ACK 应答信号。12)、从 I2C 器件里面读取到的数据。13)、主机发出 NO ACK 信号表示读取完成不需要从机再发送 ACK 信号了。14)、主机发出 STOP 信号停止 I2C 通信。
7、I2C 多字节读写时序
有时候我们需要读写多个字节多字节读写时序和单字节的基本一致只是在读写数据的时候可以连续发送多个自己的数据其他的控制时序都是和单字节一样的。
I.MX6U I2C 简介
I.MX6U 提供了4 个I2C 外设通过这四个I2C 外设即可完成与I2C 从器件进行通信I.MX6U 的I2C 外设特性如下
①、与标准I2C 总线兼容。 ②、多主机运行 ③、软件可编程的64 中不同的串行时钟序列。 ④、软件可选择的应答位。 ⑤、开始/结束信号生成和检测。 ⑥、重复开始信号生成。 ⑦、确认位生成。 ⑧、总线忙检测
I.MX6U 的I2C 支持两种模式标准模式和快速模式标准模式下I2C 数据传输速率最高是100Kbits/s在快速模式下数据传输速率最高为400Kbits/s。
我们接下来看一下I2C 的几个重要的寄存器首先看一下I2Cx_IADR(x1~4)寄存器这是I2C 的地址寄存器此寄存器结构如图26.1.2.1 所示 寄存器I2Cx_IADR 只有ADR(bit7:1)位有效用来保存I2C 从设备地址数据。当我们要访问某个I2C 从设备的时候就需要将其设备地址写入到ADR 里面。接下来看一下寄存器I2Cx_IFDR这个是I2C 的分频寄存器寄存器结构如图26.1.2.2 所示 寄存器I2Cx_IFDR 也只有IC(bit5:0)这个位用来设置I2C 的波特率I2C 的时钟源可以选择IPG_CLK_ROOT66MHz通过设置IC 位既可以得到想要的I2C 波特率。IC 位可选的设置如图26.1.2.3 所示 不像其他外设的分频设置一样可以随意设置图26.1.2.3 中列出了IC 的所有可选值。比如现在I2C 的时钟源为66MHz我们要设置I2C 的波特率为100KHz那么IC 就可以设置为0X15也就是640 分频。66000000/640103.125KHz≈100KHz。
接下来看一下寄存器I2Cx_I2CR这个是I2C 控制寄存器此寄存器结构如图26.1.2.4 所示 寄存器I2Cx_I2CR 的各位含义如下
IEN(bit7)I2C 使能位为1 的时候使能I2C为0 的时候关闭I2C。
IIEN(bit6)I2C 中断使能位为1 的时候使能I2C 中断为0 的时候关闭I2C 中断。
MSTA(bit5)主从模式选择位设置IIC 工作在主模式还是从模式为1 的时候工作在主模式为0 的时候工作在从模式。
MTX(bit4)传输方向选择位用来设置是进行发送还是接收为0 的时候是接收为1 的时候是发送。
TXAK(bit3)传输应答位使能为0 的话发送ACK 信号为1 的话发送NO ACK 信号。
RSTA(bit2)重复开始信号为1 的话产生一个重新开始信号。
接下来看一下寄存器I2Cx_I2SR这个是I2C 的状态寄存器寄存器结构如图26.1.2.5 所示
寄存器I2Cx_I2SR 的各位含义如下
ICF(bit7)数据传输状态位为0 的时候表示数据正在传输为1 的时候表示数据传输完成。
IAAS(bit6)当为1 的时候表示I2C 地址也就是I2Cx_IADR 寄存器中的地址是从设备地址。
IBB(bit5)I2C 总线忙标志位当为0 的时候表示I2C 总线空闲为1 的时候表示I2C 总线忙。
IAL(bit4)仲裁丢失位为1 的时候表示发生仲裁丢失。
SRW(bit2)从机读写状态位当I2C 作为从机的时候使用此位用来表明主机发送给从机的是读还是写命令。为0 的时候表示主机要向从机写数据为1 的时候表示主机要从从机读取数据。
IIF(bit1)I2C 中断挂起标志位当为1 的时候表示有中断挂起此位需要软件清零。
RXAK(bit0)应答信号标志位为0 的时候表示接收到ACK 应答信号为1 的话表示检测到NO ACK 信号。
最后一个寄存器就是I2Cx_I2DR这是I2C 的数据寄存器此寄存器只有低8 位有效当要发送数据的时候将要发送的数据写入到此寄存器如果要接收数据的话直接读取此寄存器即可得到接收到的数据。
关于I2C 的寄存器就介绍到这里关于这些寄存器详细的描述请参考《I.MX6ULL 参考手册》第1462 页的31.7 小节。
AP3216C 简介
I.MX6U-ALPHA 开发板上通过I2C1 连接了一个三合一环境传感器AP3216CAP3216C是由敦南科技推出的一款传感器其支持环境光强度(ALS)、接近距离(PS)和红外线强度(IR)这三个环境参数检测。该芯片可以通过IIC 接口与主控制相连并且支持中断AP3216C 的特点如下
①、I2C 接口快速模式下波特率可以到400Kbit/S ②、多种工作模式选择ALS、PSIR、ALSPSIR、PD 等等。 ③、内建温度补偿电路。 ④、宽工作温度范围(-30°C ~ 80°C)。 ⑤、超小封装4.1mm x 2.4mm x 1.35mm ⑥、环境光传感器具有16 位分辨率。 ⑦、接近传感器和红外传感器具有10 位分辨率。
AP3216C 常被用于手机、平板、导航设备等其内置的接近传感器可以用于检测是否有物体接近比如手机上用来检测耳朵是否接触听筒如果检测到的话就表示正在打电话手机就会关闭手机屏幕以省电。也可以使用环境光传感器检测光照强度可以实现自动背光亮度调节。 AP3216C 结构如图26.1.3.1 所示 AP3216 的设备地址为0X1E同几乎所有的I2C 从器件一样AP3216C 内部也有一些寄存器通过这些寄存器我们可以配置AP3216C 的工作模式并且读取相应的数据。AP3216C 我们用的寄存器如表26.1.3.1 所示
在表26.1.3.1 中0X00 这个寄存器是模式控制寄存器用来设置AP3216C 的工作模式一般开始先将其设置为0X04也就是先软件复位一次AP3216C。接下来根据实际使用情况选择合适的工作模式比如设置为0X03也就是开启ALSPSIR。从0X0A~0X0F 这6 个寄存器就是数据寄存器保存着ALS、PS 和IR 这三个传感器获取到的数据值。如果同时打开ALS、PS 和IR 则读取间隔最少要112.5ms因为AP3216C 完成一次转换需要112.5ms。关于AP3216C的介绍就到这里如果要想详细的研究此芯片的话请大家自行查阅其数据手册。
本章实验中我们通过I.MX6U 的I2C1 来读取AP3216C 内部的ALS、PS 和IR 这三个传感器的值并且在LCD 上显示。开机会先检测AP3216C 是否存在一般的芯片是有个ID 寄存器通过读取ID 寄存器判断ID 是否正确就可以检测芯片是否存在。但是AP3216C 没有ID 寄存器所以我们就通过向寄存器0X00 写入一个值然后再读取0X00 寄存器判断读出得到值和写入的是否相等如果相等就表示AP3216C 存在否则的话AP3216C 就不存在。本章的配置步骤如下
1、初始化相应的IO 初始化I2C1 相应的IO设置其复用功能如果要使用AP3216C 中断功能的话还需要设置AP3216C 的中断IO。 2、初始化I2C1 初始化I2C1 接口设置波特率。 3、初始化AP3216C 初始化AP3216C读取AP3216C 的数据。
硬件原理分析
本试验用到的资源如下 ①、指示灯LED0。 ②、RGB LCD 屏幕。 ③、AP3216C ④、串口
AP3216C 是在I.MX6U-ALPHA 开发板底板上原理图如图26.2.1 所示 从图26.2.1 可以看出AP3216C 使用的是I2C1其中I2C1_SCL 使用的UART4_TXD 这个IO、I2C1_SDA 使用的是UART4_R XD 这个IO。
实验程序编写
本实验对应的例程路径为开发板光盘- 1、裸机例程- 17_i2c。
本章实验在上一章例程的基础上完成更改工程名字为“ap3216c”然后在bsp 文件夹下创建名为“i2c”和“ap3216c”的文件夹。在bsp/i2c 中新建bsp_i2c.c 和bsp_i2c.h 这两个文件在bsp/ap3216c 中新建bsp_ap3216c.c 和bsp_ap3216c.h 这两个文件。bsp_i2c.c 和bsp_i2c.h 是I.MX6U 的I2C 文件bsp_ap3216c.c 和bsp_ap3216c.h 是AP3216C 的驱动文件。在sp_i2c.h 中输入如下内容
1 #ifndef _BSP_I2C_H
2 #define _BSP_I2C_H
3 /***************************************************************
4 Copyright © zuozhongkai Co., Ltd. 1998-2019. All rights reserved.
5 文件名: bsp_i2c.h
6 作者: 左忠凯
7 版本: V1.0
8 描述: IIC驱动文件。
9 其他: 无
10 论坛: www.openedv.com
11 日志: 初版V1.0 2019/1/15 左忠凯创建
12 ***************************************************************/
13 #include imx6ul.h
14
15 /* 相关宏定义*/
16 #define I2C_STATUS_OK (0)
第16 到22 行定义了一些I2C 状态相关的宏。第27 到31 行定义了一个枚举类型i2c_direction此枚举类型用来表示I2C 主机对从机的操作也就是读数据还是写数据。第36 到44 行定义了一个结构体i2c_transfer此结构体用于I2C 的数据传输。剩下的就是一些函数声明了总体来说bsp_i2c.h 文件里面的内容还是很简单的。接下来在文件bsp_i2c.c 里面输入如下内容
/***************************************************************
Copyright © zuozhongkai Co., Ltd. 1998-2019. All rights reserved.
文件名: bsp_i2c.c
作者: 左忠凯
版本: V1.0
描述: IIC驱动文件。
其他: 无
论坛: www.openedv.com
日志: 初版V1.0 2019/1/15 左忠凯创建
***************************************************************/
1 #include bsp_i2c.h
2 #include bsp_delay.h
3 #include stdio.h
4
5 /*
6 * description : 初始化I2C波特率100KHZ
7 * param – base : 要初始文件bsp_i2c.c中一共有8 个函数我们依次来看一下这些函数的功能首先是函数i2c_init此函数用来初始化I2C重点是设置I2C 的波特率初始化完成以后开启I2C。第2 个函数是i2c_master_repeated_start此函数用来发送一个重复开始信号发送开始信号的时候也会顺带发送从设备地址。第3 个函数是i2c_master_start此函数用于发送一个开始信号发送开始信号 的时候也顺带发送从设备地址。第4 个函数是i2c_check_and_clear_error此函数用于检查并清除错误。第5 个函数是i2c_master_stop用于产生一个停止信号。第6 和第7 个函数分别为i2c_master_write 和i2c_master_read这两个函数分别用于完成向I2C 从设备写数据和从I2C 从设备读数据。最后一个函数是i2c_master_transfer此函数就是用户最终调用的用于完成I2C 通信的函数此函数会使用前面的函数拼凑出I2C 读/写时序。此函数就是按照26.1.1 小节讲解的I2C 读写时序来编写的。
I2C 的操作函数已经准备好了接下来就是使用前面编写I2C 操作函数来配置AP3216C 了配置完成以后就可以读取AP3216C 里面的传感器数据在bsp_ap3216c.h 输入如下所示内容
1 #ifndef _BSP_AP3216C_H
2 #define _BSP_AP3216C_H
第15 到26 行定义了一些宏分别为AP3216C 的设备地址和寄存器地址剩下的就是函数声明。接下来在bsp_ap3216c.c 中输入如下所示内容
/***************************************************************
Copyright © zuozhongkai Co., Ltd. 1998-2019. All rights reserved.
文件名: bsp_ap3216c.c
作者: 左忠凯
文件bsp_ap3216c.c 里面共有4 个函数第1 个函数是ap3216c_init顾名思义此函数用于初始化AP3216C初始化成功的话返回0如果初始化失败就返回其他值。此函数先初始化所使用到的IO比如初始化I2C1 的相关IO并设置其复用为I2C1。然后此函数会调用i2c_init来初始化I2C1最后初始化AP3216C。第2 个和第3 个函数分别为ap3216c_writeonebyte 和 ap3216c_readonebyte这两个函数分别是向AP3216C 写入数据和从AP3216C 读取数据。这两个函数都通过调用bsp_i2c.c 中的函数i2c_master_transfer 来完成对AP3216C 的读写。最后一个函数就是ap3216c_readdata此函数用于读取AP3216C 中的ALS、PS 和IR 传感器数据。
最后在main.c 中输入如下代码
/**************************************************************
Copyright © zuozhongkai Co., Ltd. 1998-2019. All rights reserved.
文件名: main.c
作者: 左忠凯
版本: V1.0
描述: I.MX6U开发板裸机实验18 IIC实验
其他: IIC是最常用的接口ALPHA开发板上有多个IIC外设本实验就
来学习如何驱动I.MX6U的IIC接口并且通过IIC接口读取板载
AP3216C的数据值。
论坛: www.openedv.com
日志: 初版V1.0 2019/1/15 左忠凯创建
**************************************************************/
1 #include bsp_clk.h
2 #include bsp_delay.h
3 #include bsp_led.h
4 #include bsp_beep.h
5 #include bsp_key.h
6 #include bsp_int.h
7 #include bsp_uart.h
8 #include bsp_lcd.h
9 #include bsp_rtc.h
10 #include bsp_ap3216c.h
11 #include stdio.h
12
13 /*
14 * description : main函数
15 * param : 无
16 * return : 无
第38 行调用ap3216c_init 来初始化AP3216C如果AP3216C 初始化失败的话就会进入循环会在LCD 上不断的闪烁字符串“AP3216C Check Failed!”和“Please Check!”直到AP3216C初始化成功。
第53 行调用函数ap3216c_readdata 来获取AP3216C 的ALS、PS 和IR 传感器数据值获取完成以后就会在LCD 上显示出来。
文件main.c 里面的内容总体上还是很简单的实验程序的编写就到这里。
编译下载验证
编写Makefile 和链接脚本
修改Makefile 中的TARGET 为ap3216c然后在在INCDIRS 和SRCDIRS 中加入“bsp/i2c”和“bsp/ap3216c”修改后的Makefile 如下
1 CROSS_COMPILE ? arm-linux-gnueabihf-
2 TARGET ? ap3216c
3
4 /* 省略掉其它代码...... */
5
6 INCDIRS : imx6ul \
7 stdio/in第2 行修改变量TARGET 为“ap3216c”也就是目标名称为“ap3216c”。
第21 和22 行在变量INCDIRS 中添加I2C 和AP3216C 的驱动头文件(.h)路径。
第39 和40 行在变量SRCDIRS 中添加I2C 和AP3216C 驱动文件(.c)路径。 链接脚本保持不变。
编译下载
使用Make 命令编译代码编译成功以后使用软件imxdownload 将编译完成的ap3216c.bin文件下载到SD 卡中命令如下
chmod 777 imxdownload //给予imxdownload 可执行权限一次即可
./imxdownload ap3216c.bin /dev/sdd //烧写到SD 卡中不能烧写到/dev/sda 或sda1 里面烧写成功以后将SD 卡插到开发板的SD 卡槽中然后复位开发板。程序运行以后LCD界面如图26.4.2.1 所示 图26.4.2.1 中显示出了AP3216C 的三个传感器的数据大家可以用手遮住或者靠近AP3216CLCD 上的三个数据就会变化。