当前位置:首页 > 单片机 > 单片机
[导读] 文章大纲:一:EEPROM芯片介绍(包括各种读写的时序与管脚定义)二:S3C2440中对于IIC需要配置的寄存器三:IIC成功读写EEPROM的程序(光盘的那个IIC读写程序真心对初学者不好理解)一:EEPROM芯片介绍在

 

文章大纲:

一:EEPROM芯片介绍(包括各种读写的时序与管脚定义)

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

三:IIC成功读写EEPROM的程序(光盘的那个IIC读写程序真心对初学者不好理解)

 

一: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编程中使用到的几个重要关键字之一volatile2:IIC的中断总是在ACK周期内,产生的,我没有贴出操作流程图,ARM9文档中IIC这章已经清楚给出。所以在有ACK的那些数据发送与接收都可以用中断操作,但是从读数据的后接收数据来看,由于是NO ACK,所以就没有用中断操作了,而且自己进行了一个延时。在读数据。

copy

 

  1. staticU8_iicData[IICBUFSIZE];

  2. staticvolatileintf_GetACK;


view plaincopy

 

  1. voidTest_Iic(void)

  2. {

  3. unsignedinti,j,save_E,save_PE;

  4. staticU8data[256];

  5.  

  6. Uart_Printf("\nIICTest(Interrupt)usingAT24C02\n");

  7.  

  8. save_E=rGPECON;

  9. save_PE=rGPEUP;

  10. IIC_Init();//初始化IIC必须的一些寄存器

  11. Uart_Printf("WritetestdataintoAT24C02\n");

  12.  

  13. for(i=0;i<48;i++)

  14. Wr24C080(0xa0,i,i);//slvaddr,addr,data

  15.  

  16.  

  17. for(i=0;i<48;i++)

  18. data[i]=0;

  19.  

  20. Uart_Printf("ReadtestdatafromAT24C02\n");

  21.  

  22. for(i=0;i<48;i++)

  23. Rd24C080(0xa0,i,&(data[i]));

  24.  

  25. //Linechanged0~f

  26. for(i=0;i<3;i++)

  27. {

  28. for(j=0;j<16;j++)

  29. Uart_Printf("%2x",data[i*16+j]);

  30. Uart_Printf("\n");

  31. }

  32. rINTMSK|=BIT_IIC;

  33. rGPEUP=save_PE;

  34. rGPECON=save_E;

  35. }

copy

 

  1. voidIIC_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.  

  17. //IIC传输中断开启

  18. rINTMOD=0x0;

  19. rINTMSK&=~BIT_IIC;

  20. pISR_IIC=(unsigned)IicInt;

  21. }

copy

 

  1. //*************************[Wr24C080]****************************

  2. voidWr24C080(U32slvAddr,U32addr,U8data)

  3. {

  4. f_GetACK=0;

  5. rIICDS = slvAddr; //发送第一个数

 

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

嵌入式开发作为一种专业且技术密集型的领域,涵盖了从硬件底层驱动、中间件到应用层软件开发等多个层面的工作,其所需的工具种类繁多,各有针对性,旨在提升开发效率、保证代码质量以及简化调试过程。

关键字: 嵌入式开发 keil

之后新建新的工程,添加.a文件就可以使用了,当然也可以使用keil来添加,但是keil默认的是用.lab,需要自己配置一下文件属性,改为lib文件即可。一半release sdk的时候用这种方式很关键的,毕竟自己的核心代...

关键字: keil 文件属性 lib文件

DSP28335与AD7606通过SPI的串行数据交互

关键字: keil C

AD7606的并行采集

关键字: ad7606 数据 C keil

下面小编为大家整理了电机驱动电路原理,你值得收藏!

关键字: 电机驱动电路原理 电源电路 iic

近年来,部分国内机器人企业通过研发和并购,逐步实现了相对完备的布局。上市公司哈工智能是国内少数有完整产业链的企业,涵盖了工业机器人应用、工业机器人本体及工业机器人服务。在细分赛道发展迅猛的节卡也在寻求对产业链的把控。

关键字: 工业机器人 amr 协作机器人

为帮助大家更好使用单片机编程软件,本文将对keil单片机编程软件仿真、调剂技巧予以讲解,并对该单片机编程软件的常见错误提示予以阐述。

关键字: 单片机编程软件 指数 keil

本文对于单片机编程软件的介绍将基于如何采用keil单片机编程软件调试stm32,如果你对单片机编程软件抑或本文内容具有兴趣,不妨继续往下阅读哦。

关键字: 单片机编程软件 指数 keil

本文对于单片机编程软件的介绍基于两点:1.keil单片机编程软件编译环境优化等级说明,2.keil单片机编程软件中两大概念名词解析。

关键字: 单片机编程软件 指数 keil

P430颅内出血检测设备的研制策略 1 引言 在中国有许多因创伤性颅脑损伤的患者急需抢救,但相当一部分颅内出血患者因未能及时诊断,延误了抢救和治疗时机.因而出现脑血肿或脑疝后压

关键字: 单片机 LCD 医疗设备 eeprom
关闭
关闭