导航: 老古网老古论坛XMOS公共讨论区XMOS开源项目区单片机程序设计嵌入式系统广告区域
→[求助]请教一个24c01读写问题[dingyuqi]

 *第11708篇: [求助]请教一个24c01读写问题

  
楼 主:dingyuqi 2003年5月9日23:09
 [求助]请教一个24c01读写问题
做毕业设计使用到读写24c01,编了一个读写程序,编译执行起来没问题,就是有一个毛病,怎么该也改不了,请大家帮忙看看,是哪儿出毛病了。谢谢!!!

我是按{1,2,3,4}的顺序写的,但是我执行后最后读出来的是:{4,1,2,3}
不明白为什么会这样,请高手指教


源程序如下:
#include   <reg51.h>  
     sbit SCL=P0^6;
     sbit SDA=P0^7;
     
   
     #define WriteDeviceAddress 0xa0
     #define ReadDviceAddress 0xa1
void Write24c02(unsigned char*,unsigned char,unsigned char);
void Read24c02(unsigned char*,unsigned char,unsigned char);
void DelayMs(unsigned char);
void NoAck();
main()
{
unsigned char data_buffer[8]={1,2,3,4,5,6,7,8};
unsigned char data_receive[8]={0,0,0,0,0,0,0,0};
unsigned char i,j;
unsigned char *ptr;
ptr=data_buffer;
 Write24c02(ptr,10,4);
ptr=data_receive;
 Read24c02(ptr,10,4);
 
}
/***************************************************************************/
void Start() {
 SDA=1;
 SCL=1;
 SDA=0;
 SCL=0;
}

/***************************************************************************/
void Stop() {
 SCL=0;
 SDA=0;
 SCL=1;
 SDA=1;
}

/***************************************************************************/
void Ack() {
 SDA=0;
 SCL=1;
 SCL=0;
 SDA=1;
}

/***************************************************************************/
void NoAck() {
 SDA=1;
 SCL=1;
 SCL=0;
}

/***************************************************************************/
bit TestAck() {
 bit ErrorBit;
 SDA=1;
 SCL=1;
 ErrorBit=SDA;
 SCL=0;
 return(ErrorBit);
}

/***************************************************************************/
bit Write8Bit(unsigned char input) {
 unsigned char temp;
 for(temp=8;temp!=0;temp--) {
  SDA=(bit)(input&0x80);
  SCL=1;
  SCL=0;
  input=input  <  <1;
 }
}

/***************************************************************************/
void Write24c02(unsigned char *Wdata,unsigned char RomAddress,unsigned char number) {
 Start();
 Write8Bit(WriteDeviceAddress);
 TestAck();
 //for(;number!=0;number--) {
 Write8Bit(RomAddress);
 TestAck();
 for(;number!=0;number--) {
  Write8Bit(*Wdata);
  TestAck();
  Wdata++;
  
 
 }
 Stop();
 //DelayMs(10);
}

/***************************************************************************/
unsigned char Read8Bit() {
 unsigned char temp,rbyte=0;
 for(temp=8;temp!=0;temp--) {
  SCL=1;
  rbyte=rbyte  <  <1;
  rbyte=rbyte|((unsigned char)SDA);
  SCL=0;
 }
 return(rbyte);
}

/***************************************************************************/
void Read24c02(unsigned char *RamAddress,unsigned char RomAddress,unsigned char bytes) {
 /*unsigned char temp,rbyte;*/
 Start();
 Write8Bit(WriteDeviceAddress);
 TestAck();
 Write8Bit(RomAddress);
 TestAck();
 Start();
 Write8Bit(ReadDviceAddress);
 TestAck();
        while(bytes!=0) {
 *RamAddress=Read8Bit();
 Ack();
 RamAddress++;
 bytes--;
 }
 *RamAddress=Read8Bit();
 NoAck();
 Stop();
}

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

  
2楼:langren0468 2003年5月9日23:25
 我的24C02程序,编译通过了的!

点击浏览该文件
  
3楼:dingyuqi 2003年5月9日23:30
 我的程序和你的差不多啊?但是结果不对,怎么回事?
  
4楼:langren0468 2003年5月9日23:32
 你对照看看,我的调试没问题!
  
5楼:dingyuqi 2003年5月9日23:37
 好,我看看,你是分页写的呢还是单字节写?
  
6楼:langren0468 2003年5月9日23:39
 我睡觉了,你自己看看!
  
7楼:dingyuqi 2003年5月9日23:51
 还是一样,读出来的是{4,1,2,3}
  
8楼:dingyuqi 2003年5月10日21:45
 高手快帮帮我啊,急!!!这是个怪问题,我实在是没办法了
  
9楼:学习中 2003年5月11日13:08
 好像多读了1字节,但不至造成这样的问题。
好像多读了1字节,但不至造成这样的问题。
把写过的24c01在编程器上读出,如果内容没问题,重点查读出程序,否则查写入程序。
  
10楼:Lichunfu 2003年5月15日12:10
 该程序只适用于AT24C02、AT24C08等
对于AT24C01不需要设备地址码:
   写单字节数据时序:
   STA  数据地址(7bit)+0(写数据)  ACK  写8Bit数据  ACK  STOP

   随机地址读数据时序:
   STA  数据地址(7bit)+1(写数据)  ACK  读8Bit数据  NoACK  STOP

   地址和指令字结构:
   A6 — A0 R/W 共7Bit


>>>>>>对该主题发表你的看法

本主题贴数10,分页: [第1页]


[上一篇主题]:谢谢,太好了!

[下一篇主题]:请问高手用89C2051与PC问题?急!