mini2440----keil for AMR之IIC读写EEPROM(AT24C08)

一:EEPROM芯片介绍

在这里分析AT24C02A/AT24C04A/AT24C08A,对于其他不同型号的EEPROM芯片要根据具体手册进行分析。他们的大小分别是2K(256*8)/4K(512*8)/8K(1024*8)因此可以看出实际大小是256/512/1024byte,。对于AT24C02A的三位地址线都是写死的,因为在进行读写操作时使用8位地址已经足够,所以三位地址线写死作为片选,对于AT24C08A的三位地址线第一位必须写死,后两位可以作为内部页地址。因为AT24C08A的大小超过了256byte,8位寻址,已经没法使用到芯片内所有的空间。因此对于后面两位也就可以由程序决定了。

写EEPROM有两种,(在写数据的时候,AMR9作为主设备,EEPROM是从设备)

第一种写byte方式:

写一个byte实际上需要发送三次数据。在这个过程中,主设备为发送状态。第一个数据——设备地址。第二数据——ARM9想写的EEPROM中的地址。第三个数据——想写入到EEPROM中的具体数据。最后停止。

第二种写页方式:

自我感觉其实写页与写byte应该是一致的,第一个数据——设备地址。第二数据——ARM9想写的EEPROM中的地址(但是这个地址是首地址。AT24C02一页是8byte,AT24C04/08一页是16byte。所以在写页的时候最多写一页的大小,如果写太多就会重新又从首地址开始,以前写的会被覆盖掉。)。第三、四、······数据——就是你想写入到EEPROM中的数据。最后停止

读EEPROM中的数据

第一种读当前地址数据

主设备仍然是ARM9,从设备是EEPROM,但是要注意主设备的状态,有时候会是发送状态,有时候会是接收状态

第一个数据——(主设备现在处于发生状态)发送从设备地址,并且把主设备配置为接收状态。

第二个数据——(主设备处于接收状态)ARM9接收数据,注意此时是NO ACK。再停止。(要在产生NO ACK后在读取数据这时数据会是稳定的。网上有问为什么在读IIC最后需要读两次,我自己实验了,只需要最后一次就行,)

第二种随机读数据方式

第一个数据——(主设备处于发生状态),发送一个从设备地址。第一个设备地址是用来从设备匹配的,也在文档中被称为a “dummy” byte write sequence

第二个数据——(主设备处于发生状态),发送一个想读取数据在EEPROM中的地址。

第三个数据——(主设备处于发生状态),发送一个从设备地址。这是特定要求这样发送的。。(在这里主设备会被配置为接收状态),这此发送设备地址是用来同时调整主设备状态的。

第四个数据——(主设备处于接收状态)需要读的数据。也是一个NO ACK,与读当前地址类似。最后再停止。

第三种读序列地址

与读当前数据有些类似。

第一个数据——(主设备处于发送状态),发出设备地址,并配置主设备为接收状态。为后面接收数据准备

第二、三···个数据——(主设备处于接收状态),前面每个数据都会发送ACK,最后一个数据是一个NO ACK。

再停止。

以上这些,主要要注意主设备状态的调整,以及为NO ACK时的处理,后面有事例程序,能够比较清楚的看到怎么进行处理的。

二:S3C2440中对于IIC需要配置的寄存器

GPECON,主要是把这个GPIO配置为IIC模式。

IICCON:其中[0]---[3]与[6]共同决定IIC总线的时钟频率。

[4]是一个中断标志位,我们如果没有用中断方式的话,应该可以通过查询这一位进行。(我用的中断,没有具体自己实践)

[5]IIC中断使能。[7]是否发送ACK。这一位在后面读数据的时候,要注意进行改变。

IICSTAT:这个寄存器主要是一些标志为,不需要配置,主要要配置的是这几位。

[4]使能IIC数据线的,使其能够发送数据。

[5]启动和停止IIC,1启动。0停止。

[6-7]是配置AMR9的状态的,一般CPU是一个主设备的角色。只有在两块CPU进行相互通信的时候,可能把他配置成为一个从设备的状态。所以在我们实验中,ARM9全部都是处于主设备的角色。

IICADD是CPU做从设备的时候,给他配置的从设备地址,这里可以不用配置。

IICDS:数据移位寄存器。发送数据就是把数据发到这个寄存器。接收数据就是从这个寄存器中去取数据。

如果使用中断当然还得配置INTMSK,打开IIC中断。

三:IIC成功读写EEPROM的程序

首先要对程序有几点说明:

1:f_GetACK必须是volatile类型,因为在中断中改变了值,不然值被保存在缓存中了,最后检测时,不能真正读到其值。详细见

在C编程中使用到的几个重要关键字之一volatile

2:IIC的中断总是在ACK周期内,产生的,我没有贴出操作流程图,ARM9文档中IIC这章已经清楚给出。所以在有ACK的那些数据发送与接收都可以用中断操作,但是从读数据的后接收数据来看,由于是NO ACK,所以就没有用中断操作了,而且自己进行了一个延时。在读数据。

[html] view plaincopy
  1. static U8 _iicData[IICBUFSIZE];
  2. static volatile int f_GetACK;
[html] view plaincopy
  1. void Test_Iic(void)
  2. {
  3. unsigned int i,j,save_E,save_PE;
  4. static U8 data[256];
  5. Uart_Printf("\nIIC Test(Interrupt) using AT24C02\n");
  6. save_E   = rGPECON;
  7. save_PE  = rGPEUP;
  8. IIC_Init();         //初始化IIC必须的一些寄存器
  9. Uart_Printf("Write test data into AT24C02\n");
  10. for(i=0;i<48;i++)
  11. Wr24C080(0xa0,i,i);         //slvaddr, addr,  data
  12. for(i=0;i<48;i++)
  13. data[i] = 0;
  14. Uart_Printf("Read test data from AT24C02\n");
  15. for(i=0;i<48;i++)
  16. Rd24C080(0xa0,i,&(data[i]));
  17. //Line changed 0 ~ f
  18. for(i=0;i<3;i++)
  19. {
  20. for(j=0;j<16;j++)
  21. Uart_Printf("%2x ",data[i*16+j]);
  22. Uart_Printf("\n");
  23. }
  24. rINTMSK |= BIT_IIC;
  25. rGPEUP  = save_PE;
  26. rGPECON = save_E;
  27. }
[html] view plaincopy
  1. void IIC_Init(void)
  2. {
  3. //配置GPE端口为IIC功能
  4. rGPECON &=~(0xF<<28);
  5. rGPECON |=(1<<31)|(1<<29);
  6. //产生ACK,IIC中断使能,频率200KHz
  7. rIICCON = 0;
  8. rIICCON |=(7)|(1<<5)|(1<<7);
  9. //模式为主发送,使能Rx/Tx     (不管是读还是写初始化都为主发送)
  10. rIICSTAT |=(3<<6)|(1<<4);
  11. rIICADD = 0x10;//从地址    表示2440作为从设备的时候的地址,
  12. //在这里2440是作为一个主设备存在的,所以没有作用。
  13. //EEPROM的标识符为1010
  14. //控制字节,其中高四位为器件类型标识符,后三位作为片选
  15. //最后一位决定读写,0是读,1是写。
  16. //IIC传输中断开启
  17. rINTMOD=0x0;
  18. rINTMSK &=~BIT_IIC;
  19. pISR_IIC = (unsigned)IicInt;
  20. }
[html] view plaincopy
  1. //*************************[ Wr24C080 ]****************************
  2. void Wr24C080(U32 slvAddr,U32 addr,U8 data)
  3. {
  4. f_GetACK = 0;
  5. rIICDS = slvAddr;               //发送第一个数据
  6. rIICSTAT = 0xf0;
  7. while(f_GetACK == 0);           //等待发送结束
  8. f_GetACK = 0;
  9. rIICDS = addr;                  //发送第二个数据
  10. rIICCON = 0xaf;
  11. while(f_GetACK == 0);           //等待发送结束
  12. f_GetACK = 0;
  13. rIICDS = data;                  //发送第三个数据
  14. rIICCON = 0xaf;
  15. while(f_GetACK ==0);           //等待发送结束
  16. rIICSTAT = 0xd0;               //停止IIC
  17. rIICCON = 0xaf;
  18. Delay(3);
  19. }
[html] view plaincopy
  1. void Rd24C080(U32 slvAddr,U32 addr,U8 *data)
  2. {
  3. char cRecvByte;
  4. f_GetACK = 0;
  5. rIICDS = slvAddr;           //发送第一个数据
  6. rIICSTAT = 0xf0;
  7. while(f_GetACK==0);         //等待结束
  8. f_GetACK = 0;
  9. rIICDS = addr;              //发送第二个数据
  10. rIICCON = 0xAF;
  11. while(f_GetACK==0);          //等待结束
  12. f_GetACK = 0;
  13. rIICDS = slvAddr;           //发送第三个数据
  14. rIICSTAT = 0xb0;            //配置主设备状态为接收
  15. rIICCON = 0xaf;
  16. while(f_GetACK==0);         //等待结束
  17. f_GetACK = 0;
  18. rIICCON = 0x2f;             //NO ACK配置
  19. Delay(2);                   //等待其稳定,延时不要求精确
  20. cRecvByte = rIICDS;         //接收第四个数据
  21. rIICSTAT = 0x90;            //停止IIC
  22. rIICCON = 0xaf;
  23. Delay(3);
  24. *data = cRecvByte;
  25. }
[html] view plaincopy
  1. void __irq IicInt(void)
  2. {
  3. ClearPending(BIT_IIC);
  4. f_GetACK = 1;
  5. }

mini2440----keil for AMR之IIC读写EEPROM(AT24C08)相关推荐

  1. STM32硬件IIC读写EEPROM

    前面一篇写了软件模拟IIC读写EEPROM. 本篇介绍硬件IIC读写EEPROM.平台是STM32F103+AT24C04N.SDA和SCL接5K上拉电阻到3.3v. 首先介绍AT24C04N的基本特 ...

  2. STM32H7系列使用硬件IIC读写EEPROM(HAL库配置源码)

    记得在使用STM32F103系列时,好多人说其硬件IIC通讯不稳定.后来我们用到了STM32H743的单片机,使用了其硬件IIC对EEPROM进行读写.硬件IIC使用并不麻烦,而且相比于I/O模拟的I ...

  3. IIC读写EEPROM

    文章目录 1.IIC协议 1.1.什么是iic 1.2.EEPROM 1.3.iic传输特点 1.4.时序特点 1.4.1.起始信号 1.4.2.停止信号 1.4.3.读操作 1.4.4.写操作 2. ...

  4. IIC软件模拟-读写EEPROM

    这里写目录标题 1.IIC简介 2. I2C 基本读写过程 2.1.主机写数据到从机 2.2.主机由从机中读数据 2.3.读和写数据 2.4.地址及数据方向 2.5.响应信号 3.软件模拟I2C 4. ...

  5. IIC控制设计读写EEPROM

    IIC控制设计 本博文完全参考小梅哥(下面是链接) IIC协议详解+Uart串口读写EEPROM IIC模块是比较好理解,但个人觉得比较难实现.这里的读为随机读数据,即自己可以指定读取那一个数据.若不 ...

  6. iic获取salve设备地址_Linux下使用IIC总线读写EEPROM(读写i2c从设备通用程序)

    Linux 下使用IIC总线 读写 EEPROM by 韩大卫 @吉林师范大学 handawei@jusontech.com 转载请务必表明出处 ******************* ******* ...

  7. Verilog实现IIC协议读写EEPROM

    在FPGA设计中,IIC协议是一个十分常见的协议,因为几乎所有的EEPROM都是用这个协议进行读写的,此外,一些特殊场合,也会用到此协议.这里我首先给出IIC协议的中文标准文档的下载链接(不要积分), ...

  8. STM32F10x_硬件I2C读写EEPROM(标准外设库版本)

    Ⅰ.写在前面 上一篇文章是"STM32F10x_模拟I2C读写EEPROM",讲述使用IO口模拟I2C总线通信,对EEPROM(AT24Xxx)进行读写操作的过程. 上一篇文章主要 ...

  9. STM32学习之I2C协议(读写EEPROM)

    关于STM32学习分享 第七章 I2C协议(读写EEPROM) 文章目录 关于STM32学习分享 前言 二.代码 1.i2c.c 2.i2c.h 3.main.c 总结 前言 开始!开始!单片机的I2 ...

最新文章

  1. 编写 Debugging Tools for Windows 扩展,第 3 部分:客户端和回调 (windbg 插件 扩展)
  2. Oracle之索引、权限
  3. 用户 'sa' 登录失败。原因: 未与信任 SQL Server 连接相关联
  4. echarts php 数据处理,PHP+echarts读取地图数据
  5. Sqli-labs less 45
  6. vscode浏览器打开html
  7. php文件夹重命名,PHP重命名和移动目录
  8. RedisCrawlSpider
  9. 重庆首个地方区块链标准本月起实施
  10. Linux 命令(82)—— chgrp 命令
  11. java 方法引用_JAVA 8 方法引用 - Method References
  12. jQuery操作input值总结
  13. OSChina 周四乱弹 ——小小编辑去死远点了
  14. Swift guard let 的使用
  15. DEBUG指示灯详细说明
  16. win10新建虚拟机网络配置未连接服务器,Win10系统VMWare虚拟机无法连接网络怎么办?...
  17. 最新淘宝商品销量接口API(精准总销月销)
  18. Codeforces Round #694 (Div. 2) F. Strange Housing (贪心思维)
  19. PHP 如何获取客户端的IP地址
  20. MAC OS X 终端命令入门 (简单常用整理)

热门文章

  1. Go语言经典库使用分析(六)| Negroni 中间件(二)
  2. 【面试时最令职场面试官讨厌的十种行为】
  3. PHP赛事贝格尔编排法--单循环
  4. win10防火墙推荐设置来保护计算机,大神详解win10隐藏防火墙和网络保护部分方法的完全解决要领...
  5. 发邮件怎么把附件内容直接显示_优德分享:如何发邮件会让人觉得你更靠谱?...
  6. deepin20.7隐藏分区
  7. 【考研英语语法】形容词副词的比较级最高级练习题
  8. 智能营销文本生成项目知识点总结
  9. 中国石斑鱼养殖产量不断上升,捕捞产量逐渐下降「图」
  10. X线计算机体肺小结节肿瘤,肺小结节影像诊断