liudingding 发表于 2018-9-4 07:45:43

MEGA64读写24C系列储存器出错,为什么?

本帖最后由 liudingding 于 2018-9-4 08:19 编辑

用M64读写24C系列储存器出错,不知是什么原因。
程序是双龙的程序,源程序是24C02的,改为24C08的。
买过多批储存器,有一种24C储存器能够正常读写,现在不知是哪种了。
程序能够从头走到尾。
这个程序略加修改用在摄像头初始化上没问题

unsigned char mem_Read(unsigned int uiAddress)
      {
           unsigned char a1,a2;
           unsigned char temp;
           a2=uiAddress;
           a1=uiAddress>>8;;
           Start();//I2C启动
           Wait();
           if (TestAck()!=START) return 0;//ACK          
          
           Write8Bit(swr_m_add);//写I2C从器件地址和写方式rd wr
           Wait();
           if (TestAck()!=MT_SLA_ACK) return 0;//ACK
          
           Write8Bit(a1);//写24C02的ROM地址
           Wait();
           if (TestAck()!=MT_DATA_ACK) return 0;
          
           Write8Bit(a2);//写24C02的ROM地址
           Wait();
           if (TestAck()!=MT_DATA_ACK) return 0;
          
           Start();//I2C重新启动
           Wait();
           if (TestAck()!=RE_START)return 0;
           Write8Bit(srd_m_add);//写I2C从器件地址和读方式
           Wait();
           if(TestAck()!=MR_SLA_ACK)return 0;//ACK
          
           Twi();//启动主I2C读方式
           Wait();
           if(TestAck()!=MR_DATA_NOACK) return 0;//ACK       
           temp=TWDR;//读取I2C接收数据
       Stop();//I2C停止
           return temp;
      }

unsigned char mem_Write(unsigned char ucData,unsigned int uiAddress)
{
          unsigned char a1,a2;
          a2=uiAddress;
          a1=uiAddress>>8;
          Start();//I2C启动
          Wait();
          if(TestAck()!=START) return 1;//ACK
          Write8Bit(swr_m_add);//写I2C从器件地址和写方式
          Wait();
          if(TestAck()!=MT_SLA_ACK) return 1;//ACK
          
          Write8Bit(a1);//写24C02的ROM地址
          Wait();
          if(TestAck()!=MT_DATA_ACK) return 1;//ACK
          
          Write8Bit(a2);//写数据到24C02的ROM
          Wait();
          if(TestAck()!=MT_DATA_ACK) return 1;//ACK       
          
          Write8Bit(ucData);//写数据到24C02的ROM
          Wait();
          if(TestAck()!=MT_DATA_ACK) return 1;//ACK       
          
          Stop();//I2C停止
          delayms(10);//延时等EEPROM写完
          return 0;
}

liudingding 发表于 2018-9-4 07:46:35

程序能够从头走到尾。
这个程序略加修改用在摄像头初始化上没问题

蓝蓝的恋 发表于 2018-9-4 08:26:31

这个程序读24C16估计没问题,读08像是多了一句

wye11083 发表于 2018-9-4 10:15:01

看看你上拉了没有。

TIANYJ 发表于 2018-9-4 10:27:15

有示波器看SDA,SCL的波形,很容易找出问题的。

sunrn123 发表于 2018-9-4 12:11:40

24C02和24C08的时序都不一样吧?地址应该多一个,是16Bitd
页: [1]
查看完整版本: MEGA64读写24C系列储存器出错,为什么?