mini2440裸机试炼之——IIC控制EEPROM数据传输

2020-07-04来源: eefocus关键字:mini2440  IIC控制  EEPROM  数据传输

内容:

向EEPROM(AT24C02)内部地址0x00—0xff,依次写入0x00—0xff,然后再读出数据。


IIC总线介绍:

IIC(Inter-IntegratedCircuit,I2C)总线是一种由PHILIPS公司开发的两线式串行总线,用于连接微处理器及其外围设备。在iic总线上,只需要两条线:串行数据线SDA和串行时钟线SCL,便可完成通信


IIC要点

1、清IIC中断标志语句rIICCON&= ~0x10;一定要在读写寄存器IICDS的后面,中断是读写寄存器后发生的;


2、由于EEPROM的读取速度并不快,所以每次读写中断都需要短暂的延时函数;


3、在对AT24C02A进行读取数据时,在发送带有读命令的从设备地址后,AT24C02A会再返回一个从设备地址信息或从设备内存地址信息作为应答,所以一定要把该字节读取后抛弃,因为它不是我们所要读取的信息;


4、按照AT24C02A的时序,在发送从设备地址字节时,它的最低位是0表示写,1表示读。但对于s3c2440来说,不用人为设置这一位,即是0是1都无所谓,因为这一位是由s3c2440根据是主设备发送模式还是主设备接收模式来自动设置。(所以都默认使用0xa0);


EEPROM介绍

AT24CXX系列是带有iic总线接口的EEPROM,其中主要包括AT24C01/02/08/16等,其容量(bits x页)分别为128 x 8/256x 8/1024 x 8/2048 x 8/;对于AT24C02A的三位地址线都是写死的,因为在进行读写操作时使用8位地址已经足够,所以三位地址线写死作为片选,对于AT24C02A的三位地址线第一位必须写死,后两位可以作为内部页地址。因为AT24C02A的大小超过了256byte,8为寻址,已经没法使用到芯片内所有的空间。因此对于后面两位也就可以由程序决定了。


写EEPROM中的数据

在写数据的时候,AMR9作为主设备,EEPROM是从设备


第一种写byte方式(我的程序中是使用这个方式):


写一个byte实际上需要发送三次数据。在这个过程中,主设备为发送状态。第一个数据——设备地址。第二数据——ARM9想写的EEPROM中相对于数据存储的首地址的偏


移地址。第三个数据——想写入到EEPROM中的具体数据。最后停止。


第二种页写方式:


其实写页与写byte应该是一致的,第一个数据——设备地址。第二数据——ARM9想写的EEPROM中相对于数据存储的首地址的偏移地址(但是这个地址是首地址。


AT24C02一页是8byte,AT24C04/08一页是16byte。所以在写页的时候最多写一页的大小,如果写太多就会重新又从首地址开始,以前写的会被覆盖掉。)。第三、四、······数据——就是你想写入到EEPROM中的数据。最后停止


读EEPROM中的数据

主设备仍然是ARM9,从设备是EEPROM,是发送状态还是接收状态,这个iic会自动设置;


第一种读当前地址数据:


第一个数据——(主设备现在处于发生状态)发送从设备地址,


第二个数据——(主设备处于接收状态)ARM9接收数据,注意此时是NO ACK。再停止。(要在产生NO ACK后在读取数据这时数据会是稳定的。网上有问为什么在读IIC 


最后需要读两次,我自己实验了,只需要最后一次就行,)


第二种随机读数据方式:(我的程序中是使用这个方式)


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


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


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


整主设备状态的。


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


第三种读序列地址(页读):


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


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


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


代码块

#include "def.h"  

#include "2440addr.h"  

#include "2440lib.h" 

 

 

static unsigned int i,j,save_E,save_PE;  

static U8 data[256];  

static volatile int flag;   //用于标识是否收到应答信号,改标识在终端处理程序中被清0 

 

/**************************************************************

IIC 初始化函数

**************************************************************/

void iic_init(void){

    rGPECON |= 0xa0000000;                 //GPE15:IICSDA , GPE14:IICSCL (rGPEUP[14:15]没有上拉选项)

   

    //[7]=1允许应答发生  [6]=0 IICCLK = fPCLK /16  PCLK 50MHz, IICCLK = 3.17MHz, Tx Clock = 0.198MHz

    // 允许IIC总线Tx/Rx中断使能   IICCON[3:0]=16       

    rIICCON = (1<<7) | (0<<6) | (1<<5) | (0xf); 

    

    rIICADD  = 0x10;     //从地址    表示2440作为从设备的时候的地址,在这里2440是作为一个主设备存在的,所以没有作用。   

    rIICSTAT = 0x10;         //IIC总线数据输出使能读写  

    rIICLC = (1<<2)|(1);     //使能滤波器 延时五个时钟  

 

}

 

/**************************************************************

 IIC中断函数

**************************************************************/

void __irq Iic_isr(void)  

{  

    flag = 0; 

    rSRCPND = 0x1<<27;          //清除中断  

    rINTPND = 0x1<<27;    

}

 

void iic_isr(void){

    rINTMSK &= ~(0x1<<27);

    pISR_IIC = (unsigned)Iic_isr;//中断入口  

}

 

/**************************************************************

    写EEPROM中的数据

**************************************************************/  

void Wr24C080(U32 slvAddr, U32 addr, U8 data)  

{  

    flag=1;            //以下都是应答标志 标志位置1 

    rIICDS = slvAddr;  //**设备地址(EEPROM的地址为1010) 

    rIICSTAT = 0xf0;   // 主设备发送模式,写)产生起始信号  

    rIICCON &= ~0x10;  //以下都是清中断标志  

    while(flag == 1)   //当发送从地址完成之后会收到ACK信号,在中断处理函数中将该标志置为0  

    Delay(1);  

       

      

    flag =1 ;          

    rIICDS = addr;     //偏移地址

    rIICCON &= ~0x10;             

    while(flag == 1)   //当发送从地址完成之后会收到ACK信号,在中断处理函数中将该标志置为0  

    Delay(1);  

       

    flag =1 ;          

    rIICDS = data;     //要写入的具体数据

    rIICCON &= ~0x10;           

    while(flag == 1)   //当发送从地址完成之后会收到ACK信号,在中断处理函数中将该标志置为0  

    Delay(1);  

       

    rIICSTAT = 0xd0;                    //Stop MasTx condition   

    rIICCON  = 0xaf;                    //Resumes IIC operation.   

    Delay(1);  

      

 

/**************************************************************

    读EEPROM中的数据

**************************************************************/  

void Rd24C080(U32 slvAddr, U32 addr, U8 *data)  

{  

    unsigned char temp;  

    flag=1;                            

    rIICDS = slvAddr;   //设备地址(EEPROM的地址为1010)

    rIICSTAT = 0xf0;    // 主设备发送模式用来发送slvAddr和addr,,启动  

    rIICCON &= ~0x10;               

    while(flag == 1)    // 当发送从地址完成之后会收到ACK信号,在中断处理函数中将该标志置为0  

    Delay(1);  

       

    flag =1 ;                           

    rIICDS = addr;       //偏移地址

    rIICCON &= ~0x10;                

    while(flag == 1)    // 当发送从地址完成之后会收到ACK信号,在中断处理函数中将该标志置为0  

[1] [2]
关键字:mini2440  IIC控制  EEPROM  数据传输 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic502132.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:mini2440裸机试炼之——看门狗中断和复位操作
下一篇:mini2440裸机试炼之IIS——音乐播放器

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

mini2440之ads下dma测试
在网上找到一个dma的ads工程,将其dma功能整到了原来的ads工程TQ2440_Test里面用下面的main.c换下原来TQ2440_Test的main.chttp://download.csdn.net/detail/songqqnew/3636198之所以要介绍DMA,因为它对性能太重要了!只有活用了DMA,CPU的性能才能上去!S3c2410有四个DMA,每个DMA支持工作方式基本相同,但支持的source Dest可能略有不同,具体见Datasheet。这里具体DMA CONTROL寄存器(DCON)的配置说明,进而引出DMA的各种工作方式。Atomic transfer:指的是DMA的单次原子操作,它可以是Uni
发表于 2020-07-19
mini2440裸机试炼之--myled
///**********************************************************//*****************此函数为实现***************************//**led1亮>>>led1灭>>>                                    //**>>>led1、led2亮>>>
发表于 2020-07-06
<font color='red'>mini2440</font>裸机试炼之--myled
mini2440裸机试炼之--按键控制蜂鸣器和LED
根据用户手册和数据手册得到***************************************************************************************************************************************************************                      ***************************************************
发表于 2020-07-06
<font color='red'>mini2440</font>裸机试炼之--按键控制蜂鸣器和LED
mini2440裸机试炼之——PWM定时器按键更改频率
资料:《s3c2440中文数据手册(完整版)》 第九章:输入输出端口  ;第十章:PWM蜂鸣器//按按键k1蜂鸣器频率降低,//按按键k2蜂鸣器频率升高,//按按键k3退出蜂鸣器测试//按按键k4开启蜂鸣器测试 #define GPBCON    (*(volatile unsigned long*)0x56000010)  //rGPBCON是指向0x56000010这个地址空间的一个宏#define GPBDAT    (*(volatile unsigned long*)0x56000014)  //led GPIO 
发表于 2020-07-06
mini2440裸机试炼之--A/D模拟信号转换
/ (49+1) = 1 MHzA/D 转换的时间 = 1 /(1MHz / 5cycles)=5 uS由此可知当PRSCVL的值越小,A/D 转换的时间越短,A/D 转换的频率也就越大。注意:当从待机模式中变换到正常工作模式时,ADC的预分频器必须在最后的3个ADC时钟前使能????SEL_MUX是模拟输入通道选择控制器READ_START要使能A/D转换启动,就必须禁止READ_ STARTENABLE_START 使能A/D转换控制位ADCDAT0由于只是通过AIN0模拟信号输入。并没使用触摸屏功能,所以,ADCDAT0只考虑普通ADC转换数值(模拟信号转换的数字数值存于XPDATA)W1可调电位器mini2440上有一个可调电位器
发表于 2020-07-06
<font color='red'>mini2440</font>裸机试炼之--A/D模拟信号转换
mini2440裸机试炼之—RTC闹钟中断,节拍中断
环境搭建    硬件环境:J-link v8、mini2440、J-link转接板、串口转USB线    软件环境:windows7(32位)、开发板uboot(NandFlash)、J-link驱动(J-Link ARM V4.10i)、SecureCRT、ADS1.2    其中ADS里的AXD设置:加载JlinkRDI.dll+Options->Configure Interface...,在Session File一页中选择“Run Configuration Script”,将该name.txt文本文件作为一个脚本加进来,确定。name.txt内容
发表于 2020-07-06
<font color='red'>mini2440</font>裸机试炼之—RTC闹钟中断,节拍中断
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2020 EEWORLD.com.cn, Inc. All rights reserved