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. bzoj 2119: 股市的预测

    Description 墨墨的妈妈热爱炒股,她要求墨墨为她编写一个软件,预测某只股票未来的走势.股票折线图是研究股票的必备工具,它通过一张时间与股票的价位的函数图像清晰地展示了股票的走势情况.经过长时 ...

  2. openstack ocata版本简化安装

    Network Time Protocol (NTP) Controller Node apt install chrony Edit the /etc/chrony/chrony.conf 添加如下 ...

  3. tomcat中使用mysql连接池的配置

    1.下载相应的jar包,添加到工程中 需要下载的包主要有commons-pool2-2.2 commons-dbcp2-2.0.1-src commons-dbcp2-2.0.1  commons-c ...

  4. Java核心技术(Java白皮书)卷Ⅰ 第一章 Java程序设计概述

    第1章 Java程序设计概述1.1 Java程序设计平台 具有令人赏心悦目的语法和易于理解的语言,与其他许多优秀语言一样,Java满足这些要求. 可移植性 垃圾收集 提供大型的库  如果想要有奇特的绘 ...

  5. SQL基础学习_06_集合运算和联结

    集合运算 1. 并集:UNION     例:     SELECT shohin_id, shohin_mei    FROM Shohin    UNION    SELECT shohin_id ...

  6. Web开发入门学习笔记

    公司web项目终于要启动了,本以为django学习可以在实战中进行,结果最终使用了Drupal框架,好吧,那我们就PHP走起,买了本<细说PHP>,先跟着过一遍Web开发入门. HTTP协 ...

  7. vue实现登录后跳转到之前的页面

    在开发中我们经常遇到这样的需求,需要用户直接点击一个链接进入到一个页面,用户点击后链接后会触发401拦截返回登录界面,登录后又跳转到链接的页面而不是首页,这种问题该如何去做呢? 先说一下我们需要用到的 ...

  8. HTML5本地存储应用sessionStorage和localStorage

    在html5之前,浏览器要实现数据的存储,一般都是用cookie,但是cookie有域名和大小限定. html5流行之后,可以通过localStorage和sessionStorage实现浏览器端的数 ...

  9. Python中的单例模式的几种实现方式的优缺点及优化

    单例模式 单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在.当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场. ...

  10. Html5 移动端 触摸滑动事件

    以下代码经过测试  没有问题 且可以循环滑动 <!DOCTYPE html><html xmlns="http://www.w3.org/1999/xhtml"& ...