I2C EEPROM读写设计与制作

四川理工学院课程设计书学院计算机学院专业计算机科学与技术班级2013级 4 班课程嵌入式系统软硬件开发及应用实践题目I2C EEPROM读写设计与制作教师杨维剑学生龚程金黄雨杨坤陈超王俊枭摘要随着计算机系统及电子系统的飞速发展,信息的存储也越来越重要,EEPROM (电可擦写可编程只读存储器)是可用户更改的只读存储器(ROM),其可通过高于普通电压的作用来擦除和重编程(重写),断电后存在其中的数据不会丢失,通常用于存放硬件信息,如mac地址、BIOS芯片等,并在嵌入式ARM系统中应用广泛,IIC作为一种常见的总线技术,其方便扩展外围设备的特性使得其应用广泛,AT24C02是一款性价比超高的IIC接口EEPROM,擦写次数多、稳点不易丢失数据,本文将设计并制作ARM系统,并在Linux中实现I2C EEPROM读写。

关键词:ARM,EEPROM,IIC,AT24C02,Linux目录一、LinuxI2C驱动--概述 (1)1.1 设计任务与要求 (1)1.2 I2C (1)1.3 硬件 (1)1.4 软件 (1)二、硬件电路设计 (2)2.1 电路设计要求 (2)2.2 原理图的绘制 (2)2.2.1电源接口 (2)2.2.2UART接口 (3)2.2.3AT24C02接口 (3)2.3 PCB板的制作 (3)三、LinuxI2C驱动--I2C总线 (5)3.1 I2C总线物理结构 (5)3.2 I2C总线特性 (5)3.3 开始和停止条件 (6)3.4 数据传输格式 (6)3.5 响应 (7)3.6 总线仲裁 (8)四、LinuxI2C驱动--解析EEPROM的读写 (9)4.1 概述 (9)4.2 设备地址 (9)4.3 读eeprom (9)4.4 写eeprom (10)五、LinuxI2C驱动--访问eeprom (10)5.1 通过sysfs文件系统访问I2C设备 (10)5.2 通过devfs访问I2C设备 (11)5.3 总结 (11)六、LinuxI2C驱动--浅谈LinuxI2C驱动架构.. 126.1 I2C体系结构 (13)6.2 I2C重要数据结构 (13)七、LinuxI2C驱动--I2C设备驱动 (14)7.1 eeprom板级设备资源 (14)7.2 AT24C02 EEPROM 的I2C设备驱动 (14)7.2.1 at24_driver (14)7.2.3 at24_bin_read() (15)7.2.4 at24_bin_write() (15)7.3 总结 (15)八、LinuxI2C驱动--I2C总线驱动 (16)8.1 三星S3C2410 i2c适配器的硬件描述 (16)8.2 i2c总线驱动的加载/卸载 (17)8.3 i2c总线驱动的probe (17)8.4 启动i2c传输 (18)8.5 通过中断来推进i2c的传输 (18)课程设计体会 (19)参考文献 (20)附录 A (21)附录 B (29)一、LinuxI2C驱动--概述1.1 设计任务与要求1)通过软件基于I2C协议对EEPROM读写功能的实现。

2)需要有EEPROM读写功能的具体实现过程。

linux i2c体系结构的三大组成:i2c核心,i2c总线驱动,i2c设备驱动,通过设计,了解I2C协议的基本原理,并对EEPROM读写功能的实现有个系统的概念,对其实现过程比较清楚。

同时,在设计中,巩固我们所学的理论知识。

1.2 I2CI2C总线是由Philips公司开发的两线式串行总线,这两根线为时钟线(SCL)和双向数据线(SDA)。

由于I2C总线仅需要两根线,因此在电路板上占用的空间更少,带来的问题是带宽较窄。

I2C在标准模式下传输速率最高100Kb/s,在快速模式下最高可达400kb/s。

属于半双工。

在嵌入式系统中,I2C应用非常广泛,大多数微控制器中集成了I2C总线,一般用于和RTC,EEPROM,智能电池电路,传感器,LCD以及其他类似设备之间的通信。

1.3 硬件CPU型号:Samsung S3C2410EEPROM型号:AT24C021.4 软件linux版本:Linux 2.6.35.7I2C总线驱动:drivers/i2c/busses/i2c-s3c2410.ceeprom驱动:drivers/misc/eeprom/at24.c二、硬件电路设计2.1 电路设计要求使用ARM芯片读写EEPROM,本设计中采用的ARM 芯片S3C2410,S3C2410处理器是Samsung公司基于ARM公司的ARM920T处理器核,采用FBGA封装,采用0.18um制造工艺的32位微控制器。

该处理器拥有:3路UART,IIC-BUS 接口等;EEPROM采用的是AT24C02,AT24C02是一个2K位串行CMOS E2PROM,内部含有256个8位字节,CATALYST公司的先进CMOS技术实质上减少了器件的功耗。

AT24C02有一个8字节页写缓冲器。

该器件通过IIC总线接口进行操作,有一个专门的写保护功能。

并完成串口设计与JTAG在线调试接口设计。

2.2 原理图的绘制主要分为电源接口部分、UART接口部分、AT24C02接口部分的绘制。

2.2.1电源接口电源部分主要使用LM1117系列和AS1117系列芯片将电源转换为2.5V,3.3V和5V为系统不同器件提供电源,包括复位电路。

如图2.1所示。

图 2. 1电源转换2.2.2UART接口本电路主要使用MAX3232芯片输出RS-232信号,使调试更为方便。

如图2.2所示。

图2.2UART接口2.2.3AT24C02接口本电路主要实现AT24C02器件与IIC总线的连接,如图2.3所示。

图2.3AT24C02接口2.3 PCB板的制作制作PCB板,完成对应引脚封装,最终2D视图如图2.4所示,3D视图如图2.5所示。

图2.4PCB2d视图图2.5PCB3D视图三、LinuxI2C驱动--I2C总线本节分析下I2C总线协议,因为我的开发板是三星S3C2410芯片,所以就以此为例。

3.1 I2C总线物理结构I2C总线在物理连接上非常简单,分别由SDA(串行数据线)和SCL(串行时钟线)及上拉电阻组成。

通信原理是通过对SCL和SDA线高低电平时序的控制,来产生I2C总线协议所需要的信号进行数据的传递。

在总线空闲状态时,这两根线一般被上面所接的上拉电阻拉高,保持着高电平。

3.2 I2C总线特性每个连接到总线的器件都可以通过唯一的地址和一直存在的简单的主机/从机关系来软件设定地址多主机总线,如果两个或者更多的主机同时初始化数据传输,可以通过仲裁防止数据被破坏。

串行8位双向数据传输标准模式传输速率为100kbits/s快速模式传输速率为400kbits/s7位地址模支持主机发、主机收,从机发、从机收3.3 开始和停止条件当SCL是高电平时,SDA线由高电平向低电平切换,表示开始;当SCL是高电平时,SDA线由低电平向高电平切换,表示停止。

如下图所示。

3.4 数据传输格式发送到SDA线上的每个字节必须为8位,每次传输可以发送的字节数不受限制,但是每个字节后面必须跟一个响应位。

3.5 响应数据传输必须带响应,响应时钟脉冲由主机产生,在SCL 的第9个时钟脉冲上,前8个时钟脉冲用来传输8位即1byte 的数据。

当发送端收到响应时钟脉冲的时候就会拉高SDA 从而释放SDA 线,而接收端通过拉低SDA 先来表示收到数据,即SDA 在响应期间保持低电平。

3.6 总线仲裁当两个主机在总线上产生竞争时就需要仲裁。

SDA线低电平的优先级高于高电平。

当一个主机首先产生低电平,而紧接着另一个主机产生高电平,但是由于低电平的优先级高于高电平,所以总线成低电平,也就是发低电平的主机占有总线而发高电平的主机不占有总线。

如果两个主机都是发送低电平,那么继续比较下一个时钟周期的电平来决定谁占有总线,以此类推。

四、LinuxI2C驱动--解析EEPROM的读写4.1 概述AT24C02 的存储大小是1K,页大小是8个字节。

4.2 设备地址7位地址,前四位是1010,后三位由芯片引脚决定,由原理图可知后三位是000,也就是设备地址为0x50,因为数据传输是8位的,最后一位决定是读还是写。

4.3 读eeprom读任意地址eeprom的数据,首先第一个字节得先在SDA上发出eeprom的设备地址,也就是0x50,并且8位数据的最后一位是低电平表示写设备,然后第二个字节是要读的数据在eeprom内的地址,这样以后再产生开始条件,第三个字节在SDA上发出设备地址,此时的最后一位是高电平,表示读设备,第四个字节的数据就是读eeprom的对应地址的数据。

可以看到,读eeprom需要两个开始条件,也就是2条消息,第一条消息写eeprom确定读的位置,大小为2个字节,第二条消息才是真正的读eeprom。

4.4 写eeprom写eeprom就相对简单,只需一个开始条件,第一个字节发出设备地址和置最低位为低电平表示写eeprom,第二个字节发出要读数据在eerpom的地址,第三个字节读到的数据就对应地址在eeprom上的数据五、LinuxI2C驱动--访问eeprom本小节介绍两个在linux应用层访问eeprom的方法,并给出示例代码方便大家理解。

第一个方法是通过sysfs文件系统对eeprom进行访问,第二个方法是通过eeprom的设备文件进行访问。

这两个方法分别对应了i2c设备驱动的两个不同的实现,在后面的小结会详细的分析。

5.1 通过sysfs文件系统访问I2C设备eeprom的设备驱动在/sys/bus/i2c/devices/0-0050/目录下把eeprom设备映射为一个二进制节点,文件名为eeprom。

对这个eeprom文件的读写就是对eeprom进行读写。

我们可以先用cat命令来看下eeprom的内容。

发现里面都是乱码,然后用echo命令把字符串“test”输入给eeprom文件,然后再cat出来。

就会发现字符串test已经存在eeprom里面了,我们知道sysfs文件系统断电后就没了,也无法对数据进行保存,为了验证确实把“test”字符串存储在了eeprom,可以把系统断电重启,然后cat eeprom,会发现test还是存在的,证明确实对eeprom进行了写入操作。

当然,因为eeprom已经映射为一个文件了,我们还可以通过文件I/O写应用程序对其进行简单的访问测试。

比如以下程序对特定地址(0x40)写入特定数据(Hi,this is an eepromtest!),然后再把写入的数据在此地址上读出来。

5.2 通过devfs访问I2C设备linux的i2c驱动会针对每个i2c适配器在/dev/目录下生成一个主设备号为89的设备文件,简单的来说,对于本例的eeprom驱动,/dev/i2c/0就是它的设备文件,因此接下来的eeprom的访问就变为了对此设备文件的访问。

合集下载

I2C读写EEPROM文档说明

I2C读写EEPROM文档说明

通过I2C通讯协议对EEPROM进行读写操作发送串口进行通讯一.描述I2CI2C协议有启动,终止,应答,非应答四种信号,有按位发送数据,按位接收数据,有读操作和写操作。

1.启动I2C程序如下,保持SCL为高电平,SDA为高电平,当检测到SDA下降沿时,启动传送,如果2个信号没有被高则返回0。

程序启动成功返回1。

uint8 I2C_Start(void){CyDelayUs(10);SDA_Write(1);CyDelayUs(10);SCL_Write(1);CyDelayUs(10);if ( SDA_Read() == 0) return 0;if ( SCL_Read() == 0) return 0;SDA_Write(0);CyDelayUs(10);SCL_Write(0);CyDelayUs(10);return 1;}上面是模仿I2C启动时序2.终止传送程序如下SDA保持低电平SCL保持高电平而后拉高SDA,系统检测到SDA上升沿则终止传送。

void I2C_Stop(void){CyDelayUs(10);SDA_Write(0);CyDelayUs(10);SCL_Write(1);CyDelayUs(10);SDA_Write(1);CyDelayUs(10);}3.模拟应答信号,让SDA的低电平时间大于SCL的高电平时间,即可应答;也就是SDAvoid I2C_Ack(void){CyDelayUs(10);SDA_Write(0);CyDelayUs(10);SCL_Write(1);CyDelayUs(10);SCL_Write(0);CyDelayUs(10);}4.模拟非应答信号,让SDA的高电平时间大于SCL高电平时间,就是非应答void I2C_Nack(void){CyDelayUs(10);SDA_Write(1);CyDelayUs(10);SCL_Write(1);CyDelayUs(10);SCL_Write(0);CyDelayUs(10);}5.按位发送数据,按位发送数据的要求是数据位高电平的时间大于SCL,SCL高电平时不允许数据位电平变化,只有SCL低电平时才可以任意变换。

基于I^2C接口EEPROM读写控制器设计

基于I^2C接口EEPROM读写控制器设计
了 一 种 性 能 优 越 的
2 E E P R 0M 读 写 控 制 器 模 块 的 设 计 与 实现
在进 行数 据传 输 时 , 读 写 控 制 器 首 先 产 生 一 个 启 动
信号( 当 S C L为 高 电 平 时 , S D A 由高 变 为低 ) , 接 着 发 送 控 制字 ( 即 I 2 C总线器 件 的特 征编 码 和 3 b i t E E P R OM 的
Ab s t r a c t :T h e I n t e r - I n t e g r a t e d Ci r c u i t ( I C)b u s p r o t o c o l i s i n t r o d u c e d b r i e l f y .Us i n g F i e l d — P r o g r a mma b l e Ga t e Ar r a y( F P GA)
线器 件特 征码 为 1 0 1 0. 而 3 b i t E E P R OM 的 芯 片 地 址 为 0 0 0。 接着 主控 制器 释放 总线 , 等待 E E P R O M 发 出 的 应 答 信号, 由于采 用 的 E E P R O M 型号 是 2 4 L C 6 4, 因 此 在 控 制 器 收到应答 后 , 将 首先发送 E E P R O M 高 字 节 的 存 储 单 元 地址 。 当控制 器再 次收到 应答后 继续 发送 E E P R O M 低 字
双 向两 线 串行 总线 I 2 C( I n t e r — I n t e g r a t e d C i r c u i t ) 总 线 。 进
行 F P G A设 计 时经 常需 要与 外 围提 供 I 2 C接 口 的 芯 片 进

使用Verilog来实现EEPROM的读写,进行一个简单的I2C实战应用

使用Verilog来实现EEPROM的读写,进行一个简单的I2C实战应用

这个 I2C 总线的时序是一致的。 EEPROM 应答 输出应答 sclk 的第九个周期给出,低电平应答。如果主机没有收到应答, 需要重新配置。 数据传输时序 sda 数据线在 scl 时钟的下降沿中间变化,可以避免产生误触开始结束标 志。 I2C Design i2c_start 为高电平有效,传输完成后会产生一个 i2c_done 结束标志,表示 操作完成。 I2C 状态转移图 I2C 写操作
SDA 双向 Pin A2,A1,A0 Device Addr default all 0,只操作一片可悬空引脚。 WP 接地正常读写,WP 接 Vcc 写操作被禁止 字节寻址地址ห้องสมุดไป่ตู้是由 12(AT24C32)或 13bit(AT24C64)的地址组成, 需要操作 16 位字地址高 3 或 4 位忽略即可。 Device Address 8’hA0 写器件地址,8’hA1 读器件地址 写字节操作 随机读字节操作 我这个芯片是双字节数据地址,所以在写数据地址时要写两次,先是高字 节后是低字节。 开始结束标志
(1)产生 start 位 (2)传送器件地址 ID_Address,器件地址的最后一位为数据的传输方向 位,R/W,低电平 0 表示主机往从机写数据(W),1 表示主机从从机读数据 (R)。这里按照手册给出的操作图,应该是 W 即低电平。ACK 应答,应答 是从机发送给主机的应答,这里不用管。 (3)传送写入器件寄存器地址,即数据要写入的位置。同样 ACK 应答 不用管。 (4)传送要写入的数据。ACK 应答不用管。 (5)产生 stop 信号。 I2C 读操作 (1)产生 start 信号
其他部分没啥好说的根据时序图写就行了,需要注意的一点是我们应该在 sclk 的高电平的中间采样数据,在 sclk 低电平的中间改变数据,当 sclk 为高 电平的时候,sda 为出现下降沿为 start 位, sda 出现上升沿为 stop 位,所以 在 sclk 为高电平的时候 sda 应该保持稳定不能随意乱动。这就又回到了数据 传输有效的条件,只有在 sclk 为低电平期间,才允许数据变化,在高电平期 间,不允许数据变化,否则就会出现起始位或结束位。 EEPROM 有个仿真模型,在夏雨闻老师的书里面就有,这个模型默认是 200khz 的 sclk 驱动,仿真的时候可以将时间参数改小,我这里也分享出来。 仿真模型代码点击阅读原文可以查看。 根据仿真模型仿真的话基本不会有什幺问题,需要注意的是操作的完成标 志。从仿真上看到输入读写都没问题,但是 stop 标志没产生好,仿真看到读 写操作没问题,但实际还是不行的,需要严格按照 EEPROM 的手册操作时序 进行,差一点就不行。 我最后使用拨码开关作为读写使能,数码管显示读出来的输出,最后实现 了对指定存储地址读写数据。

单片机模拟I2C总线读写EEPROM(24CXX)程序一

单片机模拟I2C总线读写EEPROM(24CXX)程序一

单片机模拟I2C总线读写EEPROM(24CXX)程序一下面是一个最简单的读写程序,可以用来检测线路状况。

先附上程序和电路,后面附有说明。

电路:说明:P2 口的LED 都是我用来检测电路执行到哪一步的,个人觉得一目了然。

程序:#include #define unit unsigned int#define uchar unsigned charint ok;sbit scl=P0;sbit sda=P0;sb it led0=P2;sbit led1=P2;sb it led2=P2 ;sbit led3=P2;sb it led4=P2;sb it led5=P2 ;sbit led6=P2;sb it led7=P2;delay(void) //delay{ int i; led1=1; for(i=0;istart(void) //start{ sda=1; scl=1; delay(); sda=0; delay(); scl=0; led0=0;}stop(void) //stop{ sda=0; scl=1; delay(); sda=1; delay(); scl=0;}checkanswer(void) //check answer{ sda=1; scl=1; if(sda==1) { F0=1; led7=0; } scl=0; led3=0;}sendabyte(int temps) //send a byte{ uchar n=8; while(n--) { led2=1; if((temps&0x80)==0x80){ sda=1; scl=1; delay(); scl=0;}else{ sda=0; scl=1; delay(); scl=0;}temps=tempsreciveabyte() //recive a byte{ uchar n=8,tempr; while(n--) {//uchar idata *abyte scl=1;tempr=temprmain(void) //MAIN{start();sendabyte(0xa0);checkanswer();if(F0==1) return;sendabyte(0x00);checkanswer();if(F0==1) return;sendabyte(0x11);checkanswer();if(F0==1) return;/*-----------------------*/start(); sendabyte(0xa0);checkanswer();if(F0==1) return;。

I2C总线编程实例(k1-k4:写入、读取、加+、清零)【EEPROM-AT24C02】

I2C总线编程实例(k1-k4:写入、读取、加+、清零)【EEPROM-AT24C02】

I2C总线编程实例(k1-k4:写⼊、读取、加+、清零)【EEPROM-AT24C02】(1)AT24C02是⼀种EEPROM元器件,是⼀种只读寄存器,断电保持,可保存数据100年, 是⼀种可擦除读写的芯⽚,相当于ROM硬盘,在下⾯实验中充当从机⾓⾊;(2)51在下⾯实验中充当主机⾓⾊;(3)在IIC总线标准协议上,进⾏51单⽚机(主机)和AT24C02(从机)的相互读写数据的操作。

⼩结:51单⽚机和各种EEPROM芯⽚之间可以通过IIC总线标准协议进⾏数据交互(通信)的。

实验:四个独⽴按键对应四个不同的功能,k1:将数据写⼊单⽚机,断电保存k2:读取上次保存的数据,断电后仍可读取上次保存的数据k3:当前数据+1k4:当前数据清零------------------------------------------------------------- 采⽤多⽂件的框架模式 -------------------------------------------------------------i2c.h:/*这个⽂件进⾏宏定义:定义I2C串⾏总线的相关数据端⼝、⽅法函数,以及定义⼀些使⽤频率较⾼的元素*/#ifndef _I2C_H_ // 如果没有定义宏#define _I2C_H_ // 定义⼀个宏// 需要⽤到51单⽚机的管脚,所以需要引⼊库⽂件#include <reg52.h>// 查单⽚机原理图可知(其中,SCL是时钟线,SDA是数据线)sbit SCL=P2^1;sbit SDA=P2^0;/* 相关函数 */// I2C的起始信号函数void I2cStart();// I2C的终⽌信号函数void I2cStop();// I2C发送(写⼊)字节函数,成功返回1,失败返回0unsigned char I2cSendByte(unsigned char dat);// I2C接收(读取)字节函数,返回读取的数据unsigned char I2cReadByte();// AT24C02芯⽚的写⼊数据函数void At24c02Write(unsigned char addr, unsigned dat);// AT24C02芯⽚的读取数据函数,返回读取的数据unsigned char At24c02Read(unsigned char addr);#endif // 结束i2c.c:/* 这个⽂件专门针对I2C模块的编程,其他模块可以新建另外⼀个⽂件 */#include <i2c.h> // 引⼊I2C的库⽂件/******************************************************************************** 函数名 : Delay10us()* 函数功能 : 延时10us* 输⼊ : ⽆* 输出 : ⽆*******************************************************************************/void Delay10us() //误差 0usunsigned char a,b;for(b=1;b>0;b--)for(a=2;a>0;a--);}/******************************************************************************** 函数名 : I2cStart()* 函数功能 : 起始信号:在SCL时钟信号在⾼电平期间SDA信号产⽣⼀个下降沿* 输⼊ : ⽆* 输出 : ⽆* 备注 : 起始之后SDA和SCL都为0,表⽰总线被主机占⽤*******************************************************************************/void I2cStart(){// 根据各个单⽚机的时序图来写SDA=1;Delay10us();SCL=1;Delay10us(); // 建⽴时间是SDA保持时间>4.7usSDA=0;Delay10us(); // 保持时间是>4usSCL=0;Delay10us();}/******************************************************************************** 函数名 : I2cStop()* 函数功能 : 终⽌信号:在SCL时钟信号⾼电平期间SDA信号产⽣⼀个上升沿* 输⼊ : ⽆* 输出 : ⽆* 备注 : 结束之后保持SDA和SCL都为1;表⽰总线处于空闲状态*******************************************************************************/void I2cStop(){// 根据各个单⽚机的时序图来写SDA=0;Delay10us();SCL=1;Delay10us(); // 建⽴时间是SDA保持时间>4.7usSDA=1;Delay10us(); // 保持时间是>4us}/******************************************************************************** 函数名 : I2cSendByte(unsigned char dat)* 函数功能 : 通过I2C发送⼀个字节。

STM32F4利用I2C向EEPROM写入、读取数据步骤

STM32F4利用I2C向EEPROM写入、读取数据步骤

STM32F4利⽤I2C向EEPROM写⼊、读取数据步骤
写⼊⼀个字节:
第⼀步:使⽤库函数I2C_GenerateSTART()产⽣I2C起始信号,调⽤库函数I2C_CheckEvent()检测事件,若检测到下⼀事件,则进⼊通讯下⼀阶段
第⼆步:调⽤库函数I2C_Send7bitAddress()发送EEPROM的设备地址,并把数据传输⽅向设置为I2C_Direction_Transmitter(即发送⽅向),发送地址后以同样的⽅式检测相应的事件。

第三步:调⽤库函数I2C_SendData向EEPROM发送要写⼊的地址,发送完后等待EV8事件的产⽣。

第四步:继续调⽤库函数I2C_SendData向EEPROM发送要写⼊的数据,然后等待EV8事件的产⽣。

第五步:通讯结束,调⽤I2C_GenerateSTOP发送停⽌信号。

读取⼀字节的数据:
第⼀步:通过库函数I2C_GETFlagStatus()查询库函数是否处于忙碌状态,若不忙碌,则进⼊下⼀状态。

第⼆步:使⽤库函数I2C_GenerateSTART()产⽣起始信号,调⽤库函数I2C_CheckEvent()检测Event1,若检测成功则进⼊下⼀阶段。

第三步:发送EEPROM的设备地址,⽅向为I2C_Direction_Transmitter(即写⽅向),检测事件6
第四步:利⽤库函数I2C_Cmd重新使能I2C外设
第五步:利⽤库函数I2C_Senddata()发送要读取的EEPROM的内部地址,检测Event8事件的产⽣
第六步:产⽣第⼆次I2C起始信号,并检测相关事件
第七步:发送I2C设备地址
第⼋步:读取数据。

I2C EEPROM读写设计与制作

四川理工学院课程设计书学院计算机学院专业计算机科学与技术班级2013级 4 班课程嵌入式系统软硬件开发及应用实践题目I2C EEPROM读写设计与制作教师杨维剑学生龚程金黄雨杨坤陈超王俊枭摘要随着计算机系统及电子系统的飞速发展,信息的存储也越来越重要,EEPROM (电可擦写可编程只读存储器)是可用户更改的只读存储器(ROM),其可通过高于普通电压的作用来擦除和重编程(重写),断电后存在其中的数据不会丢失,通常用于存放硬件信息,如mac地址、BIOS芯片等,并在嵌入式ARM系统中应用广泛,IIC作为一种常见的总线技术,其方便扩展外围设备的特性使得其应用广泛,AT24C02是一款性价比超高的IIC接口EEPROM,擦写次数多、稳点不易丢失数据,本文将设计并制作ARM系统,并在Linux中实现I2C EEPROM读写。

关键词:ARM,EEPROM,IIC,AT24C02,Linux目录一、LinuxI2C驱动--概述 (1)1.1 设计任务与要求 (1)1.2 I2C (1)1.3 硬件 (1)1.4 软件 (1)二、硬件电路设计 (2)2.1 电路设计要求 (2)2.2 原理图的绘制 (2)2.2.1电源接口 (2)2.2.2UART接口 (3)2.2.3AT24C02接口 (3)2.3 PCB板的制作 (3)三、LinuxI2C驱动--I2C总线 (5)3.1 I2C总线物理结构 (5)3.2 I2C总线特性 (5)3.3 开始和停止条件 (6)3.4 数据传输格式 (6)3.5 响应 (7)3.6 总线仲裁 (8)四、LinuxI2C驱动--解析EEPROM的读写 (9)4.1 概述 (9)4.2 设备地址 (9)4.3 读eeprom (9)4.4 写eeprom (10)五、LinuxI2C驱动--访问eeprom (10)5.1 通过sysfs文件系统访问I2C设备 (10)5.2 通过devfs访问I2C设备 (11)5.3 总结 (11)六、LinuxI2C驱动--浅谈LinuxI2C驱动架构.. 126.1 I2C体系结构 (13)6.2 I2C重要数据结构 (13)七、LinuxI2C驱动--I2C设备驱动 (14)7.1 eeprom板级设备资源 (14)7.2 AT24C02 EEPROM 的I2C设备驱动 (14)7.2.1 at24_driver (14)7.2.3 at24_bin_read() (15)7.2.4 at24_bin_write() (15)7.3 总结 (15)八、LinuxI2C驱动--I2C总线驱动 (16)8.1 三星S3C2410 i2c适配器的硬件描述 (16)8.2 i2c总线驱动的加载/卸载 (17)8.3 i2c总线驱动的probe (17)8.4 启动i2c传输 (18)8.5 通过中断来推进i2c的传输 (18)课程设计体会 (19)参考文献 (20)附录 A (21)附录 B (29)一、LinuxI2C驱动--概述1.1 设计任务与要求1)通过软件基于I2C协议对EEPROM读写功能的实现。

基于IIC协议的EEPROM读写功能的实现

基于IIC协议的EEPROM 读写功能的实现(一)设计要求能用IIC协议实现对EEPROM的数据储存与读出。

(二)设计目的1. 通过本项课程设计,可以培养独立思考、综合运用所学有关相应知识的能力,能更好的巩固《单片机原理与应用》课程学习的内容,掌握工程软件设计的基本方法,强化上机动手编程能力,闯过理论与实践相结合的难关!更加了解了单片机的好处和其可用性!同时增加了同学之间的团队合作精神!更加也体会到以后在工作中团队合作的重要性和必要性!2. 通过课程设计,使学生了解高级程序设计语言的结构,掌握基本的程序设计过程和技巧,掌握基本的分析问题和利用计算机求解问题的能力,具备初步的高级语言程序设计能力。

为后续各门课程的学习和毕业设计打下坚实基础。

3、知道IIC串行总线协议原理与运用,明白EEPROM的存储结构,知道用keil51软件和proteus仿真进行连调,实习单片机开发。

(三) 所用仪器设备电脑、keil51和proteus软件(四) 方案选择由于用IIC串行总线读写EEPROM我们不能直观的观察他们的读写现象,所以我们选择的是用液晶1602进行读写显示,用4*4矩阵键盘进行读写控制和数字的输入,选用AT89C51为主控制器,选用AT24C02进行存储。

所以这个课程设计主要分为三个模块:1、IIC串行总线读写EEPROM模块;2、液晶显示模块;3、矩阵键盘控制模块;(五) 具体的设计过程现将IIC协议与AT24C02的工作原理讲解如下,关于液晶与AT89C51的工作原理这里不再讲解。

一、IIC串行总线的组成与通信原理I2C总线是PHLIPS公司推出的一种串行总线,是具备多主机系统所需的包括总线裁决和高低速器件同步功能的高性能串行总线。

I2C总线只有两根双向信号线。

一根是数据线SDA,另一根是时钟线SCL。

I2C总线通过上拉电阻接正电源。

当总线空闲时,两根线均为高电平。

连到总线上的任一器件输出的低电平,都将使总线的信号变低,即各器件的SDA及SCL都是线“与”关系。

基于STM32F103的I2C总线EEPROM的读写(带超时检测)

基于STM32F103的I2C总线EEPROM的读写(带超时检测)————————————————————————————————作者:————————————————————————————————日期:【原创】基于STM32F103的I2C总线EEPROM的读写(带超时检测)本人最近参考了st 公司关于STM32的I2C的例程,觉得不是很适合我的应用,于是自己写了一个基于STM32F103的I2C总线EEPROM(24C256)的读写程序,总线的最高速度可达400K,现在将源代码原原本本的公布如下,希望得到高手的指点,也希望能够给和我有同样想法的同仁们一些参考价值。

注意:最好将固件库升级一下,st网站上面有V2。

03库的补丁。

u32 ulTimeOut_Time;/***********************************************************************************************************I2C_EE_WriteStr()** Description : 将一个数据块写入EEPROM 的指定的地址**Argument(s) : xChip - 从器件地址* xAddr — EEPROM存储空间地址*xpBuf —数据缓冲区指针* xLen - 数据长度**Return(s) : none.**Caller(s) : Application.** Note(s) :(1)*——--—-——----————--—-——---——--—--—---—-—----———--—-—-————-——-——---—-—--—————----——--—————-—-——--——-———--*Modified by :* Modified date :* Description :*—---———----———-—------——--—--—-——————-—-————-——-———-——---—--——-——————--—————----———-—---—-——-——-—-——--—**********************************************************************************************************/void I2C_EE_WriteStr(u8 xChip, u16 xAddr, u8 *xpBuf, u16 xLen){u8 *pbuf;u8 err;u8 retry;u16 addr;u16 len;个人收集整理,勿做商业用途本文为互联网收集,请勿用作商业用途//pbuf = xpBuf;addr = xAddr;len = xLen;I2C_EE_Drv_BusEn(); // 允许总线,写允许retry = 5; // 重试5次while(len){err = I2C_EE_Drv_WriteByte(xChip,addr, *pbuf);if(err){if(--retry == 0 ) // 已经试了5次,写下一个数据{retry = 5;pbuf++;addr++;len——;}}else // 顺利,写下一个数据{pbuf++;addr++;len--;}}I2C_EE_Drv_BusDis(); // 失能总线,写保护}/*********************************************************************************************************** I2C_EE_ReadStr()**Description :从EEPROM 的指定的地址读出一个数据块** Argument(s) : xChip —从器件地址* xAddr - EEPROM存储空间地址*xpBuf - 数据缓冲区指针*xLen - 数据长度**Return(s) : none.** Caller(s) : Application。

EEPROM器件读写例程设计.

其芯片引脚图如下图所示。
图3.4CD4052引脚图
3.5
3.5.1 AT24C02
AT24C02芯片可存储256个字节,重复擦写1000000次,数据保存100年以上。该芯片通过I2C总线接口进行操作,并且符合I2C总线的协议。其原理图如下图所示:
图3.5AT24C02 原理图
AT24C02各引脚的功能如下表所示:
5.2 EEPROM
该模块的设计主要是实现对AT24C02芯片的读写操作,代码如下所示。
从AT24C02读数据的函数代码如下所示:
char AT24C02Read(unsigned char * _data,unsigned char addr,unsigned char leng)
{//参数_data表示数据存放的缓冲区地址,addr表示偏移地址,leng表示数据长度
EEPROM器件读写例程设计
1
本次课设是EEPROM器件读写例程的设计,即在电可擦除存储器件上实现数据的读和写。硬件方面,使用AT24C02芯片作为EEPROM器件,并为了达到实验结果的可见性,以便测试软件代码的正确性,实验中使用了LED数码显示芯片CH451来控制显示AT24C02芯片中写/读数据。
起始信号:时钟线保持高电平期间数据线电平从高到低的跳变为I2C总线的起始信号。
停止信号:时钟线保持高电平期间数据线电平从低到高的跳变为I2C总线的停止信号。
时序图
根据总线的协议规则,设计如下图所示的总线时序图。
图3.6 总线时序图
根据总线的时序要求设计总线的读写周期时序如下图所示。
图3.7总线写时序
图3.2 AT89S52引脚图 DIP封装
3.3
CH451是一个整合了数码管显示驱动和键盘扫描控制以及μP监控的多功能外围芯片。CH451内置RC振荡电路,可以动态驱动8位数码管或者64位LED,具有BCD译码、闪烁、移位等功能;同时还可以进行64键的键盘扫描;CH451通过可以级联的串行接口与单片机等交换数据;并且提供上电复位和看门狗等监控功能。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档