历史上的今天

今天是:2024年10月21日(星期一)

正在发生

2019年10月21日 | 2440 I2C存储卡读写实验 AT24c08a

发布者:名字太长了吗 来源: 51hei关键字:I2C  存储卡读写  AT24c08a 手机看文章 扫描二维码
随时随地手机看文章

本实验为IIC总线通信协议,以友善之臂mini2440为实验平台,对其开发板上的AT24c08a指定位置写入字符串“hello”,并指定位置读出该位置的内容。


    初始工作,首先需要配置GPE14、15管脚分别为IICSLC、IICSDA,并禁止上拉功能。然后设置IIC时钟频率,使能应答信号,并使IIC中断使能,禁止IIC中断屏蔽寄存器


应答中断处理函数为清除中断标志位,清除中断标记flag。


    指定内存写函数的实现为:首先设置主设备发送模式,写入从设备地址,清除中断标记,然后等待应答,写入设备内存地址,等待到应答后开始连续发送数据,存入指定空间。发送结束发出停止命令,结束本次通讯,让IIC状态改为开始状态,准备下一次读写操作。


    指定内存读函数,首先配置设备为发送模式,写入要读的设备地址,写入要读的设备内存,设置为主机接收模式,发送接收设备地址,此后从设备会返回一个要读的内存地址,读取该地址抛弃后,连续读取指定内存数据,读到最后一个数据不再产生应答,停止接收,改为准备状态。


    AT24C08 的地址格式为: 1 0 1 0 A2 P1 P0 W/R

    A2为设备地址位、P1,P0为片内页寻址  LSB=0 写    LSB=1 读

其中mini2440读写位为自动标记无需配置。


/*51实验24: I2C存储卡读写实验*/


#include

#include

#define cp8155 XBYTE[0xff20]

#define pa8155 XBYTE[0xff21]

#define pb8155 XBYTE[0xff22]

#define pc8155 XBYTE[0xff23]

#define dataadr 0x4000



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

//MON51必须用到的

code unsigned char stop[3] _at_ 0x3b;


unsigned char code DISPB[]={0x0C0,0x0F9,0x0A4,0x0B0,0x99,0x92,0x82,0x0F8,0x80,0x90,

                            0x088,0x83,0x0C6,0x0A1,0x86,0x8E,0xFF,0x0C,0xDE,0x0F3,0x08F};

unsigned char ledbuf[6];

sbit SCL=P3^0;

sbit SDA=P3^1;

sbit INS=P1^0;

sbit WRS=P1^1;

sbit RDS=P1^2;

bit ack;                             //是否应答

void disp(void);

void delay(unsigned char dl);

void Start_I2c(void);

void Stop_I2c(void);

void SendByte(unsigned char c);

unsigned char  RcvByte();

bit ISendByte(unsigned char sla,unsigned char c);

bit IRcvByte(unsigned char sla,unsigned char *c);


void main(void)

{

    unsigned char tmp1,tmp2;

    bit wrok,wrst;                  //读写正常,读写状态

    //SP=0x60;

        SP=0x53;

    tmp2=0x50;

    wrok=1;  wrst=0;

        cp8155=0x43; 

    while(1)

    {

       while(INS);

       delay(1);

       if (INS==0) break;

    }

    while(1)

    {

       if (wrst==0)

       {//写数据到卡

          for (tmp1=0;tmp1<0x80;tmp1++)

          {

             WRS=!WRS;

             if (ISendByte(tmp1,tmp2)==0) {wrok=0; break;}

             tmp2++;

          }

          Stop_I2c();

       }

       else

       {//从卡读数据

          for (tmp1=0;tmp1<0x80;tmp1++)

          {

             RDS=!RDS;

             if (IRcvByte(tmp1,&tmp2)==0) {wrok=0; break;}

             XBYTE[dataadr+tmp1]=tmp2;               //读取数据

          }

          Stop_I2c();

       }

       if (wrok==0)

       {//读写错误

          ledbuf[0]=0x01;  ledbuf[1]=0x0c;  ledbuf[2]=0x10;

          ledbuf[3]=0x0E;  ledbuf[4]=0x14;  ledbuf[5]=0x14;//IC-ERR

          while(1) disp();

       }

       if (wrst==0) wrst=1; //向卡写数据完成后,读取数据

       else

       {//IC卡读写正确

          ledbuf[0]=0x01;  ledbuf[1]=0x0c;  ledbuf[2]=0x09;

          ledbuf[3]=0x00;  ledbuf[4]=0x00;  ledbuf[5]=0x0d;//ICgood

          while(1) disp();

       }

    }

}


void disp(void)

{

    unsigned char i;

    unsigned int ledwz=0x20;

    for (i=0;i<6;i++)

    {

       pb8155=DISPB[ledbuf[i]];

       pa8155=~(ledwz>>i);

       delay(8);

    }

}


void delay(unsigned char dl)

{

   unsigned char ii1,ii2;

   for (ii1=0;ii1    // for (ii2=0;ii2<0xA;ii2++);

     for (ii2=0;ii2<0x0f;ii2++);

}


//发送开始

void Start_I2c(void)

{

   SDA=1;  delay(1);

   SCL=1;  delay(1);

   SDA=0;  delay(1);

   SCL=0;  delay(1);

}

//发送停止

void Stop_I2c(void)

{

   SCL=0;  delay(1);

   SDA=0;  delay(1);

   SCL=1;  delay(1);

   SDA=1;  delay(1);

}


//发送数据C可以是地址,也可以是数据,发完后等待应答,并置状态位ack=1(ok)

void  SendByte(unsigned char c)

{

   unsigned char BitCnt;

   for(BitCnt=0;BitCnt<8;BitCnt++)  //要传送的数据长度为8位

   {

      SCL=0;

      if((c<      else  SDA=0;

      delay(1);

      SCL=1;  delay(1);            //置时钟线为高,通知被控器开始接收数据位

   }

   SCL=0;    delay(1);

   SCL=1;    delay(1);

   if(SDA==1) ack=0;

   else ack=1;                    //*判断是否接收到应答信号

}


//发送字节数据函数

bit ISendByte(unsigned char sla,unsigned char c)

{

    Stop_I2c();  delay(1);               //结束总线

    Start_I2c();                //启动总线

    SendByte(0xA0);             //WR2401

    if(ack==0) return(0);

    SendByte(sla);              //地址

    SCL=0;    delay(1);

    if(ack==0) return(0);

    SendByte(c);         //写数据

    if (ack==0) return(0);

    Stop_I2c(); delay(3);

    return(1);

}


//读字节数据函数从器件地址sla,返回值在c. 返回1(OK)

bit IRcvByte(unsigned char sla,unsigned char *c)

{

    Stop_I2c();  delay(1);       //结束总线

    Start_I2c();                //启动总线

    SendByte(0xA0);             //WR2401

    if(ack==0) return(0);

    SendByte(sla);             //地址

    SCL=0;    delay(1);

    if(ack==0) return(0);

    Start_I2c();                //启动总线

    SendByte(0xA1);             //设备地址00

    if(ack==0) return(0);

    *c=RcvByte();               //读取数据

    if (ack==0) return(0);

    Stop_I2c();

    return(1);

}


//接收从器件传来的数据,并判断总线错误(不发应答信号),

unsigned char  RcvByte()

{

   unsigned char retc;

   unsigned char BitCnt;

   retc=0;

   for(BitCnt=0;BitCnt<8;BitCnt++)

   {

        SCL=0;   delay(1);    //置时钟线为低,准备接收数据位

        SCL=1;   delay(1);    //置时钟线为高使数据线上数据有效

        retc=retc<<1;

        if(SDA==1)retc=retc+1; //读数据位,接收的数据位放入retc中

        delay(1);

   }


关键字:I2C  存储卡读写  AT24c08a 引用地址:2440 I2C存储卡读写实验 AT24c08a

上一篇:arm汇编程序S3C2440
下一篇:ARM异常中断返回的几种情况

推荐阅读

受物联网、个人设备、数据中心的强劲带动,未来五年,人工智能为半导体带来的收益将增长13倍以上,年复合增长率超过50%,成为集成电路厂商不可错过的蓝海盛宴。 尤其在以下这几个领域,半导体供应商可以积极寻求为人工智能训练开发新器件并由此获得新商机。 工作负载加速器。目前,基于GPU的系统正在许多训练系统中使用。然而,随着开发人员获得神经网络...
  作为一名系统和应用工程师,得益于自动化仪器和软件,我已经节省了不计其数的日日夜夜;例如LabVIEW,这是一款系统设计平台和开发环境,支持可视化编程语言。LabVIEW支持用户利用友好的图形用户界面(GUI)构建应用程序。该平台带有多个库和模块,使其能够与仪器通信,所以可用于实验室自动化。作为LabVIEW用户,我已经使用该工具构建了多款应用程序,但...
10月20日下午消息,图像质量评估公司DXOMARK发布了一套全新测试体系——智能手机屏幕评分,用于测试评估智能手机屏幕质量。  同时,DXOMARK更新了旗下智能手机摄像头评分测试基准,增加了“可信度”、“预览”等测试项目,并将“变焦”从小项评分中独立成一个大项。  评分从手机摄像头扩充到屏幕  首先说说DXOMARK全新测试体系——智能手机...
2021年10月20日,MediaTek举办天玑旗舰技术媒体沟通会,分享了基于天玑5G移动平台的多领域技术成果和发展趋势,包括支持3GPP R16标准的新一代5G调制解调器、高能效AI应用、移动端游戏前沿技术以及天玑5G开放架构等主题,充分展现出MediaTek在天玑5G移动平台上的技术领先性和科技创新实力,推动移动终端的用户体验不断升级。新一代5G调制解调器,推动5G关...

史海拾趣

问答坊 | AI 解惑

向前辈和同学们求助,,基于51单片机的数字电压表

内容:测量范围0-10VDC,误差5%,,设计直流电压变换电路,AD转换电路,接口电路,显示电路,设计电源,计算电源功率及效率。 我们单片机是考察课,但是这次的实习课程设计要求十分严格,要一周内做出,上课时候AD和接口和显示都是略过的,而且老 ...…

查看全部问答∨

这个问题很严重,请问怎么解决?

[img]file:///F:/Program%20Files/Tencent/QQ/Users/382864860/Image/@760GXD(G96Y24}MHQ[1DN0.jpg[/img] 昨天编程的时候出现了这个问题啊,弄了一天还是没弄好。希望大家帮帮忙!! 还有,用到事件管理器(EVA)的时候,要出现PWM波形,使用比 ...…

查看全部问答∨

单片机做万用表

谁用单片机做过万用表给个资料参考一下 谢谢了  我想做个万用表自己用…

查看全部问答∨

频谱分析仪操作指南

replyreload += \',\' + 279230;  目   录 频谱分析仪操作指南... 1 第一节 仪表板描述... 1 一、前面板... 1 二、 后面板(略) 6 第二节   基本操作... 6 一、菜单操作和数据输入... 6 二、显 ...…

查看全部问答∨

手把手教你写程序(zt)

手把手教你写程序 内容:从最简单的程序入手,手把手教你写程序,让同学们拿到一个复杂的程序或者任务,能快速找到切入点,写出程序,再在此基础上优化程序。当拿到一个单片机任务时,不要急于动手写程序,先仔细分析它的以下几个点: 1、它要 ...…

查看全部问答∨

LPCXpresso -- 你对它没感觉吗(全面深入的感受)

         用LPCXpresso差不多一个多月了,发现最近越来越喜欢它了,但是也发现了它的很多不足,下面将深入全面地与大家一起讨论它的优缺点:   LPCXpresso -- 我到底喜欢你什么?     1 ...…

查看全部问答∨

【请教】关于GSM模块操作的问题

在使用GSM模块的时候,有一个担心: 在我发送短信的时候,消息发送动作已经完成,但是模块还没有返回OK时,如果恰巧有新的短信到来,会不会先返回一个收到短信的 “+CMTI: "SM",x”的信息,而后再返回发送短信成功的 “+CMGS: xxx”及 OK 信息 ...…

查看全部问答∨

基于ZIGBEE的智能家居应该选择哪种拓扑结构为宜?

大家好。小弟要写一篇硕士毕业论文。内容是关于ZIGBEE的智能家居系统。 我看了一些1,2年前的文献,他们大都采用星型的拓扑结构。 我想问下,如果采用星型的话,那么在房间内的那些终端节点,会不会因为墙的阻挡,而在与中央的主控制器的通信过程 ...…

查看全部问答∨

WinCE5中的CEC文件如何做出Choose 1的效果

WinCE5 CEC文件中如何做把几个组件做成Choose 1的效果。 比如:File System-Internal ( Choose 1 ) 是如何做出来的。 …

查看全部问答∨

几个uc/os-II的问题(实在找不到答案)

uc/os-II中任务调度是分时的还是占先式? uc/os-II中设计一个任务需要考虑哪些问题? uc/os-II中任务通信有哪些方式?…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved