|
技术交流 | 电路欣赏 | 工控天地 | 数字广电 | 通信技术 | 电源技术 | 测控之家 | EMC技术 | ARM技术 | EDA技术 | PCB技术 | 嵌入式系统 驱动编程 | 集成电路 | 器件替换 | 模拟技术 | 新手园地 | 单 片 机 | DSP技术 | MCU技术 | IC 设计 | IC 产业 | CAN-bus/DeviceNe |
24c64的问题 |
作者:sophiewang 栏目:单片机 |
/*********************24C64.html">24C64读写操作************************/ /************ 启动总线 *************/ void Start() { SDA=1; /*发送起始条件的数据信号*/ _nop_(); SCL=1; _nop_(); _nop_(); SDA=0; /*发送起始信号*/ _nop_(); _nop_(); SCL=0; /*钳住I2C总线,准备发送或接收数据 */ } /*************************************************************************** 停止IIC总线 ****************************************************************************/ void Stop() { SCL=0; _nop_(); SDA=0; /*发送结束条件的数据信号*/ _nop_(); SCL=1; /*发送结束条件的时钟信号*/ _nop_(); SDA=1; } /*************************************************************************** 对总线产生应答 ****************************************************************************/ void Ack() { SDA=0; /*在此发出应答信号 */ _nop_(); _nop_(); SCL=1; _nop_(); _nop_(); SCL=0; /*清时钟线,钳住I2C总线以便继续接收*/ _nop_(); _nop_(); SDA=1; } /*************************************************************************** 不对总线产生应答 ****************************************************************************/ void NoAck() { SDA=1; /*在此发出非应答信号 */ _nop_(); _nop_(); SCL=1; _nop_(); _nop_(); SCL=0; /*清时钟线,钳住I2C总线以便继续接收*/ } /*************************************************************************** 检查应答位 /***************************************************************************/ bit TestAck() { SDA=1;_nop_(); SCL=0;_nop_(); SCL=1;_nop_(); _nop_();_nop_();_nop_(); _nop_();_nop_();_nop_(); if(SDA==1)return(1); SCL=0;_nop_(); return(0); } /*************************************************************************** 向IIC总线写一字节数据 ****************************************************************************/ void Send(uchar input) { uchar j=8; SCL=0;_nop_(); while(j--) { SDA=(bit)(input&0x80);_nop_(); input=input<<1; SCL=1;_nop_(); SCL=0;_nop_(); } } /*************************************************************************** 向24C64写入多字节 输入:地址指针,E2ROM地址,字节数 ****************************************************************************/ uchar Write24C64.html">24C64(uchar *Wdata,uint RomAddr,uchar num) { uchar VALUE; Start(); Send(WriteDeviceAddr); //设置控制字 if(TestAck()==1)return(1); VALUE=RomAddr/256; Send(VALUE); if(TestAck()==1)return(1); VALUE=RomAddr%256; Send(VALUE); if(TestAck()==1)return(1); for(;num>0;num--) { Send(*Wdata); Wdata++; if(TestAck()==1)return(1); } Stop(); delayNms(100); return(0); } /************************* 向24C64写入单字节 输入:E2ROM地址,数据 *************************/ uchar Write24C64.html">24C64_byte(uint address,uchar ddata) { uchar VALUE; Start(); Send(WriteDeviceAddr); _nop_(); if(TestAck()==1)return(1); VALUE=address/256; Send(VALUE); _nop_(); if(TestAck()==1)return(1); VALUE=address%256; Send(VALUE); _nop_(); if(TestAck()==1)return(1); Send(ddata); _nop_(); if(TestAck()==1)return(1); Stop(); delayNms(100); return(0); } /*************************************************************************** 从IIC总线上读一字节数据 ****************************************************************************/ uchar Receive() { uchar j=8,rbyte=0; while(j--) { SCL=1; rbyte=rbyte<<1; rbyte=rbyte|SDA; SCL=0;_nop_();_nop_(); } return(rbyte); } /*************************************************************************** 向 24C64.html">24C64读多字节; 输入:存放的地址指针,E2ROM地址,字节数 ****************************************************************************/ uchar Read24C64.html">24C64(uchar *RamAddr,uint RomAddr,uchar bytes) { uchar VALUE; Start(); Send(WriteDeviceAddr); delayNms(1); if(TestAck()==1)return(1); VALUE=RomAddr/256; Send(VALUE); delayNms(1); if(TestAck()==1)return(1); VALUE=RomAddr%256; Send(VALUE); delayNms(1); if(TestAck()==1)return(1); delayNms(10); Start(); Send(ReadDviceAddr); delayNms(1); if(TestAck()==1)return(1); while(bytes) { *RamAddr=Receive(); Ack(); RamAddr++; bytes--; } NoAck(); Stop(); delayNms(100); return(0); } 数据写入正常,读出不太稳定,有时必须读两次才能读出正确的值. |
2楼: | >>参与讨论 |
作者: isoar 于 2006/1/23 16:24:00 发布:
写入之后不要马上读,加个延时后再读试试 |
3楼: | >>参与讨论 |
作者: 后学 于 2006/1/23 16:58:00 发布:
看datasheet上写的需要多少延时 |
|
|
免费注册为维库电子开发网会员,参与电子工程师社区讨论,点此进入 |
Copyright © 1998-2006 www.dzsc.com 浙ICP证030469号 |