IIC总线驱动
Linux下I2C驱动介绍
1、I2C概述I2C是philips公司提供的外设总线,I2C有两条数据线,一条是串行数据线SDA、一条是时钟线SCL,使用SDA和SCL实现了数据的交换,便于布线。
I2C总线方便用在EEPROM、实时钟、小型LCD等与CPU外部的接口上。
2、Linux下的驱动思路Linux系统下编写I2c驱动主要有两种方法:一种是把I2C当做普通字符设备来使用;另一种利用Linux下驱动的体系结构来实现。
第一种方法:优点:思路比较直接,不用花费大量时间去了解Linux系统下I2C体系结构缺点:不仅对I2C设备操作要了解,还有了解I2C的适配器操作不仅对I2C设备器和设备操作需要了解,编写的驱动移植性差,内核提供的I2C设备器都没有用上。
第二种方法:第一种的优点就是第二种的缺点,第一种的缺点就是第二种的优点。
3、I2C框架概述Linux的I2C体系结构分为3部分:1)I2C核心I2C核心提供了I2C总线驱动和设备驱动的注册和注销的方法,I2C 通信方法(algorithm)上层,与具体适配器无关的代码,检测设备上层的代码等。
2)I2C总线驱动I2C总线驱动是对I2C硬件体系结构中适配器端的实现,适配器可以直接受CPU来控制。
3)I2C设备驱动I2C设备驱动是对I2C硬件体系结构中设备端的实现,设备端挂在受CPU控制的适配器上,通过I2C适配器与CPU交换数据。
Linux下的I2C体系结构:1)Linux下的I2C体系结构4、I2C设备驱动编写方法首先让我们明白适配器驱动的作用是让我们能够通过它发出标准的I2C时序,在linux内核源代码中driver/I2C/buss包含一些适配器的驱动,例如s3c2410的驱动I2C-s3c2410.c,适配器被加载到内核中,接下的任务就是实现设备驱动的编写。
编写设备驱动的方法主要分为两种方法:第一种:利用设备提供的I2C-dev.c来实现I2C适配器设备文件,然后通过上层应用程序来操作I2C设备器来控制I2C设备。
详细讲解RT-Thread I2C设备驱动框架及相关函数
详细讲解RT-Thread I2C设备驱动框架及相关函数本应用笔记以驱动I2C接口的6轴传感器MPU6050为例,说明了如何使用I2C设备驱动接口开发应用程序,并详细讲解了RT-Thread I2C设备驱动框架及相关函数。
1 本文的目的和结构1.1 本文的目的和背景I2C(或写作i2c、IIC、iic)总线是由Philips公司开发的一种简单、双向二线制(时钟SCL、数据SDA)同步串行总线。
它只需要两根线即可在连接于总线上的器件之间传送信息,是半导体芯片使用最为广泛的通信接口之一。
RT-Thread中引入了I2C设备驱动框架,I2C 设备驱动框架提供了基于GPIO模拟和硬件控制器的2种底层硬件接口。
1.2 本文的结构本文首先描述了RT-Thread I2C设备驱动框架的基本情况,然后详细描述了I2C设备驱动接口,并使用I2C设备驱动接口编写MPU6050的驱动程序,并给出了在正点原子STM32F4探索者开发板上验证的代码示例。
2 I2C设备驱动框架简介在使用MCU进行项目开发的时候,往往需要用到I2C总线。
一般来说,MCU带有I2C 控制器(硬件I2C),也可以使用MCU的2个GPIO自行编写程序模拟I2C总线协议实现同样的功能。
RT-Thread提供了一套I/O设备管理框架,它把I/O设备分成了三层进行处理:应用层、I/O 设备管理层、底层驱动。
I/O设备管理框架给上层应用提供了统一的设备操作接口和I2C 设备驱动接口,给下层提供的是底层驱动接口。
应用程序通过I/O设备模块提供的标准接口访问底层设备,底层设备的变更不会对上层应用产生影响,这种方式使得应用程序具有很好的可移植性,应用程序可以很方便的从一个MCU移植到另外一个MCU。
本文以6轴惯性传感器MPU6050为例,使用RT-Thread I2C设备驱动框架提供的GPIO模拟I2C控制器的方式,阐述了应用程序如何使用I2C设备驱动接口访问I2C设备。
防止gpio模拟iic驱动被其他线程打断的方法
防止gpio模拟iic驱动被其他线程打断的方法防止GPIO模拟I2C驱动在多线程环境下被打断是一个重要的问题。
在这篇文章中,我将介绍一些方法来解决这个问题,以确保GPIO模拟I2C驱动的稳定性和可靠性。
首先,让我们了解一下什么是GPIO和I2C。
GPIO是通用输入输出端口,它可以用来控制外部设备或读取外部设备的状态。
而I2C是一种通信协议,它可以用于连接和控制多个设备,通过两根线进行数据传输。
在使用GPIO模拟I2C驱动时,我们需要保证驱动程序能够正确地处理并发访问和时序要求。
为了实现这一点,我们可以采取以下几个步骤:1. 锁定访问:在GPIO模拟I2C驱动中,我们可以使用信号量或互斥锁来实现对共享资源的访问控制。
当一个线程访问I2C总线时,它可以获得锁,阻止其他线程同时访问。
2. 设置优先级:在多线程环境中,我们可以通过设置线程的优先级来控制它们的执行顺序。
将GPIO模拟I2C驱动的线程设置为较高的优先级,可以确保它能够及时地响应,并且不会被低优先级的线程打断。
3. 中断处理:在一些特殊情况下,我们可能需要使用中断来处理GPIO模拟I2C驱动的数据请求。
通过配置中断处理程序,我们可以在需要时及时响应外部设备的请求,而不会被其他线程的操作打断。
4. 错误处理:在GPIO模拟I2C驱动中,我们应该实现错误处理机制,以便在发生错误时进行适当的处理。
例如,在发送或接收数据时发生错误,我们可以采取一些补救措施,如重新发送或重新接收数据,以确保数据的可靠性。
综上所述,要防止GPIO模拟I2C驱动在多线程环境下被打断,我们可以采取一系列的措施来确保驱动程序的稳定性和可靠性。
通过锁定访问、设置优先级、中断处理和错误处理等方法,我们可以保证GPIO模拟I2C驱动能够正确地处理并发访问和时序要求,从而实现可靠的数据传输和外设控制。
希望本文能够对需要实现GPIO模拟I2C驱动的开发者有所帮助,并能够在实际应用中发挥指导作用。
单片机 iic 电路接led
单片机 iic 电路接led单片机(Microcontroller)是一种集成电路芯片,具有处理器核心、存储器和各种输入/输出接口。
其中,IIC(Inter-Integrated Circuit)是一种串行通信接口,常用于连接单片机与外部设备进行数据交互。
本文将介绍如何使用单片机的IIC接口来驱动LED灯。
一、LED简介LED(Light Emitting Diode)是一种半导体器件,具有发光特性。
它具有低功耗、长寿命、抗震动等优点,广泛应用于各种电子设备中。
在本文中,我们将使用单片机的IIC接口来控制LED灯的亮灭。
二、IIC接口简介IIC接口是一种双线制的串行总线接口,由SCL(串行时钟线)和SDA(串行数据线)组成。
它具有简单、稳定、可靠的特点,适合于短距离数据传输。
在使用IIC接口前,需要在单片机中配置相应的硬件和软件来实现通信。
三、硬件电路设计我们需要准备一个LED灯和一个适配器,将LED灯的正极连接到单片机的VCC引脚,负极连接到单片机的GND引脚。
然后,将IIC 接口的SCL引脚连接到单片机的SCL引脚,SDA引脚连接到单片机的SDA引脚。
最后,给单片机供电,确保电路连接正确。
四、软件程序设计在软件程序设计中,我们需要使用单片机的编程语言来实现对IIC 接口的控制。
以下是一个示例程序,演示了如何通过IIC接口控制LED灯的亮灭。
```c#include <Wire.h>#define LED_ADDRESS 0x27 // LED设备的地址void setup(){Wire.begin(); // 初始化IIC接口}void loop(){// 向LED设备发送控制命令Wire.beginTransmission(LED_ADDRESS);Wire.write(0x01); // 发送控制命令,使LED灯亮起Wire.endTransmission();delay(1000); // 延时1秒// 向LED设备发送控制命令Wire.beginTransmission(LED_ADDRESS);Wire.write(0x00); // 发送控制命令,使LED灯熄灭Wire.endTransmission();delay(1000); // 延时1秒}```在上述程序中,我们使用了Wire库来操作IIC接口。
TI-I2C驱动
TI-I2C驱动一、与I2C驱动相关的文件分成两部分:1)应用层接口部分:程序在svn中的路径如下:在https://dareglob-971006/svn/eocOS/branches/eocOS_v4/branches/bsp/user/i2c目录下,i2ctest.c文件,提供了lm75a_temp_read()方法,用来读取LM75A设备温度寄存器中的温度信息的功能。
2)内核驱动部分:内核位于svn中的路径如下:https://dareglob-971006/svn/eocOS/branches/eocOS_v4/branches/bsp/kernel(1)总线驱动:i2c-davinci.c:在内核目录中driver/i2c/busses目录下,适用于TI的I2C总线驱动程序。
I2C总线驱动是对I2C硬件体系结构中适配器端的实现。
(2)I2C驱动代码核心:i2c-core.c:在内核目录中driver/i2c/目录下,是I2C代码的核心,用于沟通虚拟文件系统与底层实现。
该文件提供了I2C总线驱动和设备驱动的注册、注销方法,I2C通信方法上层的、与具体适配器无关的代码以及探测设备、检测设备地址的上层代码等。
(3)I2C设备驱动:lm75.c:在内核目录中driver/hwmon目录下,是针对LM75A以及其他能兼容的温度传感器的设备驱动。
I2C设备驱动是对I2C硬件体系结构中设备端的实现,设备一般挂接在受CPU控制的I2C适配器上,通过I2C适配器与CPU交换数据。
二、I2C简要工作流程1)在总线驱动初始化时候,当通过Linux内核源代码/driver/base/platform.c文件中定义platform_driver_register()函数注册platform_driver结构体时,其中probe指针指向的davinci_i2c_probe()函数将被调用,以初始化适配器硬件。
2)而davinci_i2c_remove()函数则完成与davinci_i2c_probe()相反的功能。
iic总线工作原理(iic总线)
IIC总线工作原理1. 概述IIC(Inter-Integrated Circuit)总线是一种用于连接微控制器和外部设备的串行通信接口。
它由飞利浦公司(现在的恩智浦半导体公司)在1982年开发,并被广泛应用于各种电子设备中。
IIC总线具有简单、灵活、高效的特点,适用于连接各种不同类型的芯片和传感器。
2. IIC总线结构IIC总线由两根信号线组成:SDA(Serial Data Line,串行数据线)和SCL(Serial Clock Line,串行时钟线)。
SDA用于数据传输,而SCL用于同步传输。
3. IIC总线基本原理IIC总线采用主从式结构,在总线上有一个主设备(Master)和一个或多个从设备(Slave)。
主设备负责发起并控制通信过程,而从设备则被动地接受和响应主设备的命令。
3.1 主从式通信在IIC总线上进行通信时,主设备负责生成时钟信号,并通过SDA发送数据。
从设备则根据主设备提供的时钟信号进行数据读取或写入操作。
3.2 起始条件和停止条件为了确保通信的可靠性,IIC总线在数据传输前需要进行起始条件(Start Condition)和停止条件(Stop Condition)的设置。
•起始条件:主设备将SCL线保持高电平的同时,将SDA线由高电平拉低。
这个过程表示通信即将开始,从设备准备好接收数据。
•停止条件:主设备将SCL线保持高电平的同时,将SDA线由低电平拉高。
这个过程表示通信结束,从设备可以终止数据传输。
3.3 时钟同步IIC总线使用时钟同步方式进行数据传输。
主设备通过在SCL线上产生时钟脉冲来驱动数据传输。
每个时钟周期内,主设备和从设备在SDA上读取或写入一个比特位的数据。
3.4 数据帧格式IIC总线采用帧格式进行数据传输,每个帧由一个起始位、8个数据位和一个确认位组成。
起始位指示数据传输的开始,而确认位用于检测通信是否成功。
3.5 主从设备地址为了区分不同的从设备,IIC总线使用7位或10位地址对它们进行编号。
对IIC总线的理解、调用函数以及常见面试问题
对IIC总线的理解、调⽤函数以及常见⾯试问题⼀、IIC 总线概述:IIC 即Inter-Integrated Circuit(集成电路总线)I2C总线是PHLIPS公司推出的⼀种串⾏总线, I2C总线只有两根双向信号线。
⼀根是数据线SDA,另⼀根是时钟线SCL。
每个接到I2C总线上的器件都有唯⼀的地址。
主机与其它器件间的数据传送可以是由主机发送数据到其它器件,这时主机即为发送器。
由总线上接收数据的器件则为接收器。
⼆、IIC 总线通信协议:要掌握IIC的通信协议,需要掌握以下6个通信信号:1.起始信号2.终⽌信号3.写数据4.读数据5.应答信号6.⾮应答信号起始和终⽌信号SCL线为⾼电平期间,SDA线由⾼电平向低电平的变化表⽰起始信号;SCL线为⾼电平期间,SDA线由低电平向⾼电平的变化表⽰终⽌信号。
应答信号IIC 总线协议规定,每传送⼀个字节数据后,都要有⼀个应答信号以确定数据传送是否被对⽅收到。
应答信号由接受设备产⽣,在SCL为⾼电平期间,接受设备将SDA拉低为低电平,表⽰数据传输正确,产⽣应答(ACK)数据传送I2C总线进⾏数据传送时,时钟信号为⾼电平期间,数据线上的数据必须保持稳定,只有在时钟线上的信号为低电平期间,数据线上的⾼电平或低电平状态才允许变化。
根据AT24C02的芯⽚,可编写以下信号函数程序://1.起始信号 SCL线为⾼电平期间,SDA线由⾼电平向低电平的变化表⽰起始信号;void IIC_Start(void){SDA = 1;SCL = 1;delay_us(1); //15us >> 4.7usSDA = 0;delay_us(1);SCL = 0;}//2.终⽌信号 SCL线为⾼电平期间,SDA线由低电平向⾼电平的变化表⽰终⽌信号。
void IIC_Stop(void){SDA = 0;SCL = 1;delay_us(1); //15us >> 4.7usSDA = 1;delay_us(1);SCL = 0;}void IIC_SendByte(unsigned char dat) //3.写数据{unsigned char i;for (i = 0; i < 8; i++){if((dat<<i)&0x80)SDA = 1;}else{SDA = 0;}SCL = 1; //开始让数据维持稳定delay_us(1);SCL = 0;delay_us(1);}SDA = 1; //释放总线,发送完8位,主机置⾼电平SCL = 1;delay_us(1);if (SDA) //SDA 低电平从机回馈低电平{ack = 0; //0 == ack 代表⽆ack信号,从机不应答,发送不成功}else{ack = 1; //从机应答,发送成功}SCL = 0;delay_us(5);}unsigned char IIC_RecvByte(void) //4. 读数据{unsigned char i, temp;SDA = 1; //保险⾼的与上低的是低的,线与for (i = 0; i < 8; i++){SCL = 0; // 告诉数据可以变化 SDA 脉冲线//只有在时钟线上的信号为低电平期间,数据线上的⾼电平或低电平状态才允许变化。
有关于iic以及ds18b20驱动的解读
有关于iic以及ds18b20驱动的解读对于任何一个芯片的使用都离不开对芯片手册的解读,手册中的时序图以及协议必须完全的知晓,才能将芯片正确的使用起来:首先来了解一下使用iic协议的比较常见的AT24C02 这款芯片:通过手册我们可以知道:这款芯片有A0、A1、A2着三个地址管脚,将这三个管脚任意的接上VCC或者是GND都可以构成这款芯片的序列号、在实际的使用中就能够通过总线来进行寻址,然后发送地址,就能对应某一个芯片,并且由此可知,总线上最多可以连接8个这样的芯片,只要改变管脚的三个地址位,就能轻松实现对不同的芯片的控制。
芯片上除了这三个地址管脚之外还有一个WP,是用来写保护的,当这个管脚上是高电平的时候,是没有办法将我们所要的数据写进这款芯片中的,只有当它为低电平的时候才能对这款芯片进行操作。
正常情况下,在使用的时候都是通过硬件电路直接将这个管脚连在GND上。
还有就是Vcc跟Vss分别接上+5V和地,SDA和SCL分别是我们这款芯片的数据位和时钟位,也是我们操作这款芯片的重点。
根据手册的解读,我们可以了解到在时钟线为高电平的时候,数据线要保持不变,如果数据线在时钟线高电平期间,由高电平变为低电平,说明了iic总线协议的开始,如果由低电平变为高电平时,说明了总线协议的结束。
在时钟线为低电平的时候才允许数据线进行跳变并进行传输数据。
在解读时序图的时候底下着两张图很重要。
因为这两张图包含了在写时序图当中的一点细节。
如果这些细节没有处理好的话就会出现芯片不会正常工作的状况。
接下类介绍各个驱动的书写和处理:1、起始信号:由上面的时间表查出来的时间显示,起始信号建立的时间至少是4.7us。
因为时序图是完全按照现实的时间走向画出来的,所以从左向右可以想象成是一个时间轴。
然后看上面这张起始信号的图有可以知道,显示SCL由低电平变为高电平然后保持至少4us的时间。
SDA才开始由高电平变为低电平,在低电平的这段时间查表就可知,这个起始信号保持的时间至少是4us。
Linux I2C设备驱动编写
Linux I2C设备驱动编写(一)在Linux驱动中I2C系统中主要包含以下几个成员:如果一个I2C适配器不支持I2C通道,那么就将master_xfer成员设为NULL。
如果适配器支持SMBUS 协议,那么需要去实现smbus_xfer,如果smbus_xfer指针被设为NULL,那么当使用SMBUS协议的时候将会通过I2C通道进行仿真。
master_xfer指向的函数的返回值应该是已经成功处理的消息数,或者返回负数表示出错了。
functionality指针很简单,告诉询问着这个I2C主控器都支持什么功能。
在内核的drivers/i2c/i2c-stub.c中实现了一个i2c adapter的例子,其中实现的是更为复杂的SMBUS。
SMBus 与I2C的区别通常情况下,I2C和SMBus是兼容的,但是还是有些微妙的区别的。
时钟速度对比:在电气特性上他们也有所不同,SMBus要求的电压范围更低。
I2C driver具体的I2C设备驱动,如相机、传感器、触摸屏、背光控制器常见硬件设备大多都有或都是通过I2C 协议与主机进行数据传输、控制。
结构体如下:如同普通设备的驱动能够驱动多个设备一样,一个I2C driver也可以对应多个I2C client。
以重力传感器AXLL34X为例,其实现的I2C驱动为:这里要说明一下module_i2c_driver宏定义(i2c.h):module_driver():理解上述宏定义后,将module_i2c_driver(adxl34x_driver)展开就可以得到:这一句宏就解决了模块module安装卸载的复杂代码。
这样驱动开发者在实现I2C驱动时只要将i2c_driver结构体填充进来就可以了,无需关心设备的注册与反注册过程。
I2C client即I2C设备。
I2C设备的注册一般在板级代码中,在解析实例前还是先熟悉几个定义:下面还是以adxl34x为例:这样ADXL34X的i2c设备就被注册到了系统中,当名字与i2c_driver中的id_table中的成员匹配时就能够出发probe匹配函数了。
iic总线的工作原理
iiC总线的工作原理一、架构和拓扑IIC总线是一种串行总线,由一根双向数据线(SDA)和一根时钟线(SCL)组成。
IIC总线采用主从模式,其中主设备负责控制总线的操作,从设备则根据主设备的指令进行相应的操作。
IIC总线的拓扑结构非常简单,可以连接多个从设备,并且从设备之间没有直接的通信关系。
二、线路和电气特性1. SDA和SCL线路:IIC总线的SDA和SCL线路都是双向的,它们可以作为数据线或时钟线使用。
在空闲状态下,SDA和SCL线路都处于高电平状态。
2. 电压范围:IIC总线的电压范围为3.6V至5.5V,符合低功耗系统的要求。
3. 驱动能力:IIC总线的驱动能力较强,可以驱动多个从设备。
4. 传输速率:IIC总线的传输速率可以调整,通常为100kHz、400kHz 或1MHz。
三、寻址方式1. 寻址地址:IIC总线的寻址地址由7位二进制数字组成,可以标识从设备的地址。
每个从设备的地址都是唯一的,由硬件厂商设定。
2. 寻址过程:当主设备需要与某个从设备通信时,它会发送一个寻址信号,其中包含从设备的地址。
从设备接收到寻址信号后,会根据自己的地址与主设备发送的地址进行比较,如果匹配,则从设备会响应主设备的请求,进行相应的操作。
3. 响应信号:从设备在接收到寻址信号后,会发送一个响应信号给主设备,表示自己已经准备好接收或发送数据。
响应信号由一个低电平脉冲组成,其宽度为时钟周期的2倍。
4. 数据传输:在寻址和响应信号之后,主设备和从设备之间就可以进行数据传输了。
数据传输采用串行方式,每次传输一个字节的数据。
在数据传输过程中,SDA线路用于传输数据,SCL线路用于传输时钟信号。
数据传输完成后,主设备会发送一个停止信号,表示数据传输结束。
EEPROM------AT24C01A_IIC总线驱动读写程序
/*河北工程大学信电学院自动化系调试成功EEPROM------A T24C01A_IIC总线驱动读写程序晶振:6MHz目标板:STC90C52AD编译环境:Keil C uVision V2.38a*/#include <reg52.h>#include <intrins.h>//由于是01A,1Kbit,故此这里第一个字节的读写格式是1010,A2,A1,A0,R/W #define Read_Addr 0xa1#define Write_Addr 0xa0#define uchar unsigned char//总线的定义,时钟线P1.0,数据线P1.1sbit SCL=P1^0;sbit SDA=P1^1;//短码数组uchar tab[]={2,5,6};void Start(){SDA=1;_nop_();SCL=1;_nop_();SDA=0;_nop_();SCL=0; //可以视作第一个SCL=0}void Stop(){SDA=0;_nop_();SCL=1;_nop_();SDA=1;}//------------------------------------------------------------------------- bit Write_Byte(uchar DA TA){bit Ack;uchar i;for(i=0;i<8;i++){SDA=(bit)(DA TA&0x80);_nop_();SCL=1;_nop_();_nop_();SCL=0; //第九个SCL=0DA TA<<=1;}SDA=1; //主机释放SDA_nop_();_nop_();SCL=1; //第九个SCL=1_nop_();//SDA=1; //对程序好像没出来影响Ack=SDA; //前面是否先置1,特别注意是否是准双向口SCL=0; //下一个字节的第一个SCL=0return (Ack);}uchar Read_Byte(){uchar DA TA,i;for(i=0;i<8;i++){SCL=1;DA TA<<=1;//注意强制类型转换SDA=1; //对程序好像没出来影响DA TA|=(uchar)SDA;//前面是否先置1,特别注意是否是准双向口SCL=0;}return(DA TA);}//-------------------------------------------------------------------------//读当前地址的数据uchar Read_Current_Addr(){uchar DA TA;Start();Write_Byte(Read_Addr);DA TA=Read_Byte();Stop();return(DA TA);}//向指定地址读数据uchar Read_Random_Addr(uchar addr) //256*8byte=1024Kbit,uchar类型正好合适{uchar DA TA;Start();Write_Byte(Write_Addr);Write_Byte(addr);DA TA=Read_Current_Addr();return(DA TA);}/*-------------------------------------------------------------功能:从EEPROM中给定一个地址连续读NLEN个字节数据存放在以指针nContent开头的往下内容。
iic工作原理
IIC工作原理介绍IIC(Inter-Integrated Circuit)是一种常用的串行通信协议,被广泛应用于各种电子设备中。
本文将深入探讨IIC工作原理,从硬件和软件两个方面详细介绍其工作机制。
IIC总线结构及信号线IIC总线由两根信号线组成,分别是SDA(Serial Data Line)和SCL(Serial Clock Line)。
SDA线用于传输数据,SCL线则用于同步数据传输的时钟信号。
IIC总线的工作步骤IIC总线的工作可以分为以下几个步骤:1. 总线开始信号在进行数据传输之前,主设备向总线发送开始信号。
开始信号的产生是通过将SDA 线从高电平切换到低电平,同时保持SCL线为高电平。
2. 写地址和数据主设备发送从设备的地址,并指定是写操作。
从设备接收到地址后,会发送应答信号以确认地址接收成功。
然后主设备可以发送数据给从设备。
3. 读地址和数据主设备发送从设备的地址,并指定是读操作。
从设备接收到地址后,同样发送应答信号。
接着从设备将需要发送的数据放到SDA线上进行传输。
4. 总线停止信号在数据传输完成后,主设备发送停止信号。
停止信号的产生是通过将SDA线从低电平切换到高电平,同时保持SCL线为高电平。
IIC硬件层面的工作原理在硬件层面,IIC总线主要由以下几个部分组成:1. 主设备主设备负责发起和控制总线的数据传输,它通常是一个处理器或者微控制器。
主设备通过控制SDA和SCL信号线的状态来实现数据的发送和接收。
2. 从设备从设备是主设备的数据接收方或数据发送方,它可以是各种外设如传感器、存储器等。
从设备通过监测SDA和SCL信号线的状态来接收主设备发送的数据或向主设备发送数据。
3. 上拉电阻为了实现SDA和SCL信号线上的高电平状态,需要使用上拉电阻将信号线连接到正电源。
4. 开漏输出和输入IIC总线上的设备通常使用开漏输出和输入来实现信号的传输。
开漏输出允许多个设备在总线上共享一个信号线,而开漏输入则允许设备在总线上监听其他设备的信号。
基于WinCE的IIC总线传感器驱动设计
Da t a
一
数 字 技 术
设计 开发
5驱 动设 计
一
个驱动要实 现的功能有复 位 , 对传感器 的读和写 , 对测量获 得 的数据进行 补偿计算等 , 将获得 的数据进行传输 。 以s l a t 1 1 的驱动 为例 。 S h t t 1 的驱动流程如( 图2 ) 所示 。 要对传感器进 行操作 , 第一 步就是复位。 在I I C 总线驱动的传感 器中, 复 位是依靠复位 时序进行操作 的 , s h t l 1 的复位 时序如 图3 。 当D AT A保持高电平 时, 触 发S C K时钟9 次或更多, 接着 发送一 } 个“ 传输启动” 时序 , 在驱动程序 的体现就是将D A TA 置1 , S C K的高 经历 了以上 两步后 , 核心板就可以向传感器 发送 命令 , 进行 数 低 电平变换9 次, 再进行“ 传输启动” 时序 的操作 , 在程序上的体现就 据的测量 。 S h t l 1 的命令集如( 图5 ) 。 再 经过对测量获得的数据进行一 是: 些补偿及修正 的计算 , 就可 以将数据传送到核心板 了。 将数据 f o r ( i = 0 ; i <9 ; i + +) / / D AT A保持 高, S C K时钟触发9 次, 发送启 从传感器往ARM芯片传 输的程序 如下 动传 输 , 通迅 即复 位 v p l O P r e g s - >G P P C O N &= ( 0 x 3 <<( 9 2 ) ) ; { / / 设置g P p 9 为输入 口 S c k _ 1 0; / / S C K=1 ; f o r ( i = 0 x 8 0 ; i >0 ; i / = 2 ) / / 右移位 D e l a y ( 1 ) ; { v — P I OPr e g s 一>GPPDAT f = ( 0 x1 <<( 8 2 ) ) ; S c R 0 ( ) ;/ / s c K=0 / /SOK=1 : D e l a y ( 1 ) ; j = v _ p l O P r e g s - >G P P DAT &= ( 0 x 3 << ( 9 2 ) ) ; } i f( j )v a l = ( v a l l i ) ; / / 读数据 线的值 s _ t r a n s s t a r t ( ) ; / / 启动传输 v p I O P r e g s 一 >G P P D AT 『 =( 0 x 0 <<( 8 2 ) ) ; 将传感器 复位之后 , 需要 给传感器 发布 测量命令 , 核心板先给 // SOK=0 : 传感器发送一个启动传 输的时序 , 然后可以发送相应的命令时序 , } 启动传 输时序如( 图4 ) 。 相关的计算程序 都 比较简单 , 就不一一列举 了。 在编写启动传输的程序 时, 需要根据时序 图对DA T A线和S C K 参 考文献 线进行 细微的控制 , 所需要的程序 为 : [ 1 ] 徐晓. 基于 A T 8 9 C 5 1的土壤温湿度信息 的自动采集 与监控[ J ] . 自 v o i d s _ t r a n s s t a r t ( v o i d ) 动 化技 术 与应 用, 2 0 0 5 , 2 4 ( 2 ) : 4 5 — 4 7 . { [ 2 ] 曹瑾亮, 张有光, 周亮. W i n C E 环境下指纹识别设备驱动的设计和实 Da t a o u t ( ) ; 现 [ J ] . 电 子测 量 技 术 。 2 0 0 7 . 3 0 ( 8 ) : 1 3 7 一 l 4 0 . S c K_ o u t ( ) ; [ 3 ] 罗健 飞, 吴仲城, 沈春 山, 申飞. 基 于A R M和 W i n C E下的设备接 口驱 D a t a _ 1 ( ) ; / / 准备 动设计 与实现[ J ] . 自动化 与仪表, 2 0 0 9 , 3 , : 1 — 3 . S c k 一 0 ( ) ; / / 准备 [ 4 ] 何 宗键. W i n d o w s C E嵌入 式系统[ H ] . 北京: 北京航 空航天 出版社, De l a y ( 2 ) ; 2 0 0 6 . S c k _ l 0; / / S O K=l ; D e l a y ( 2 ) ;
IIC总线---1
I²C 总线操作原理任何I²C 器件都可以连接到I²C 总线上,而每一个总线上的器件也能和任何一个主控端沟通互相传送信息,在总线上至少必须有一个主控端,如微控器或DSP,每个主控端拥有相同的优先权,且在I²C 总线上加入或移除器件都非常简便。
总线的电容总和必须低于400 pF,大约20 到30 个器件或10 m 的传输长度,以符合上升与下降时间的要求,每个器件必须驱动3mA 形成逻辑低位准,并在开漏极总线内置大约 2 K 到10 K ohms 的提升电阻与0.4 mA 的电流,同时并具有双向I²C 总线缓冲器可以用来隔离总线上不同接线的电容,以带来更大(2000pF) 与更长(2000 m) 的总线结构。
每个I²C 器件都拥有一个独一无二的7-bit I²C 地址,让主控端知道通信传输的对象是谁,通常7-bit 中四个较重要的位(MSB) 为固定的,并依器件本身性质的分类区分,如1010 即代表串行EEPROM,而其他三个较不重要的位(LSB),即A2、A1 与A0 则可以通过硬件电子引脚设定,并取得高达8 个不同的I²C 地址组合,因此在同一个I²C 总线上可以有8 个相同形式的器件运作,这些引脚固定在VCC 高电压代表逻辑1,固定在接地低电压则代表逻辑0,7-bit 的定址方式可以带来总线上128 个器件的组合,但由于部份地址设定保留给特殊指令应用,因此实际上最高器件数大约为120 个。
I²C 总线术语发送端- 发送数据到总线的器件。
当发送端器件可以主动将数据放到总线,我们称为主控发送端,若可以回应主控端的要求,即称为从属发送端。
接收端- 接收来自总线传输数据的器件。
当接收端器件可以主动接收数据时,我们称为主控接收端,若依照主控端要求而接收,称为从属接收端。
主控端- 为启动数据传送(START 指令)、产生时钟(SCL) 信号并中止数据传送(STOP指令) 的器件,主控端必须是传送端或接收端。
LinuxI2C驱动整理(以RK3399Pro+Kernel4.4为例)
LinuxI2C驱动整理(以RK3399Pro+Kernel4.4为例)⼀. Linux I2C驱动架构Linux内核⾥,I2C驱动框架可以分为两层,adapter驱动和deivce驱动。
Adapter驱动也可以理解为I2C总线驱动,指的是SOC⾥的I2C控制器驱动。
⼀个SOC可能包含多个I2C控制器,⽽每个控制器的使⽤⽅式是相同的(寄存器参数、收发数据的⽅法等),因此多个控制器可以共⽤⼀套adapter驱动;Deivce驱动,对应的是SOC外围的I2C设备,不同类型I2C设备需要开发不同的设备驱动,同⼀类型的I2C设备可以使⽤⼀种驱动,但是每⼀个I2C设备都由⼀个唯⼀的client来描述。
⼆. Adapter配置DTSI⽂件(kernel/arch/arm64/boot/dts/rockchip/rk3399.dtsi)描述了RK3399Pro所有的I2C控制器信息:i2c0: i2c@ff3c0000 {compatible = "rockchip,rk3399-i2c";reg = <0x00xff3c00000x00x1000>;clocks = <&pmucru SCLK_I2C0_PMU>, <&pmucru PCLK_I2C0_PMU>;clock-names = "i2c", "pclk";interrupts = <GIC_SPI 57 IRQ_TYPE_LEVEL_HIGH 0>;pinctrl-names = "default";pinctrl-0 = <&i2c0_xfer>;#address-cells = <1>;#size-cells = <0>;status = "disabled";};i2c1: i2c@ff110000 {compatible = "rockchip,rk3399-i2c";reg = <0x00xff1100000x00x1000>;clocks = <&cru SCLK_I2C1>, <&cru PCLK_I2C1>;clock-names = "i2c", "pclk";interrupts = <GIC_SPI 59 IRQ_TYPE_LEVEL_HIGH 0>;pinctrl-names = "default";pinctrl-0 = <&i2c1_xfer>;#address-cells = <1>;#size-cells = <0>;status = "disabled";};i2c2: i2c@ff120000 {compatible = "rockchip,rk3399-i2c";reg = <0x00xff1200000x00x1000>;clocks = <&cru SCLK_I2C2>, <&cru PCLK_I2C2>;clock-names = "i2c", "pclk";interrupts = <GIC_SPI 35 IRQ_TYPE_LEVEL_HIGH 0>;pinctrl-names = "default";pinctrl-0 = <&i2c2_xfer>;#address-cells = <1>;#size-cells = <0>;status = "disabled";};i2c3: i2c@ff130000 {compatible = "rockchip,rk3399-i2c";reg = <0x00xff1300000x00x1000>;clocks = <&cru SCLK_I2C3>, <&cru PCLK_I2C3>;clock-names = "i2c", "pclk";interrupts = <GIC_SPI 34 IRQ_TYPE_LEVEL_HIGH 0>;pinctrl-names = "default";pinctrl-0 = <&i2c3_xfer>;#address-cells = <1>;#size-cells = <0>;status = "disabled";};i2c5: i2c@ff140000 {compatible = "rockchip,rk3399-i2c";reg = <0x00xff1400000x00x1000>;clocks = <&cru SCLK_I2C5>, <&cru PCLK_I2C5>;clock-names = "i2c", "pclk";interrupts = <GIC_SPI 38 IRQ_TYPE_LEVEL_HIGH 0>;pinctrl-names = "default";pinctrl-0 = <&i2c5_xfer>;#address-cells = <1>;#size-cells = <0>;status = "disabled";};i2c6: i2c@ff150000 {compatible = "rockchip,rk3399-i2c";reg = <0x00xff1500000x00x1000>;clocks = <&cru SCLK_I2C6>, <&cru PCLK_I2C6>;clock-names = "i2c", "pclk";interrupts = <GIC_SPI 37 IRQ_TYPE_LEVEL_HIGH 0>;pinctrl-names = "default";pinctrl-0 = <&i2c6_xfer>;#address-cells = <1>;#size-cells = <0>;status = "disabled";};i2c7: i2c@ff160000 {compatible = "rockchip,rk3399-i2c";reg = <0x00xff1600000x00x1000>;clocks = <&cru SCLK_I2C7>, <&cru PCLK_I2C7>;clock-names = "i2c", "pclk";interrupts = <GIC_SPI 36 IRQ_TYPE_LEVEL_HIGH 0>;pinctrl-names = "default";pinctrl-0 = <&i2c7_xfer>;#address-cells = <1>;#size-cells = <0>;status = "disabled";};i2c4: i2c@ff3d0000 {compatible = "rockchip,rk3399-i2c";reg = <0x00xff3d00000x00x1000>;clocks = <&pmucru SCLK_I2C4_PMU>, <&pmucru PCLK_I2C4_PMU>;clock-names = "i2c", "pclk";interrupts = <GIC_SPI 56 IRQ_TYPE_LEVEL_HIGH 0>;pinctrl-names = "default";pinctrl-0 = <&i2c4_xfer>;#address-cells = <1>;#size-cells = <0>;status = "disabled";};i2c8: i2c@ff3e0000 {compatible = "rockchip,rk3399-i2c";reg = <0x00xff3e00000x00x1000>;clocks = <&pmucru SCLK_I2C8_PMU>, <&pmucru PCLK_I2C8_PMU>;clock-names = "i2c", "pclk";interrupts = <GIC_SPI 58 IRQ_TYPE_LEVEL_HIGH 0>;pinctrl-names = "default";pinctrl-0 = <&i2c8_xfer>;#address-cells = <1>;#size-cells = <0>;status = "disabled";};可以看出,该SOC共有9个I2C控制器,分别为I2C0~I2C8, 每个控制器对应了不同的寄存器基地址(例如I2C0对应0xff3c0000),它们的compatible匹配属性都是"rockchip,rk3399-i2c",也就是对应了同⼀个adapter驱动。
IIC总线协议及应用
IIC总线协议及应用IIC(Inter-Integrated Circuit)总线协议是一种广泛应用于数字电路中的串行通信协议。
它由Philips公司在20世纪80年代初提出,今天已成为一种通用的数字串行通信接口。
IIC总线协议具有简单、高效、容错性好等优点,被广泛应用于各种设备之间的通信,特别是在集成电路中的设备之间。
IIC总线协议使用两根信号线来进行通信,即数据线(SDA)和时钟线(SCL)。
SDA线用于发送和接收数据,而SCL线用于同步数据传输的时钟信号。
总线上传输的数据被分为地址和数据两部分,地址部分用于指定设备或寄存器,数据部分用来进行数据传输。
IIC总线协议支持多主机和多从机的通信方式。
IIC总线协议可以广泛应用于各种数字设备的通信。
首先,它可以用于存储器和外围设备之间的通信。
比如,存储器芯片可以通过IIC总线协议与微处理器进行通信,以实现数据的读取和写入。
其次,IIC总线协议也常用于各种传感器和控制器之间的通信。
例如,温度传感器可以通过IIC总线协议将测量结果传输给微控制器,然后进行相应的控制。
此外,IIC总线协议还可以应用于各种外围设备之间的通信。
比如,多个数字设备可以通过IIC总线协议进行通信,实现多个设备之间的数据交换和共享。
此外,IIC总线协议还可以用于系统调试和配置。
在系统调试中,可以通过IIC总线协议实现对系统的监测和调试。
在系统配置中,可以通过IIC总线协议来配置各种设备的参数和功能。
在IIC总线协议的应用中,通常需要定义各个设备之间的通信协议和通信地址。
通信协议定义了数据的传输格式和传输规则,而通信地址用于标识和寻址各个设备。
在实际应用中,通常会使用控制器和驱动器来实现IIC总线协议的通信功能。
控制器负责协议的处理和控制,而驱动器负责数据的发送和接收。
控制器和驱动器可以是硬件实现,也可以是软件实现。
总之,IIC总线协议是一种广泛应用于数字电路中的串行通信协议。
它具有简单、高效、容错性好等优点,被广泛应用于各种设备之间的通信。
如何对AT24C02编写驱动程序——IIC总线协议
如何对AT24C02编写驱动程序——IIC总线协议AT24C02是一种2Kbit(256字节)的串行EEPROM芯片,采用I2C总线协议进行通信。
编写AT24C02的驱动程序需要了解I2C总线协议的工作原理以及AT24C02的读写操作。
以下是编写AT24C02驱动程序的步骤:1. 硬件配置:首先,需要在单片机上配置I2C总线的硬件连接。
I2C 总线需要两根信号线,即SDA(Serial Data Line)和SCL(Serial Clock Line)。
将SDA和SCL引脚连接到AT24C02的对应引脚,并通过上拉电阻将其拉高。
2.初始化I2C总线:在驱动程序中,需要初始化I2C总线的相关寄存器和配置参数。
这包括设置I2C总线的通信速率、使能I2C模块、使能中断等。
3.开始信号和设备地址:发送开始信号START,然后发送AT24C02的设备地址,设备地址由3位固定的值和一个读/写位组成。
读写位为0代表写操作,为1代表读操作。
4.发送数据:如果是写操作,发送要写入的数据到AT24C02的指定地址。
数据写入时,需要注意AT24C02的内存地址范围,以及页写操作的限制。
如果是读操作,发送读取的目标地址。
5.停止信号:传输完成后,发送停止信号STOP,结束通信。
6.延时和轮询:在I2C总线通信中,需要一定的延时等待数据传输完成。
在写入大量数据或读取数据时,还需要轮询等待操作完成。
7.错误处理:在驱动程序中,需要考虑到可能发生的错误和异常情况。
例如,设备地址未响应、通信超时、数据传输错误等,都需要进行相应的错误处理。
8.封装函数接口:为了方便上层应用调用,可以将上述操作封装成函数接口。
例如,提供读写函数、擦除函数和查询设备ID的函数等。
除了以上的驱动程序,还可以根据实际需求进行功能扩展。
例如,可以实现批量写入数据、随机读取数据、擦除操作等。
总之,编写AT24C02的驱动程序主要包括硬件配置、初始化I2C总线、发送开始信号和设备地址、发送数据、发送停止信号、延时和轮询、错误处理等步骤。
I2C驱动E2PROM
I2C驱动E2PROM*By Neil Chiao ( neilchiao at ) 1、I2C总线原理I2C是一种常用的串行总线,由串行数据线SDA 和串线时钟线SCL组成。
系统的I2C模块分为I2C总线控制器和I2C设备。
I2C总线控制器是CPU提供的控制I2C总线接口,它控制I2C总线的协议、仲裁、时序。
I2C设备是指通过I2C总线与CPU相连的设备,如EEPROM。
使用I2C通信时必须指定主从设备。
一般来说,.I2C总线控制器被配置成主设备,与总线相连的I2C设备如AT24C02作为从设备。
1.1、IIC读写EEPROM 原理IIC总线的开始/停止信号如图1所示。
开始信号为:时钟信号线SCL为高电平,数据线SDA从高变低。
停止信号为:时钟信号线SCL为高电平,数据线SDA从低变高。
图1 IIC Start-Stop Signal 1.1.1 IIC总线Byte WriteIIC总线写数据分几种格式,如字节写和页写。
字节写传送格式如图2所示。
开始信号之后,总线开始发数据,第一个Byte是IIC的设备地址,第二个Byte是设备内的地址(如EEPROM中具体的某个物理地址),然后就是要传送的真正的数据DATA。
NOTE:IIC总线在传送每个Byte后,都会从IIC总线上的接收设备得到一个ACK信号来确认接收到了数据。
其中,第一个Byte的设备地址中,前7位是地址码,第8位是方向位(“0”为发送,“1”为接收)。
IIC的中断信号有:ACK,Start,Stop。
图2 IIC Byte Write Write功能的实际实现原理如图3所示:(1)设置GPIO的相关引脚为IIC输出;(2)设置IIC(打开ACK,打开IIC中断,设置CLK等);(3)设备地址赋给IICDS ,并设置IICSTAT,启动IIC发送设备地址出去;从而找到相应的设备即IIC总线上的EEPROM。
(4)第一个Byte的设备地址发送后,从EEPROM得到ACK信号,此信号触发中断;(5)在中断处理函数中把第二个Byte(设备内地址)发送出去;发送之后,接收到ACK 又触发中断;(6)中断处理函数把第三个Byte(真正的数据)发送到EEPROM中;(7)发送之后同样接收到ACK并触发中断,中断处理函数判断,发现数据传送完毕。
IIC和SPI总线技术及应用liudy
3. IIC总线工作原理 3.1 IIC总线的构成
I2C总线是由数据线SDA和时钟SCL构成的串行总线,可发送 和接收数据。 在CPU与被控IC之间、IC与IC之间进行双向传送,最高传送速率 100kbps。 各种被控制电路均并联在这条总线上,但就像电话机一样只有拨 通各自的号码才能工作,所以每个电路和模块都有唯一的地址, CPU发出的控制信号分为地址码和控制量两部分,地址码用来选 址,即接通需要控制的电路,确定控制的种类;控制量决定该调整 的类别(如对比度、亮度等)及需要调整的量。这样,各控制电路 虽然挂在同一条总线上,却彼此独立,互不相关。 在信息的传输过程中,I2C总线上并接的每一模块电路既是主控 器(或被控器),又是发送器(或接收器),这取决于它所要完成 的功能。
2. 93C46器件介绍 93C46器件介绍
1) 器件概述: • CSI93C46/56/57/66/86 是一种存储器可以定义 为16 位(ORG 引脚接Vcc 或者定义为8 位ORG 引 脚接GND) 的1K/2K/2K/4K/16K 位的串行E2PROM. 每一个的存储器都可以通过DI 引脚或DO 引脚进 行写入或读出. • 每一片CSI93C46/56/57/66/86 都是采用CSIalyst 公司先进的CMOS E2PROM 浮动门工艺加工,器件 可以经受1,000,000 次的写入/擦除操作,片内数据 保存寿命达到100 年.器件可提供的封装有DIP-8 SOIC-8 TSSOP-8
4)选择性读操作
选择性读操作允许主器件对寄存器的任意字节进行读操作。主器件首先通 过发送起始信号、从器件地址和它想读取的字节数据的地址执行一个伪写 操作。在CAT24WC01/02/04/08/16 应答之后,主器件重新发送起始信号和 从器件地址。此时R/W 位置1, CAT24WC01/02/04/08/16 响应并发送应答 信号,然后输出所要求的一个8 位字节数据。主器件不发送应答信号但产生 一个停止信号
iic标准模式与快速模式的 驱动电平
iic标准模式与快速模式的驱动电平IIC(Inter-Integrated Circuit)总线是一种串行通信协议,主要用于连接芯片间通讯。
它包括两种模式:标准模式和快速模式。
其中驱动电平对传输速率、信号稳定性等都有着重要的影响。
一、 IIC标准模式的驱动电平IIC标准模式被定义为0到100KHz的数据传输速率。
在标准模式下,总线由两条可逆的数据线组成:SDA和SCL。
数据传输都是从Master发送始,Slave响应并且传输的。
在IIC总线中,数据线都有附加电路。
其中SDA线上连接了一个上拉电阻,通常为1kohm到10kohm,在SCL线上则没有上拉电阻。
然而,在标准模式下,输入和输出的两个IO的最小电平差异(vIH – vIL)应该小于0.3VDD,这里的vIH为输入高电平,vIL为输入低电平,VDD为电池电(source voltage) 。
二、 IIC快速模式的驱动电平IIC快速模式被定义为0到400KHz的数据传输速率。
在这种模式下,总线中的下拉电阻的值更大,是3kohm到10kohm,这也使信号电平的变化范围更大。
快速模式下的驱动电平比标准模式下的更为关键,在快速模式下输入和输出的两个IO的最小电平差异应该小于0.6VDD。
当电压差分降低到VDD×0.3时,标准模式下的信号电平变化范围视为一个逻辑0或逻辑1。
而在快速模式下,电压电路的电压差分降低到VDD×0.6时被视为一个逻辑0或逻辑1。
因此,快速模式下的数据传输速率更快,但IIC总线的电性能更为严格。
总而言之,IIC标准模式和快速模式的驱动电平都很重要,它们既影响数据传输速率,也影响整个系统的信号稳定性。
电子工程师在设计IIC 总线时,必须特别注意驱动电平的设置和正确连接,以保证通信的速率和可靠性。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
题目:I2C总线驱动
一、设计目的
1、理解IIC总线协议的内容。
2、根据IIC协议编制驱动程序,使用LED数码管显示24LC02某地址存储的
数据。
3、有按键,可设置存储的数据。
二、设计要求
1、根据IIC协议编制驱动程序,使用LED数码管显示24LC02某地址存储的数据。
2、有按键,可设置存储的数据。
三、方案设计与论证
I2C总线特征
I2C串行总线一般有两根信号线,一根是双向的数据线SDA,另一根是时钟线SCL。
所有接到I2C总线设备上的串行数据SDA都接到总线的SDA上,各设备的时钟线SCL接到总线的SCL上。
图1IIC总线规范
I2C总线起始与停止条件
I2C总线在传送数据过程中信号类型:
开始信号:SCL为高电平时,SDA由高电平向低电平跳变,开始传送数据。
结束信号:SCL为高电平时,SDA由低电平向高电平跳变,结束传送数据。
图2 起始和停止条件
I2C总线的数据传输
每一个字节必须保证是8位长度,每次传输可发送的字节数量不受限制。
数据传送时,先传送最高位(MSB),每一个被传送的字节后面都必须跟随一位应答位(即一帧共有9位)。
图3 数据传输时序图
AT24C02简介
AT24C02是美国ATMEL公司的低功耗CMOS串行EEPROM,它是内含256
×8位存储空间,具有工作电压宽(2.5~5.5V)、擦写次数多(大于10000次)、写入速度快(小于10ms)等特点。
AT24C02中带有片内寻址寄存器。
每写入或读出一个数据字节后,该地址寄存器自动加1,以实现对下一个存储单元的操作。
所有字节都以单一操作方式读取。
为降低总的写入时间,一次操作可写入多达8字节的数据。
图6为AT24C系列芯片的封装图。
各引脚功能如下:
图4 A T24C02及其外围电路
SCL:串行时钟。
在该引脚的上升沿时,系统将数据输入到每个EEPROM器件,在下降沿时输出。
SDA:串行数据。
该引脚为开漏极驱动,可双向传送数据。
A0、A1、A2:器件/页面寻址。
为器件地址输入端。
WP:硬件写保护。
当该引脚为高电平时禁止写入,当为低电平时可正常读写数据。
VCC:电源。
一般输入+5V电压。
VSS:接地。
I2C总线驱动
I2C 总线驱动主要包括I2C 适配器结构i2c_adapter 和I2C 适配器的algorithm
数据结构。
通过I2C 总线驱动的代码,可控制I2C 适配器以主控方式产生开始位、停止
位、读写周期,以及以从设备方式被读写、产生ACK等。
I2C设备驱动
I2C 设备驱动是对I2C 设备端的实现,设备一般挂接在受CPU控制的I2C
适配器上,通过I2C 适配器与CPU交换数据。
I2C 设备驱动主要包括数据结构 i2c_driver 和i2c_client。
整体架构
我们通过对上述四个数据结构的描述和之间的关联的探讨来阐述i2c 驱动的整体架构。
i2c_adapter和i2c_algorithm
i2c_adapter 对应于物理上的一个适配器,i2c_algorithm 则对应一套通信方法。
一个i2c
适配器需要i2c_algorithm 中提供的通信函数来控制适配器上产生特定的访问周期。
缺少i2c_algorithm 的i2c_adapter 什么也做不了,因此i2c_adapter 中包含其使用的i2c_algorithm的指针。
i2c_algorithm中的函数master_xfer()用于产生I2c 访问周期需要的信号。
i2c_driver和i2c_client
i2c_driver 对应一套驱动方法,是纯粹的用于辅助作用的数据结构,它不对应任何物理实体。
i2c_client 对应于具体的物理设备。
i2c_driver 与i2c_client 在前者的attach_adapter函数被调用时会探测物理设备,当确定
一个client存在时,把该client使用的i2c_client 结构的adapter指针指向对应的i2c_adapter,并调用i2c_adapter 的client_register()函数。
i2c_adapter和i2c_client
i2c_adapter 和i2c_client 的关系与I2C硬件体系中适配器和设备的关系一致,即i2c_client依附于i2c_adapter。
一个适配器可以连接多个I2C 设备。
i2c_adapter 中包含i2c_client 的链表。
总结
内核关于I2C 驱动的体系结构关系图如下所示:
图5 关系图
方案一:
将数据“0x0f”写入AT24C02再读出送P1口显示
方案二:
将按键次数写入AT24C02再读出送LED数码管显示。
对按键进行软件消抖处理,通过编程,在按再下键S时,将计数变量加1,然后将计数变量的值写入AT24C02芯片并读出送LED数码管显示。
四、设计原理和电路图如下
(1)IIC驱动电路
设计原理:
AT24C02 的TEST脚为测试端系统中可接地处理 A2 A1 A0可任接因引I2C 总线上可连接多达 8 片总容量为 8*256*8=2048*8 由于片内子地址采用 8 位地址指针寻址超过256*8 时要占用引脚地址如果使用 CAT24WC04 则A0作为子地址软件寻址位使用CAT24WC08 CAT24WC16 时A1 A2 也分别作为子地址的软件寻址位这时相应的外部 A0 A1 A2无效。
AT24CXX 的数据操作格式
在I2C 总线中对CAT24WC02 内部存储单元读写时除了要寻址该器件的节点地址外还须指定存储读写的子地址SUBADR按照CAT24WC02 的器件手册读写N个字节的数据操作格式如下:
器件选择
在I2C 总线接口的通用外围电路中有可实现 LED 驱动控制的 SAA1064 接口芯片该器件可静态驱动 2 位LED 动态驱动 4 位LED 只有一个地址引脚 ADR 但可选择 4 种电平状态故一个 I2C 总线上最多只能挂接 4 个SAA1064 最多可扩展
16 位LED 显示SAA1064 中有动态驱动控制电路不须外部动态驱动管理故在外
部仍呈现出静态LED驱动特性。
电路设计
图3 对A T24C02读写的电路
图驱动LED显示电路
五、元件清单
表1 元件清单
元件序号型号主要参数元件序号型号主要参数
R2 金属膜,0.25w 10K R6 金属膜,0.25w 10K
R3 金属膜,0.25w 10K R7 金属膜,0.25w 10K
R4 金属膜,0.25w 10K R8 金属膜,0.25w 10K
R5 金属膜,0.25w 10K R9 金属膜,0.25w 10K
U1 AT89C51 S 按钮
U2 AT24C02 7SEG 数码管
六、设计总结
I2C总线具有十分完善的总线协议可构成多主系统在协议软件支持下,可自动处理
总线上任何可能的运行状态I2C 总线为双向同步串行总线因此I2C 总线接口内部为双向传输电路,如图2所示。
总线端口输出为开漏结构,故总线上必须有上拉电阻Rp 上拉电阻与电源电压VDD SDA/SCL总线串接电阻Rs 有关可参考有关数据手册选择通常可选5-10k
七、参考文献
[1]《单片机C语言应用100例》,王东峰、王会良等编,电子工业出版社,2009.3
[2]《新概念51单片机C语言教程》,郭天祥编,2007年
[3]《单片机原理及应用(C51语言)》,邓立新主编,清华大学出版社,2012年
[4]《单片机系统设计与开发》,张齐,朱宁西编著,机械工业出版社,2008.8
[5]中国知网
[6]百度网站
[7]电子发烧友
附录1 总体电路。