文档库 最新最全的文档下载
当前位置:文档库 › 软件模拟IIC主从机

软件模拟IIC主从机

软件模拟IIC主从机
软件模拟IIC主从机

iic设备驱动程序.doc

IIC设备驱动程序 IIC设备是一种通过IIC总线连接的设备,由于其简单性,被广泛引用于电子系统中。在现代电子系统中,有很多的IIC设备需要进行相互之间通信 IIC总线是由PHILIPS公司开发的两线式串行总线,用于连接微处理器和外部IIC设备。IIC设备产生于20世纪80年代,最初专用与音频和视频设备,现在在各种电子设备中都广泛应用 IIC总线有两条总线线路,一条是串行数据线(SDA),一条是串行时钟线(SCL)。SDA负责数据传输,SCL负责数据传输的时钟同步。IIC设备通过这两条总线连接到处理器的IIC总线控制器上。一种典型的设备连接如图: 与其他总线相比,IIC总线有很多重要的特点。在选择一种设备来完成特定功能时,这些特点是选择IIC设备的重要依据。 主要特点: 1,每一个连接到总线的设备都可以通过唯一的设备地址单独访问 2,串行的8位双向数据传输,位速率在标准模式下可达到100kb/s;快速模式下可以达到400kb/s;告诉模式下可以达到3.4Mb/s 3,总线长度最长7.6m左右 4,片上滤波器可以增加抗干扰能力,保证数据的完成传输 5,连接到一条IIC总线上的设备数量只受到最大电容400pF的限制 6,它是一个多主机系统,在一条总线上可以同时有多个主机存在,通过冲突检测方式和延时等待防止数据不被破坏。同一时间只能有一个主机占用总线 IIC总线在传输数据的过程中有3种类型的信号:开始信号、结束信号、和应答信号 >>开始信号(S): 当SCL为高电平时,SDA由高电平向低电平跳变,表示将要开始传输数据 >>结束信号(P):当SCL为高电平时,SDA由低电平向高电平跳变,表示结束传输数据 >>响应信号(ACK): 从机接收到8位数据后,在第9个周期,拉低SDA电平,表示已经收到数据。这个信号称为应答信号 开始信号和结束信号的波形如下图:

MSP430 IIC 程序驱动代码

/ 开发平台;MSP430 IIC总线驱动代码 本人试用过,可以成功的调通 /////////////////////////////////////////////////////////// //iic.c #include typedef unsigned char uchar; typedef unsigned int uint; #define SCL_H P1OUT |= BIT2 #define SCL_L P1OUT &= ~BIT2 #define SDA_H P1OUT |= BIT3 #define SDA_L P1OUT &= ~BIT3 #define SDA_in P1DIR &= ~BIT3 //SDA改成输入模式#define SDA_out P1DIR |= BIT3 //SDA变回输出模式#define SDA_val P1IN&BIT3 //SDA的位值 #define TRUE 1 #define FALSE 0 /******************************************* 函数名称:delay 功能:延时约15us的时间 参数:无 返回值:无 ********************************************/ void delay(void) { uchar i; for(i = 0;i < 15;i++) _NOP(); } /******************************************* 函数名称:start 功能:完成IIC的起始条件操作 参数:无 返回值:无 ********************************************/ void start(void) { SCL_H;

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()相反的功能。用于内存和中断等系统资源的释放和注销。 3)总线驱动i2c-davinci.c中,定义了i2c_davinci_xfer函数。该函数是I2C总线通信传输函数。并且I2C适配器对应的i2c_algorithm结构体实例为i2c_davinci_algo,其中的master_xfer函数指针指向i2c_davinci_xfer函数。 4)当设备被打开,并且用户开始读操作时,会调用设备驱动lm75.c中show_temp()函数,该函数会调用i2c-core.c中的i2c_smbus_xfer()函数,i2c_smbus_xfer()函数会检查适配器对应的i2c_algorithm结构体中是否注册了smbus_xfer函数(目前i2c_davinci_algo中未注册smbus_xfer函数),程序会调用i2c_smbus_xfer_emulated()函数,最终,还是会调用标准的I2C总线通信函数master_xfer(),由于master_xfer 已经指向i2c_davinci_xfer函数,所以会调用总线驱动i2c-davinci.c中的i2c_davinci_xfer函数来读取信息。 三、接口函数 1)应用层接口: Int lm75a_temp_read(float *temp) 读取lm75a 温度 2)内核中:lm75.c文件 static ssize_t show_temp(struct device *dev, struct device_attribute *da,char *buf)

I2C 24CXX驱动程序(真正实用 全)

#define _24cXX_H /* Includes ----------------------------------------------------------------*/ #include "stm32f10x.h" #include "value.h" //#include "stdbool.h" /* Define ------------------------------------------------------------------*/ /* EEPROM Addresses defines */ //注:32 64 的字地址是16位2个字节如果使用32或64请简单修改驱动即可 #define WC24cXX 0x00 // 器件地址写#define RC24cXX 0x01 // 器件地址读 #define USE_24C08 //使用24C08 #ifdef USE_24C02 #define MAXSIZE24cXX 256 // 总容量Bytes //级联时请修改本参数和硬件驱动 #define BLOCK_SIZE 256 // 块容量Bytes #define I2C_PAGESIZE 8 // 8个字节每页 #endif #ifdef USE_24C04 #define MAXSIZE24cXX 512 // 总容量Bytes //级联时请修改本参数和硬件驱动 #define BLOCK_SIZE 256 // 块容量Bytes #define I2C_PAGESIZE 16 // 16个字节每页 #endif #ifdef USE_24C08 #define MAXSIZE24cXX 1024 // 总容量Bytes //级联时请修改本参数和硬件驱动 #define BLOCK_SIZE 256 // 块容量Bytes #define I2C_PAGESIZE 16 // 16个字节每页 /* user define */ #define YBCV_ADDR_0 0x0000 //定义仪表控制数据结构体的EEPROM存储地址0 #define YBCV_ADDR_1 0x0200 //定义仪表控制数据结构体的EEPROM存储地址1 #define EEPROM_VERIFY YB_CTRL_V ALE_SIZE //EEPROM仪表通道修正参数存储地址 #endif #ifdef USE_24C16 #define MAXSIZE24cXX 2048 // 总容量Bytes #define I2C_PAGESIZE 16 // 16个字节每页 #endif

IIC驱动 IO模拟

QPSK STV0903 TUNER STV6110 驱动设计 1.IIC 理论 MEGA128 模拟IIC时序控制QPSK 中的STV0903 STV6110 STV0903 STV6110 连接图 IIC时序理论 先看下STV0903写时序图 1)起总线 先将SCL、SDA拉高,然后维持SCL为高先将SDA拉低参考代码如下:void Start(void) { SBI(PORTD,SAA7113_DA TA); SBI(PORTD,SAA7113_CLK); IIC_delay(); CBI(PORTD,SAA7113_DA TA); IIC_delay(); CBI(PORTD,SAA7113_CLK); IIC_delay(); } 2)停总线 先将SCL、SDA拉低,然后先拉高SCL,维持SCL为高时拉高SDA 参考代码:

void Stop(void) { CBI(PORTD,SAA7113_DA TA); CBI(PORTD,SAA7113_CLK); IIC_delay(); SBI(PORTD,SAA7113_CLK); IIC_delay(); SBI(PORTD,SAA7113_DA TA); IIC_delay(); } 3)写总线 在写总线时将SDA设置为输出,参考代码: void write_byte(unsigned char data) { uchar m,tmp; SBI(SAA7113_DDR,SAA7113_DA TA); for(m = 0; m < 8; m++) { if(data & 0x80) SBI(PORTD,SAA7113_DA TA); else CBI(PORTD,SAA7113_DA TA); IIC_delay(); SBI(PORTD,SAA7113_CLK); IIC_delay(); data = data<<1; CBI(PORTD,SAA7113_CLK); } IIC_delay(); saa7113_ack(); IIC_delay(); } 4)应答 应答由被控制芯片回应过来,在此时SDA应该设置为输入等待ACK, 在CLK第九个脉冲时,CLK为高电平,而SDA为一个低电平在表示收到器件的一个ACK应答。。 参考代码: void saa7113_ack() { uchar tmp,m; CBI(DDRD,SAA7113_DA TA); SBI(PORTD,SAA7113_CLK); for(m=0;m<10;m++) {

I2C_周立功标准驱动程序_c代码

I2C_周立功标准驱动程序_c代码 1. /****************************************Copyright (c)************************************************** 2. ** 广州周立功单片机发展有限公司 3. ** 研究所 4. ** 产品一部 5. ** 6. ** 7. ** 8. **--------------文件信息-------------------------------------------------------------------------------- 9. **文件名: I2c.c 10. **创建人: 陈明计 11. **最后修改日期: 2003年7月21日 12. **描述: μCOS-II下LPC210x的I2c主模式底层驱动 13. ** 14. **--------------历史版本信息---------------------------------------------------------------------------- 15. ** 创建人: 陈明计 16. ** 版本: v1.0 17. ** 日期: 2003年7月8日 18. ** 描述: 原始版本 19. ** 20. **------------------------------------------------------------------------------------------------------ 21. ** 修改人: 陈明计 22. ** 版本: v1.1

51单片机I2C总线驱动程序

51单片机I2C总线驱动程序 SI2I2C 总线是PHLIPS 公司推出的一种串行总线,是具备多主机系统所需 的包括总线裁决和高低速器件同步功能的高性能串行总线。I2C 总线只有两根 双向信号线。一根是数据线SDA,另一根是时钟线SCL。 一.I2C 系统结构每个接到I2C 总线上的器件都有唯一的地址。主机与其它器 件间的数据传送可以是由主机发送数据到其它器件,这时主机即为发送器。由 总线上接收数据的器件则为接收器。 二.数据位的有效性规定I2C 总线进行数据传送时,时钟信号为高电平期间, 数据线上的数据必须保持稳定,只有在时钟线上的信号为低电平期间,数据线 上的高电平或低电平状态才允许变化。 三.字节传送与应答每一个字节必须保证是8 位长度。数据传送时,先传送最 高位(MSB),每一个被传送的字节后面都必须跟随一位应答位(即一帧共有 9 位)。 四.驱动程序#define uchar unsigned char#define uint unsigned int#define somenop() _nop_(),_nop_(),_nop_(),_nop_(),_nop_(),_nop_()sbit SCL=P2;sb it SDA=P2;123451.起始信号和终止信号 SCL 线为高电平期间,SDA 线由高电平向低电平的变化表示起始信号;SCL 线为高电平期间,SDA 线由低电平向高电平的变化表示终止信号。 起始和终止信号都是由主机发出的,在起始信号产生后,总线就处于被占用 的状态;在终止信号产生后,总线就处于空闲状态 void I2C_Start() //起始{SCL=1;somenop();SDA=1;somenop(); SDA=0;somenop();SCL=0;somenop();}void I2C_Stop() //终止{ SDA=0;somenop();SCL=1;somenop();SDA=1;somenop();}12345678910111213141

IIC总线驱动

题目: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 适配器以主控方式产生开始位、停止

i2c芯片的驱动程序(汇编)

i2c芯片的驱动程序(汇编) 本文对AT24系列存贮器和AT89系列单片机的特征及总线状态作为介绍,并以AT24C01与AT89C2051为例详细描述了通用存贮器IC卡的工作原理及用单片机对其进行读写操作的基本电路连接和软件编程方法。 通用存贮器IC卡是由通用存贮器芯片封装而成的,由于它的结构和功能简单,生产成本低,使用方便,因此在各领域都得到了广泛的应用。目前用于IC卡的通用存贮器芯片多为E2PROM,其常用的协议主要有两线串行连接协议(I2C)和三线串行链接协议,其中比较常用的是ATMEL公司生产的AT24系列芯片。以该系列中的AT24C01为例,它具有1k的存贮容量,适用于2V~5V的低电压/标准电压的操作,具有低功耗和高可靠性等优点。而AT89C2051虽是ATMEL公司89系列单片机的低档型,但它具有2k的FLASH ROM(可重编闪速存贮器)、128×8位内部RAM及全静态操作方式,同样也具有低功耗和较强的功能。下面以AT24C2051为例,对通用存贮器IC卡的工作原理及基本电路连线作一介绍,该线路简单,使用灵活,能可靠地对通用存贮器IC卡进行读写。 2 硬件特性 2.1 AT24系列存贮器的特性 AT24系列存贮器芯片采用CMOS工艺制造,内置有高压泵,可在单电压供电条件下工作。其标准封装为8脚DIP封装形式,各引脚的功能说明如下: SCL:串行时钟。在该脚的上升沿时,系统将数据输入到每个EEPROM器件,在下降沿时输出。 SDA:串行数据。该引脚为开漏极驱动,可双向传送数据。 A0、A1、A2:器件/页面寻址。为器件地址输入端。在AT24C01/02中,该引脚被硬连接。 Vcc:一般输入+5V的工作电压。 图1是符合ISO7816-2标准的IC卡的触点图。对于AT24系列通用存贮器IC卡来说,通常只需使用四个触点。AT24C01的内部组态为128个8位字节,而对随机字寻址则需要一个7位地址。 2.2 总线状态及时序 A24C01的SCL及SDA两总线可通过一个电阻上拉为高电平,SDA上的数据仅在SCL为低电平时周期才能改变。当SCL为高电平时,SDA的改变表示“开始”和“停止”状态。此时,所有地址和数据字都以8位串行码方式输入输出EEPROM。 开始状态:SCL为高电平时,SDA由高电平转入低电平。该命令必须在其它命令前执行。 停止状态:SCL为高电平时,SDA由低电平转入高电平。该命令可终止所有通讯。 确认:相同总线上的设备在收到数据后,以置SDA为低电平的方式对其进行确认。 2.3 器件寻址 AT24系列EEPROM在开始状态后需紧接一个8位器件地址,以进行应读写操作。设备寻址码的高4位为1、0、1、0,对于AT24C01/02,寻址码高4位后面的三位是器件寻址码,与它们的硬连线管脚相对应。最低应是读写选择位,置0时可激发读操作。 具体的格式如下: 1010A2A1A0R/W 2.4 AT89C2051芯片 AT89C2051是MCS-51产品的兼容型,它具有2k的FLASH ROM、128字节ROM,15根I/O引线、两个16位定时/计数器、一个五向量两级中断结构、一个全双工串行口、一个精密模拟比较器以及片内振荡电路和时钟电路。它的P1口和P3口是双向I/O口,其中P1.2~P1. 7、P3.0~P3.5和P3.7带有内部上拉电阻。在AT89C2051用作输入端时,将首先向引脚写“1”而使内部M OS管截止以便引脚处于悬浮状态,从而可获得高阻抗输入。 图2为通用存贮器IC卡的基本电路连接图。 3 读写操作软件

I2C驱动架构

I2C驱动架构 I2C 概述 I2C是philips提出的外设总线. I2C只有两条线,一条串行数据线:SDA,一条是时钟线SCL ,使用SCL,SDA这两根信号线就实现了设备之间的数据交互,它方便了工程师的布线。 因此,I2C总线被非常广泛地应用在EEPROM,实时钟,小型LCD等设备与CPU的接口中。 linux下的驱动思路 在linux系统下编写I2C驱动,目前主要有两种方法,一种是把I2C设备当作一个普通的字符设备来处理,另一种是利用linux下I2C驱动体系结构来完成。下面比较下这两种方法: 第一种方法: 优点:思路比较直接,不需要花很多时间去了解linux中复杂的I2C子系统的操作方法。 缺点: 要求工程师不仅要对I2C设备的操作熟悉,而且

要熟悉I2C的适配器(I2C控制器)操作。 要求工程师对I2C的设备器及I2C的设备操作方法都比较熟悉,最重要的是写出的程序可以移植性差。 对内核的资源无法直接使用,因为内核提供的所有I2C设备器以及设备驱动都是基于I2C子系统的格式。 第一种方法的优点就是第二种方法的缺点, 第一种方法的缺点就是第二种方法的优点。 I2C架构概述 Linux的I2C体系结构分为3个组成部分: I2C核心:I2C核心提供了I2C总线驱动和设备驱动的注册,注销方法,I2C通信方法(”algorithm”)上层的,与具体适配器无关的代码以及探测设备,检测设备地址的上层代码等。 I2C总线驱动:I2C总线驱动是对I2C硬件体系结构中适配器端的实现,适配器可由CPU控制,甚至可以直接集成在CPU内部。

I2C设备驱动:I2C设备驱动(也称为客户驱动)是对I2C 硬件体系结构中设备端的实现,设备一般挂接在受CPU控制的I2C适配器上,通过I2C适配器与CPU交换数据。 linux驱动中i2c驱动架构 上图完整的描述了linux i2c驱动架构,虽然I2C硬件体系结构比较简单,但是i2c体系结构在linux中的实现却相当复杂。 那么我们如何编写特定i2c接口器件的驱动程序?就是说上述架构中的那些部分需要我们完成,而哪些是linux内核已经完善的或者是芯片提供商已经提供的?

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为例:

基于WinCE的I2C驱动程序设计

基于WinCE的I2C驱动程序设计 摘要:将操作系统和相应硬件设备连接起来,编写联系硬件和软件的驱动程序至关重要。本文主要讨论在WinCE操作系统下,如何设计实现S3C2410芯片具有I2C接口的驱动程序;详细介绍WinCE下,流驱动程序的编写方法,同时将驱动通过Platform Builder编译进操作系统,最后用动态链接库的方式提供给用户使用。 关键词:WinCE 流驱动 I2C总线驱动程序 引言 随着以计算机技术、通信技术和软件技术为核心的信息技术的迅速发展,嵌入式系统在各行业得到了广泛的应用,极大地推动了行业的渗透性应用。嵌入式系统是“以应用为中心、以计算机技术为基础、软硬件可裁剪、适应应用系统对功能、可靠性、成本、体积、功耗严格要求的专用计算机系统”,由嵌入式硬件和嵌入式软件两部分组成。嵌入式软件包括嵌入式操作系统和嵌入式应用软件。Microsoft的桌面操作系统已经为人们熟悉和使用,嵌入式的操作系统Windows https://www.wendangku.net/doc/7716233872.html,也日益风行。Windows https://www.wendangku.net/doc/7716233872.html,是Microsof t推出的功能强大的紧凑、高效、可伸缩的32位嵌入式操作系统,主要面对各种各样的嵌入式系统和产品。该系统所具有的多线程、多任务、完全抢占式的特点是专为各种具有严格资源限制的硬件系统所设计的。为了将操作系统和硬件设备连接起来,联系硬件和软件的驱动就显得很重要。 下面主要针对三星公司ARM9内核的芯片S3C2410进行分析,介绍在Windows https://www.wendangku.net/doc/7716233872.html,系统下进行底层设备驱动开发的方法并提供I2C通信的实例。 1 I2C通信协议及S3C2410芯片介绍 I2C(Inter Integrated Circuit)总线是1980年由Philips公司推出的。 I2C总线用两条线(SDA和SCL)在总线和装置之间传递信息,在微控制器和外部设备之间进行串行通信或在主设备和从设备之间进行双向数据传送。两条通信线通过上拉电阻被拉升至+5 V。在控制系统中的每个集成电路可以通过一个CMOS缓冲器来读每一条线路,也可以通过一个栅极开路的FET管将每一条线的电平下拉。因此,对每个芯片来说,每条线既是输入线,又是输出线。 I2C总线遵从同步串行传输协议,即各位串行(一位接一位)发送,由时钟(clock)线指示读数据(d ata)线的时刻。每个数据包前有一个地址,以指示由哪个器件来接收该数据。 S3C2410是一款基于ARM920T的16/32位RISC微处理器,主要用于手持设备,拥有高性价比,低功耗等特点,也是目前市面上出现较多的嵌入式开发板的处理器之一。芯片拥有16 KB的指令和数据缓存器,有存储管理单元(MMU)、LCD控制器、3个串口、4路DMA、4个时钟定时器、8路10位的A/D转换;支持I2C、I2S、SPI、主从USB等接口以及SD/MMC卡。 S3C2410微处理器的I2C总线可以处于下面4种模式下:主接收模式、主发送模式、从接收模式和从发送模式。处理器对I2C进行的操作,主要是对下面的几个寄存器进行读/写: ◇ IIC控制寄存器,IICCON(物理地址0X54000000,内存映射后的虚拟地址);

I2C接口的EEPROM24C64芯片的驱动方法.pdf

I2C接口的EEPROM24C64芯片的驱动方法与93C46类似的,24C64也是EEPROM,但不同的是24C64是I2C接口的,容量也要更大些,用来存储较大容量的数据,甚至在某些单片机中可以用作程序存储器。 24C64提供65536个位,它们是以字节方式进行组织的。通过设置不同的地址,可以实现多达8个芯片共享两线总线。它被广泛应用于工业、化工等需要低功耗与低电压的领域。同时,它还提供诸如4.5V~5.5V、2.7V~5.5V、2.5V~5.5V与1.8V~5.5V各种工作电压范围的芯片,从而使其应用更加通用。 24C64 的引脚定义:引脚功能详细描述:24C64 的功能框图:

引脚功能描述: 串行时钟(SCL):在SCL的上升沿数据写入芯片中,在下降沿从芯片中读出数据。 串行数据(SDA):SDA用作双向数据传输。这个引脚是漏极开路驱动,需要加上拉电阻。设备地址(A2,A1,A0):A2~A0是设备地址设置引脚,可以通过接高或接低来设置不同的地址,也可以直接悬空。设置为不同地址时最多可以在同一总线上存在多达8个芯片。当这些引脚悬空时,默认地址为0。 写保护(WP):当此引脚接到GND上时,允许正常的写操作。当WP接到V CC时,所有的写操作都是被禁止的。如果悬空,则WP在内部被拉到GND。 24C64的组织方式: 24C64在内部被组织为256个页,每个页32个字节。可以按字节来进行操作,地址为13位。 24C64的操作方法: 24C64是采用I2C接口来进行数据传输的,在这里不再介绍I2C接口数据传输的相关内容,具体的I2C总线协议在相关章节有详细讲解,敬请翻阅。下面只针对于24C64的操作方法进行讲解。 1)设备寻址 在开始条件使芯片使能后,需要给其写入一个8位的设备地址码,以使某一芯片被命中。在地址码的开头有两个“10”序列,共4位,然后是3位的地址,最后是1位的读写标识位。具体的地址码结构如下: 24C64使用3个设备地址位A2、A1、A0使多达8个芯片同时存在于一条总线上。这个地址码被每一个芯片与自身设置的地址相比较。 第8位是读/写操作选择位。如果是1的话,一个读操作将被初始化,而如果是0的话,则一个写操作将被初始化。 2)写操作 1.任意字节写:在进行写操作时,在设备地址与回复后,需要写入两个8位地址。在收到地址后,芯片会返回一个低电平,然后就可以写入一个8位数据。在收到这个8位数据后,芯片会返回一个低电平,此时应产生一个停止条件。芯片开始自身的读入过程。在读入过程中,所有的数据输入都是无效的,芯片也不会给予回复。

(完整word版)24C02I2C驱动程序(详细全)

/*---------------------------------------24C02.h-----------------------------------*/ #ifndef _24C02_H #define _24C02_H /* Includes ----------------------------------------------------------------*/ #include "STC15F2K60S2.h" #include "stdbool.h" /* Define ------------------------------------------------------------------*/ #define WC24C02 0xa0 //器件地址写 #define RC24C02 0xa1 //器件地址读 #define MAXSIZE24C02 256 //AT24C02最多256个字节2K bits 32页 #define I2C_PAGESIZE 8 //AT24C02每页有8个字节 #define delayNOP() _nop_();_nop_();_nop_();_nop_() //延时 sbit SDA = P2^5; //定义数据线 sbit SCL = P2^6; //定义时钟线 /* Private ------------------------------------------------------------------*/ /* Public -------------------------------------------------------------------*/ uint idata ucSendBuffer[8]={0x01,0x02,0x04,0x08, 0x10,0x20,0x40,0x80}; uint idata ucReceData; uint idata ucReceiveBuffer[8]; //从器件中读出的多字节数据暂存区 /* Function Declaration -----------------------------------------------------*/ bool I2CStart(void); //启动I2C void I2CStop(void); //停止I2C void I2CAck(void); //应答信号 void I2CNoAck(void); //发送非应答信号 bool I2CWaitAck(void); //检测应答位 void I2CSendByte(u8 demand);

i2c,lcd usb驱动

----杨军(2012 年 4 月 5 日)
一、 uboot 启动流程
第一阶段启动流程: cpu/arm920t/start.S(汇编阶段)
进入 SVC-->关闭看门狗-->关闭中断-->进入 cpu_init_crit()--->(临时设置栈指针 SP)-->调整 CPU 的频率 clock_init() -->把完
整的 {初始化 CPU 和 SDRAM 1.刷新出去 I/D cache 2.关闭 MMU 和 cache(一定关闭数据 CACHE,指令 CACHE 无所谓) 3.调用 lowlevel_init}
UBOOT 代码从 FLASH 搬移到 SDRAM 中 CopyCode2Ram() -->清除 BSS、设置堆栈-->跳入真正的 C 函数 start_armboot
第二阶段启动流程:
使能 I/D cache,配置 GPIO 端口【board_init()】 -->:注册倒计时定时器,初始化一个早期串口-->输出 UBOOT 第一条打印 -->NOR/NAND FLASH 初始化-->把环境参数读到 SDRAM-->建立设备管理链表-->重新初始化串口为全功能串口-->网卡初始化-->
进入 main_loop()大循环 第一二两个阶段合到一起的描述(这个过程要求面试的时候直接能够说的出来): UBOOT 的启动流程:
首先初始化 CPU(进 SVC,关看门狗,关中断,调整 CPU 频率)和 RAM(SDRAM 和 DDR 都需要初始化一次), 将 FLASH 上的 BUOOT
拷贝到 RAM 中,清除 BSS 和设置堆栈指针,跳转到 C 函数,接着初始化外设(GPIO 口设置,串口初始化,完整功能的 FLASH,, 网卡初始化),进入一个大的循环检测用户是否有按键按下,如有按下: 停止倒计时,等待用户的后续输入;若 规定时间里面 没有按下,执行 bootcmd 所保存的指令(经常这时是加载内核),然后启动内核
二、 内核启动过程
head.S arch\arm\boot\Compressed(解压内核)—》head.S arch\arm\Kernel(初始化工作)—》head-common.S arch\arm\Kernel(start_kernel 执行内核) start_kernel() [init/main.c] //vmlinux 的第一个 C 函数 -->setup_arch() 处理 UBOOT 传递过来的 TAG 参数(内存其实位置和大小,bootgars) 把 bootargs 参数各项进行拆解(后续代码可以用__setup()接收参数,例如: __setup("init=", init_setup);) 建立 4KB/页的内存管理,丢弃之前 arch/arm/kernel/head.S 中建立的 1MB/段的内存映射关系

i2c设备驱动实例分析

i2c设备驱动实例分析 刚学习到i2c驱动这一块,在linux内核源码中(我用的是linux-2.6.38.6)有pca9541.c的驱动源码,所以我就拿该实例来学习i2c设备驱动开发。我在网上找了该设备的相关资料(主要是工作原理和datasheet),下面我把我的分析思路记录下来,作为我以后学习的参考资料。里面有许多我暂时不理解的地方,欢迎朋友们帮忙解决。谢谢! /*************** **(1)头文件** ***************/ #include <linux/module.h> #include <linux/init.h> #include <linux/jiffies.h> #include <linux/delay.h> #include <linux/slab.h> #include <linux/device.h> #include <linux/i2c.h> #include <linux/i2c-mux.h>

#include <linux/i2c/pca954x.h> /**************** **(2)宏定义** ****************/ #define PCA9541_CONTROL 0x01 #define PCA9541_ISTAT 0x02 #define PCA9541_CTL_MYBUS (1 << 0) #define PCA9541_CTL_NMYBUS (1 << 1) #define PCA9541_CTL_BUSON (1 << 2) #define PCA9541_CTL_NBUSON (1 << 3) #define PCA9541_CTL_BUSINIT (1 << 4) #define PCA9541_CTL_TESTON (1 << 6) #define PCA9541_CTL_NTESTON (1 << 7) #define PCA9541_ISTAT_INTIN (1 << 0) #define PCA9541_ISTAT_BUSINIT (1 << 1) #define PCA9541_ISTAT_BUSOK (1 << 2) #define PCA9541_ISTAT_BUSLOST (1 << 3)

linux下i2c驱动源码详解

Linux i2c驱动详细分析. 首先在S3C2440平台的初始化函数中,主要是将开发平台的设备注册进了系统,也就是将device注册到了platform虚拟的总线上,并进行了一些初始化的工作,这里我们只关注I2C的部分。 static void __init smdk2440_machine_init(void) { s3c24xx_fb_set_platdata(&smdk2440_fb_info); s3c_i2c0_set_platdata(NULL); platform_add_devices(smdk2440_devices, ARRAY_SIZE(smdk2440_devices)); smdk_machine_init(); } s3c_i2c0_set_platdata()函数将S3C2440上的I2C控制器进行了一些初始化,但是并没有写入硬件寄存器,仅仅是保存在了 s3c2410_platform_i2c结构体中。 void __init s3c_i2c0_set_platdata(struct s3c2410_platform_i2c *pd) { struct s3c2410_platform_i2c *npd; if (!pd) pd = &default_i2c_data0;

npd = kmemdup(pd, sizeof(struct s3c2410_platform_i2c), GFP_KERNEL); if (!npd) printk(KERN_ERR "%s: no memory for platform data\n", __func__); else if (!npd->cfg_gpio) npd->cfg_gpio = s3c_i2c0_cfg_gpio; /* s3c_i2c0_cfg_gpio为 配置I2C控制器GPIO函数指针 */ s3c_device_i2c0.dev.platform_data = npd; /*最后将struct device 中的platform_data指针直指向了初始化后的 s3c2410_platform_i2c结构体 */ } 函数s3c_i2c0_cfg_gpio()很简单,实际上就是配置GPIO为I2C的工作模式 void s3c_i2c0_cfg_gpio(struct platform_device *dev) { s3c2410_gpio_cfgpin(S3C2410_GPE(15), S3C2410_GPE15_IICSDA); s3c2410_gpio_cfgpin(S3C2410_GPE(14), S3C2410_GPE14_IICSCL); } s3c_i2c0_set_platdata(struct s3c2410_platform_i2c *pd)函数实际上就是把初始化数据段中的default_i2c_data0结构体复制过来,然后对GPIO进行配置的函数指针进行了初始化。default_i2c_data0结构体如下:

相关文档