eeprom简介

eeprom电可擦除可编程只读存储器,是一种类似于flash的固态存储器,但是与flash相比又存在一些区别:

1.eeprom可以按位擦写,而flash只能大片擦除。

2.eeprom一般容量都不大,一般都在64kb以下。

I2C初始化

在ARM内部有I2C控制器,可以对I2C器件进行访问。所以I2C初始化也就是对I2C控制器初始化。

1.如果需要,写入处理器的I2C从设备地址。

2.设置IICCON寄存器

2.1.允许中断

2.2.设置SCL周期

3.设置IICSTAT允许串行输出

4.设置GPIO为I2C

5.允许产生ACK

I2C写数据

1.设置处理器为主设备加发送模式

2.将从设备的地址写入到IICDS寄存器

3.写入0xF0到IICSATA

4.等到ACK的产生

5.写入字节地址到IICDS寄存器

6.等待ACK产生

7.将要传输的数据写入IICDS寄存器

8.清除中断

9.等待ACK的产生

10.写入0xD0到IICSATA

11.清除中断

I2C读数据

1.设置为主设备发送模式

2.写入从设备地址

3.写入0xF0到IICSTAT

4.等待ACK

5.写入eeprom内部地址

6.等待ACK

7.设置为主设备接收模式

8.写入从设备地址到IICDS

9.写入0xB0到IICSTAT开始接收

10.等待中断

11.1.如果是最后一个信号回答NO ACK

11.2.从IICDS里取出数据

12.清除中断

13.写入0x90到IICSTAT寄存器

14.清除中断

iic.c

/********************************************************************
*名称:iic.c
*作者:D
*时间:2016.03.16
*功能:AT24C08A EEPROM驱动
*********************************************************************/ /********************************************************************
*宏定义
*********************************************************************/
#define GPECON ( (*(volatile unsigned long *)0x56000040) ) //GPE组控制寄存器
#define GPEUP ( (*(volatile unsigned long *)0x56000048) ) //GPE组上拉寄存器 #define INTMSK ( (*(volatile unsigned long *)0x4A000008) ) //中断掩码寄存器
#define SRCPND ( (*(volatile unsigned long *)0X4A000000) ) //中断源请求寄存器
#define INTPND ( (*(volatile unsigned long *)0X4A000010) ) //中断请求寄存器 #define IICCON ( (*(volatile unsigned char *)0x54000000) ) //IIC总线控制寄存器
#define IICSTAT ( (*(volatile unsigned char *)0x54000004) ) //IIC总线状态寄存器
#define IICDS ( (*(volatile unsigned char *)0x5400000C) ) //IIC数据移位寄存器 /********************************************************************
*函数原型
*********************************************************************/
void init_iic();
void byte_write(unsigned char address, unsigned char data);
void random_read(unsigned char address, unsigned char data[], int length);
void iic_irq();
void delay_iic(int count);
void test_iic(); /********************************************************************
*名称:init_iic
*参数:
* none
*返回:
* none
*功能:初始化IIC控制器
*********************************************************************/
void init_iic(){
//配置功能引脚
GPECON &= ~((0x3<<)|(0x3<<));
GPECON |= ((0x2<<)|(0x2<<)); //GPE14[29:28]:IICSCL, GPE14[31:30]:IICSDA GPEUP |= (0x3<<); //GPE[15:15]:The pull up function is disabled //设置中断标志
INTMSK &= ~(<<); //INT_IIC[27]:0
SRCPND |= (<<); //INT_IIC[27]:0
INTPND |= (<<); //INT_IIC[27]:0 //使能中断功能
IICCON |= (<<); //Tx/Rx Interrupt[5]:Enable //设置应答信号
IICCON |= (<<); //Acknowledge generation[7]:Enable //设置时钟周期
IICCON &= ~(<<); //Tx clock source selection[7]:IICCLK = fPCLK / 16 = 50MHz / 16 = 3125KHZ IICCON &= ~(0xF<<); //Transmit clock value[3:0]:0
IICCON |= (0x5<<); //Transmit clock value[3:0]:IICCLK/(IICCON[3:0]+1) = 3125KHz / 16 = 520KHz //打开串行输出
IICSTAT |= (<<); //Serial output[4]:Enable Rx/Tx
} /********************************************************************
*名称:byte_write
*参数:
* address 数据地址
* data 数据内容
*返回:
* none
*功能:按字节写设备
*********************************************************************/
void byte_write(unsigned char address, unsigned char data){
//设置发送模式
IICSTAT |= (0x3<<); //写入设备地址
IICDS = 0xA0; //向从设备写入数据 //打开发送模式
IICSTAT = 0xF0; //等待应答信号
while( (IICCON & (<<)) == ){
delay_iic();
} //写入数据地址
IICDS = address; //清除等待标志
IICCON &= ~(<<); //等待应答信号
while( (IICCON & (<<)) == ){
delay_iic();
} //写入数据内容
IICDS = data; //清除等待标志
IICCON &= ~(<<); //等待应答信号
while( (IICCON & (<<)) == ){
delay_iic();
} //关闭发送模式
IICSTAT = 0xD0; //清除等待标志
IICCON &= ~(<<); //等待结束生效
delay_iic();
} /********************************************************************
*名称:random_read
*参数:
* address 数据地址
* data 数据内容
* length 数据长度
*返回:
* none
*功能:随机读设备
*********************************************************************/
void random_read(unsigned char address, unsigned char data[], int length){
//设置发送模式
IICSTAT |= (0x3<<); //写入设备地址
IICDS = 0xA0; //向从设备写入数据 //打开发送模式
IICSTAT = 0xF0; //等待应答信号
while( (IICCON & (<<)) == ){
delay_iic();
} //写入数据地址
IICDS = address; //清除等待标志
IICCON &= ~(<<); //等待应答信号
while( (IICCON & (<<)) == ){
delay_iic();
} //关闭发送模式
IICSTAT = 0xD0; //清除等待标志
IICCON &= ~(<<); //等待结束生效
delay_iic(); //设置接收模式
IICSTAT &= ~(0x3<<);
IICSTAT |= (0x2<<); //写入设备地址
IICDS = 0xA1; //从从设备读取数据 //打开接收模式
IICSTAT = 0xB0; //等待应答信号
while( (IICCON & (<<)) == ){
delay_iic();
} //空读接收数据
unsigned char temp; temp = IICDS; //清除等待标志
IICCON &= ~(<<); //等待应答信号
while( (IICCON & (<<)) == ){
delay_iic();
} //读取接收数据
int i; for(i = ; i < length; i++){
//读取数据内容
data[i] = IICDS; //清除等待标志
IICCON &= ~(<<); //判断接收长度
if(i < (length - )){
//等待应答信号
while( (IICCON & (<<)) == ){
delay_iic();
}
}else{
//发送停止应答
IICCON &= ~(<<);
}
} //关闭接收模式
IICSTAT = 0x90; //清除等待标志
IICCON &= ~(<<); //等待结束生效
delay_iic();
}
/********************************************************************
*名称:iic_irq
*参数:
* none
*返回:
* none
*功能:iic中断服务
*********************************************************************/
void iic_irq(){
//清除中断源请求
SRCPND |= (<<); //INT_IIC[27]:0 //清除中断请求
INTPND |= (<<); //INT_IIC[27]:0
} /********************************************************************
*名称:delay_iic
*参数:
* count 延时次数
*返回:
* none
*功能:延时函数
*********************************************************************/
void delay_iic(int count){
int i, j; for(i = ; i < count; i++){
for(j = ; j < ; j++){
}
}
} /********************************************************************
*名称:test_iic
*参数:
* none
*返回:
* none
*功能:测试AT24C08A
*********************************************************************/
void test_iic(){
//向EEPROM写入数据
int i; for(i = ; i < ; i++){
byte_write(i, i);
} //从EEPROM读取数据
unsigned char buf[]; random_read(, buf, ); //显示数据
for(i = ; i < ; i++){
printf("%d ", buf[i]);
}
printf("\n");
}

[国嵌攻略][153][I2C裸机驱动设计]的更多相关文章

  1. [国嵌攻略][158][SPI裸机驱动设计]

    SPI控制器工作流程 SPI控制器提供2个SPI接口.每个SPI接口有两个通道,分别为TX通道和RX通道.CPU要写数据到FIFO中,先写数据到SPI_TX_DATA寄存器中,这样此寄存器中的内容就会 ...

  2. [国嵌攻略][156][I2C自编设备驱动设计]

    AT24C08的驱动在Linux内核中已经提供,在/drivers/misc/eeprom/at24.c文件中.在对应的probe函数中有一个创建/sys/.../eeprom文件的函数,应用程序通过 ...

  3. [国嵌攻略][155][I2C用户态驱动设计]

    用户态驱动模型 用户态驱动模型首先是一个应用程序,其次是在这个用户程序中通过内核调用来驱动设备. IIC通用驱动代码 IIC通用驱动程序的代码在/drivers/i2c/i2c-dev.c中.一次读操 ...

  4. [国嵌攻略][152][I2C总线介绍]

    IIC电气特性 I2C(inter intergrated circuit)总线是由philps公司开发的两线式串行总线,用于连接微控制器及其外围设备. I2C总线只有两根双向信号线: SDA:ser ...

  5. [国嵌攻略][136][DM9000网卡驱动深度分析]

    网卡初始化 1.分配描述结构,alloc_etherdev 2.获取平台资源,platform_get_resource 2.1.在s3c_dm9k_resource中有相关的资源 2.2.add地址 ...

  6. [国嵌攻略][137][DM9000网卡驱动编程]

    DM9000数据发送 DM9000数据发送函数是在/drivers/net/dm9000.c中的dm9000_start_xmit函数 static int dm9000_start_xmit(str ...

  7. [国嵌攻略][154][Linux-I2C子系统]

    IIC子系统架构 device driver层: 1.device driver,由用户开发. 2.i2c-dev由内核实现,但是需要配合应用模式驱动才能使用. i2c core层: 1.总线驱动,也 ...

  8. [国嵌攻略][142][LCD驱动程序架构]

    LCD裸机驱动回顾 1.LCD初始化 1.1.控制器初始化 1.2.端口初始化 1.3.指明了帧缓冲 2.LCD图形显示 2.1.将图形数据写入帧缓冲 Linux帧缓冲体验 把图片转换成开发板屏对应的 ...

  9. [国嵌攻略][165][usb下载线驱动设计]

    查看USB设备的生产商ID和设备ID 示例: lsusb Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub 生产商ID是1d ...

随机推荐

  1. 自己动手写把”锁”之---JMM和volatile

    一.JAVA内存模型 关于Java内存模型的文章,网上真的数不胜数.在这里我就不打算说的很详细.很严谨了.只力求大家能更好的理解和运用,为后边的技术点做铺垫.   内存模型并不是Java独有的概念,而 ...

  2. Linux(CentOS6.5)下编译安装Nginx1.10.1

    首先在特权账号(root)下安装编译时依赖项: yum install gcc gcc-c++ perl -y   首先以非特权账号(本文以账号comex为例)登陆OS: 进入data目录下载相关安装 ...

  3. RSA加解密实现

    RSA是由MIT的三位数学家R.L.Rivest,A.Shamir和L.Adleman[Rivest等1978, 1979]提出的一种用数论构造双钥的方法,被称为MIT体制,后来被广泛称之为RSA体制 ...

  4. 快速搭建vsftp 服务器并配置指定目录

    1  搭建vsftp 服务器 前期准备: 1.用root 进入系统 2.使用命令 rpm  -qa|grep vsftpd 查看系统是否安装了ftp,若安装了vsftp,使用这个命令会在屏幕上显示vs ...

  5. Flask快速入门,知识整理

    一.Flask介绍(轻量级的框架,非常快速的就能把程序搭建起来) Flask是一个基于Python开发并且依赖jinja2模板和Werkzeug WSGI服务的一个微型框架,对于Werkzeug本质是 ...

  6. Java Web高级编程(二)

    使用会话维持状态 一.会话 为了实现关联同一个用户端的多个请求和这些请求之间数据的共享,需要用到会话,会话用于维持请求和请求之间的状态.从服务器的角度,当用户的Web浏览器打开第一个链接到服务器的套接 ...

  7. Java的迭代和foreach循环

    Java的迭代(interation statement) Java的迭代(interation statement) 其实就是循环控制语句while.do-while和for,因为他们会从重复地运行 ...

  8. CommonJS, AMD ,CMD之间的关系

    commonjs是用在服务器端的,同步的,如nodejs amd, cmd是用在浏览器端的,异步的,如requirejs和seajs 其中,amd先提出,cmd是根据commonjs和amd基础上提出 ...

  9. Python 接口自动化(预)

    1. HTTP协议:HTTP是接口测试的基础: 2. Fiddler工具:Fiddler所有界面布局及主要布局

  10. windows编程学习笔记(三)ListBox的使用方法

    ListBox是Windows中的一种控件,一般被当做子窗口使用,Windows中所有子窗口都是通过发送一个通知码到父窗口父窗口通过WM_COMMAND消息接收,并在此消息中处理,并控制子窗口,Lis ...