[国嵌攻略][153][I2C裸机驱动设计]
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裸机驱动设计]的更多相关文章
- [国嵌攻略][158][SPI裸机驱动设计]
SPI控制器工作流程 SPI控制器提供2个SPI接口.每个SPI接口有两个通道,分别为TX通道和RX通道.CPU要写数据到FIFO中,先写数据到SPI_TX_DATA寄存器中,这样此寄存器中的内容就会 ...
- [国嵌攻略][156][I2C自编设备驱动设计]
AT24C08的驱动在Linux内核中已经提供,在/drivers/misc/eeprom/at24.c文件中.在对应的probe函数中有一个创建/sys/.../eeprom文件的函数,应用程序通过 ...
- [国嵌攻略][155][I2C用户态驱动设计]
用户态驱动模型 用户态驱动模型首先是一个应用程序,其次是在这个用户程序中通过内核调用来驱动设备. IIC通用驱动代码 IIC通用驱动程序的代码在/drivers/i2c/i2c-dev.c中.一次读操 ...
- [国嵌攻略][152][I2C总线介绍]
IIC电气特性 I2C(inter intergrated circuit)总线是由philps公司开发的两线式串行总线,用于连接微控制器及其外围设备. I2C总线只有两根双向信号线: SDA:ser ...
- [国嵌攻略][136][DM9000网卡驱动深度分析]
网卡初始化 1.分配描述结构,alloc_etherdev 2.获取平台资源,platform_get_resource 2.1.在s3c_dm9k_resource中有相关的资源 2.2.add地址 ...
- [国嵌攻略][137][DM9000网卡驱动编程]
DM9000数据发送 DM9000数据发送函数是在/drivers/net/dm9000.c中的dm9000_start_xmit函数 static int dm9000_start_xmit(str ...
- [国嵌攻略][154][Linux-I2C子系统]
IIC子系统架构 device driver层: 1.device driver,由用户开发. 2.i2c-dev由内核实现,但是需要配合应用模式驱动才能使用. i2c core层: 1.总线驱动,也 ...
- [国嵌攻略][142][LCD驱动程序架构]
LCD裸机驱动回顾 1.LCD初始化 1.1.控制器初始化 1.2.端口初始化 1.3.指明了帧缓冲 2.LCD图形显示 2.1.将图形数据写入帧缓冲 Linux帧缓冲体验 把图片转换成开发板屏对应的 ...
- [国嵌攻略][165][usb下载线驱动设计]
查看USB设备的生产商ID和设备ID 示例: lsusb Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub 生产商ID是1d ...
随机推荐
- Lucene分词停用词库stopwords
! " $ % & ' ( ) * + , - -- . .. ... ...... ................... ./ .一 .数 .日 / // 0 1 2 3 4 5 ...
- Jasperreports以及iReport4.5报表PDF导出字体完美解决方案
在使用Jasperreports以及iReport设计报表时,导出PDF是一个常见的需求.网上解决PDF导出中文显示问题相关的文章很多,无非就是设置控件的pdf font name和pdf encod ...
- Webpack 2 视频教程 008 - WDS 端口号等配置相关
原文发表于我的技术博客 这是我免费发布的高质量超清「Webpack 2 视频教程」. Webpack 作为目前前端开发必备的框架,Webpack 发布了 2.0 版本,此视频就是基于 2.0 的版本讲 ...
- python自动安装mysql5.7
python自动安装mysql5.7 python版本:python2.6 centos版本:centos6.9 mysql版本:mysql5.7.19 安装目录路径和数据目录路径都是固定,当然也可以 ...
- PHP函数和数组
所有代码可以在https://www.github.com/lozybean/learn_www中查看 PHP函数 PHP中还是有很多函数式编程的影子,函数功能还是比较强大的. 1. 函数用funct ...
- SAP中的BOPF(Business Object Processing Framework)
希望简化你的业务应用开发过程?业务对象处理框架(Business Object Processing Framework,以下简称BOPF)也许可以帮到你. BOPF是SAP Business Sui ...
- linux上查找文件存放地点和文件中查找字符串方法
一.查找文件存放地点 1.locate 语法:locate <filename> locate命令实际是"find -name"的另一种写法,但是查找方式跟find不同 ...
- 【原创】Android AOP面向切面编程AspectJ
一.背景: 在项目开发中,对 App 客户端重构后,发现用于统计用户行为的友盟统计代码和用户行为日志记录代码分散在各业务模块中,比如在视频模块,要想实现对用户对监控点的实时预览和远程回放行为进行统计, ...
- chrome调试工具高级不完整使用指南(优化篇)
上一篇文章我们说了chrome调试工具的一些比较基础功能的用法,接下来我们要在这一篇文章中说一说,其他一些chrome调试工具的使用方法 2.1.5 Network模块 在netWork模块中,大致上 ...
- 【二分图】ZJOI2007小Q的游戏
660. [ZJOI2007] 小Q的矩阵游戏 ★☆ 输入文件:qmatrix.in 输出文件:qmatrix.out 简单对比 时间限制:1 s 内存限制:128 MB [问题描述] ...