本实验为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<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< 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); } // for (ii2=0;ii2<0xA;ii2++);
上一篇:arm汇编程序S3C2440
下一篇:ARM异常中断返回的几种情况
推荐阅读
史海拾趣
Arima Lasers Corp的初期,是一个典型的初创企业,面临着资金短缺和技术难题的双重压力。然而,公司的研发团队在激光技术方面取得了重大突破,成功开发出一种新型的激光发射器,具有更高的功率和更稳定的性能。这一技术突破不仅吸引了投资者的关注,也为公司在市场上赢得了初步的声誉。随着产品的不断迭代和优化,Arima Lasers Corp逐渐在激光行业中占据了一席之地。
为了吸引和留住优秀人才,正泰公司实施了股权激励计划。公司创始人南存辉为了推动公司从“家族企业”向“集团企业”过渡,坚决开展“股权配送”,让更多优秀人才得到股权激励。这一举措不仅激发了员工的积极性,也促进了公司的快速发展。同时,公司还注重人才培养,鼓励员工参加各类培训和学习,提升个人能力和素质。
自1983年成立以来,GISMA Steckverbinder GmbH便专注于水下连接器的开发、设计和生产。作为一家由所有者直接管理的独立公司,GISMA从一开始就确立了为海洋工业、船舶及海洋技术提供高质量电气和光纤连接器的目标。这一明确的市场定位使得GISMA能够迅速在竞争激烈的电子行业中脱颖而出,逐步建立起自己的市场地位。
深圳市巴丁微电子有限公司,简称巴丁微,自创立之初便专注于高性能模拟集成电路的研发与销售。公司的创始人及核心团队由一群在集成电路行业拥有丰富经验的专家组成,他们看中了电子行业的巨大潜力,决心以技术创新为驱动力,推动模拟集成电路的发展。
在创立初期,巴丁微面临着资金短缺、市场竞争激烈等诸多挑战。然而,凭借着对技术的深刻理解和不懈追求,巴丁微成功研发出了一系列具有竞争力的产品,并逐渐在电机驱动和电源管理等电子领域获得了市场认可。
Abbotec Incorporated公司自成立以来,一直致力于电子技术的研发与创新。在某一年,公司研发团队成功开发出一款具有划时代意义的芯片,这款芯片在性能上大幅提升,同时降低了能耗。这一技术突破迅速引起了业界的关注,Abbotec因此获得了大量的订单,公司规模迅速扩大。
内容:测量范围0-10VDC,误差5%,,设计直流电压变换电路,AD转换电路,接口电路,显示电路,设计电源,计算电源功率及效率。 我们单片机是考察课,但是这次的实习课程设计要求十分严格,要一周内做出,上课时候AD和接口和显示都是略过的,而且老 ...… 查看全部问答∨ |
[img]file:///F:/Program%20Files/Tencent/QQ/Users/382864860/Image/@760GXD(G96Y24}MHQ[1DN0.jpg[/img] 昨天编程的时候出现了这个问题啊,弄了一天还是没弄好。希望大家帮帮忙!! 还有,用到事件管理器(EVA)的时候,要出现PWM波形,使用比 ...… 查看全部问答∨ |
手把手教你写程序 内容:从最简单的程序入手,手把手教你写程序,让同学们拿到一个复杂的程序或者任务,能快速找到切入点,写出程序,再在此基础上优化程序。当拿到一个单片机任务时,不要急于动手写程序,先仔细分析它的以下几个点: 1、它要 ...… 查看全部问答∨ |
LPCXpresso -- 你对它没感觉吗(全面深入的感受) 用LPCXpresso差不多一个多月了,发现最近越来越喜欢它了,但是也发现了它的很多不足,下面将深入全面地与大家一起讨论它的优缺点: LPCXpresso -- 我到底喜欢你什么? 1 ...… 查看全部问答∨ |
在使用GSM模块的时候,有一个担心: 在我发送短信的时候,消息发送动作已经完成,但是模块还没有返回OK时,如果恰巧有新的短信到来,会不会先返回一个收到短信的 “+CMTI: "SM",x”的信息,而后再返回发送短信成功的 “+CMGS: xxx”及 OK 信息 ...… 查看全部问答∨ |
大家好。小弟要写一篇硕士毕业论文。内容是关于ZIGBEE的智能家居系统。 我看了一些1,2年前的文献,他们大都采用星型的拓扑结构。 我想问下,如果采用星型的话,那么在房间内的那些终端节点,会不会因为墙的阻挡,而在与中央的主控制器的通信过程 ...… 查看全部问答∨ |
WinCE5 CEC文件中如何做把几个组件做成Choose 1的效果。 比如:File System-Internal ( Choose 1 ) 是如何做出来的。 … 查看全部问答∨ |
uc/os-II中任务调度是分时的还是占先式? uc/os-II中设计一个任务需要考虑哪些问题? uc/os-II中任务通信有哪些方式?… 查看全部问答∨ |