|
本帖最后由 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;
}
|
阿莫论坛20周年了!感谢大家的支持与爱护!!
你熬了10碗粥,别人一桶水倒进去,淘走90碗,剩下10碗给你,你看似没亏,其实你那10碗已经没有之前的裹腹了,人家的一桶水换90碗,继续卖。说白了,通货膨胀就是,你的钱是挣来的,他的钱是印来的,掺和在一起,你的钱就贬值了。
|