前面介绍过了,请参考
(十)IIC总线-PCF8591-ADC/DAC
内容依然是来自芯片数据手册以及自己总结理解
说人话:
1.有双线串行接口(IIC总线通讯)
2.保存时间周期最多需要5ms,因此连续写最好加个5ms延时
3.高可靠性:读写次数:1,000,000 次 – 数据保存:100 年
这里原理图大家注意一下A3是A2应该是标错了
最主要就是:
SDA数据线
SCL时钟线
A2,A1,A0地址线,其中:
24C01和24C02 使用A2,A1,A0作为硬件连接的器件地址输入引脚
24C04仅使用 A2、A1 作为硬件连接的器件地址输入引脚
24C08 仅使用 A2 作为硬件连接的器件地址输入引脚
24C16 未使用作为硬件连接的器件地址输入引脚,
WP写保护位:1-禁止读写,0-允许读写(如图默认允许所以WP接GND)
数据要放到哪个地址里面(数据存放的地址)
说人话:AT24C02里面那么多内存地址,需要一个8位的数据字地址来进行随机字寻址。
AT24C02是一个2k的设备—用8位的数据字地址随机寻址(0x00-0xff)
AT24C04是一个4k的设备—用9位的数据字地址随机寻址
AT24C08是一个8k的设备—用10位的数据字地址随机寻址
AT24C16A是一个16k的设备–用11位的数据字地址随机寻址
说人话:就是一些起始信号,终止信号,应答信号,复位信号等
起始信号:必须先于任何一个指令
应答信号:在第九个时钟脉冲发送,0-应答 1-非应答
AT24CXX设备的地址(器件/设备的地址)
结合上面原理图
地址读指令:0xA1
地址写指令:0xA0
说明():
1k/2k的EEPROM(AT24C02) 使用 A2,A1,A0作为设备地址
4k的EEPROM(AT24C02) 使用 A2,A1作为设备地址
8k的EEPROM(AT24C02) 使用 A2作为设备地址
16k的EEPROM(AT24C02) 不使用设备地址
比赛用单字节就行,多字节采取分割的形式储存
俩种:一个是单字节写入,一个是页写入
这里不关心,比赛就用单字节写入,即使连续写,也可以多次单字节写入
比赛用任意地址读取(因为一般比赛都不指定地址储存数据),另外random read 处理简单
三种:
1.当前地址读:最后一次读或写操作期间访问的最后一个地址(不指定地址),增加1,然后一直读
2.任意地址读 :指定地址,读取
3.顺序读:由当前地址或任意地址读取来启动,然后只要EEPROM收到确认,它将继续增加数据字地址,并连续钟出顺序数据字。
void WriteEeprom(u8 add, u8 dat)
{
I2CStart();
I2CSendByte(0xA0);
I2CWaitAck();
I2CSendByte(add);
I2CWaitAck();
I2CSendByte(dat);
I2CWaitAck();
I2CStop();
Delay5ms();//延迟5ms
}
u8 ReadEeprom(u8 add)
{
u8 tmp;
I2CStart();
I2CSendByte(0xA0);
I2CWaitAck();
I2CSendByte(add);
I2CWaitAck();
I2CStart();
I2CSendByte(0xA1);
I2CWaitAck();
tmp = I2CReceiveByte();
I2CSendAck(1);
I2CStop();
return tmp;
}
功能:用eeprom记录开机次数,S7短按键清除开机次数
小方法:这里用到了 一个标记法,解决了第一次开机检测问题
void EepromTask()
{
if(ReadEeprom(0x7f)!= 213){
WriteEeprom(0x7f,213);
WriteEeprom(0x03,1);
open_num = 1;
}else{
open_num = ReadEeprom(0x03);
WriteEeprom(0x03,++open_num);
}
}
----- 如有错误欢迎大家批评指正!!!