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;
}
程序能够从头走到尾。
这个程序略加修改用在摄像头初始化上没问题 这个程序读24C16估计没问题,读08像是多了一句 看看你上拉了没有。 有示波器看SDA,SCL的波形,很容易找出问题的。 24C02和24C08的时序都不一样吧?地址应该多一个,是16Bitd
页:
[1]