eeprom模块:
1、介绍:支持协议为IIC,以字节为单位进行读写,也就是一个内部储存器地址所指向的数据长度为8个位即一个字节,它支持一次读写一个字节和一次连续读写8个字节。
2、常见的分为AT24C01/02/04/08/16/32/64/128/256/512/1024,分别提供1kbit/2kbit/4kbit/8kbit/16kbit/32kbit/64kbit/128kbit/256kbit/512kbit/1024kbit空间来读写。
3、设备地址:地址位数为8,前四位固定为1010,后四位中的前三位由3个引脚决定,最后一位是R/W位,即最后一位由写或读决定,写是0,读是1。其中3个引脚分别为A0、A1和A2。也就是说最多可以接8个eeprom。但不是每个器件的设备地址都全由A0、A1和A2来控制,有的有其中两个来控制有的有一个甚至有的不由A0、A1和A2来控制,这是由于剩下的位用来做内部存储器地址。相应的表如下,
例如,要对at24c02读操作且引脚全都接地,则地址为1010 0001,即0xA1,写的话地址为0xA0.
4、内部储存器地址:首先说明一点内部储存器地址长度是由容量决定的,首地址从0开始,然后依次递增,也就是说地址可以是0可以是1可以是2,但是最大是由位数决定的。AT24C01、AT24C02地址长度为8位。AT24C04地址长度为9位,其中第一位是由A0引脚决定,这也就是为什么AT24C04的设备地址抛去A0引脚的原因。注意AT24C16的设备地址将3个引脚全抛去了,也就是说总线上只能接一个AT24C16,且AT24C16的内部储存器地址长度为11位。猜测at24c32及32以上芯片应该内部储存器地址长度为16位。在hal库中MemAddSize可以设为I2C_MEMADD_SIZE_8BIT或I2C_MEMADD_SIZE_16BIT.
5、写保护引脚:wp,接gnd允许正常读写,接vcc写保护。
6、注意事项:要将i2c时钟速度调低,我测试过了,取10000以下的都可以,系统时钟基本不会产生影响取72mhz即可,影响才能正常操作,速度太快eeprom反应不过来。每次写完数据都要加一个延时,比如Hal_Delay(5).
w25qxx模块:
1、介绍:属于NOR flash,支持spi协议中的模式0和模式1,以扇区为单位或整片进行擦除操作。在写数据之前要先进行擦除操作,因为它可以将1写为0但是不可以将0写为1,由于w25qxx的这种以扇区为单位进行擦除的特性,使得它修改数据是不易操作的,所以一般将它中的数据读到eeprom中然后再进行读写修改操作,再保存的w25qxx中。W25Q64内部分为128个块(Block),每个块的大小是64K字节。 每个块分为16个扇区(Sector),每个扇区的大小是4K字节。每个扇区分为16页(Page),每个页的大小是256个字节。各型号分成的块和扇区大小是一样的,只是不同大小的flash分成块的数量不一样。一个地址指向1个字节的空间,w25qxx共有24位的地址,也就是寻址空间为128Mbit。特别注意在进行擦除或写的时候要先进行写使能,只要是改变数据就要先进行写使能操作。在擦除某个扇区时,一般发送的地址取这个扇区的首地址,当然地址只要是这个扇区里面的地址都可以,只不过习惯地址取这个扇区的首地址。在此将读写操作概括如下。
1、读取设备id(常用来测试是否能正常测试芯片)
(1)cs引脚设为低电平。
读取设备id
cs引脚设为高电平。
2、擦除操作
(1)cs引脚设为低电平。
判断是否忙碌,即判断状态寄存器的s0是否为1,为1表示忙碌。
cs引脚设为高电平。
(2)cs引脚设为低电平。
写使能命令
cs引脚设为高电平。
(3)cs引脚设为低电平。
擦除命令
cs引脚设为高电平。
3、写操作(这里把擦除操作也放里面了,当然也可以不擦除直接写,但是要注意原来flash中的数据是否都是0xff,如果不是则要进行擦除操作):
(1)cs引脚设为低电平。
判断是否忙碌,即判断状态寄存器的s0是否为1,为1表示忙碌。
cs引脚设为高电平。
(2)cs引脚设为低电平。
写使能命令
cs引脚设为高电平。
(3)cs引脚设为低电平。
擦除命令
cs引脚设为高电平。
(4)cs引脚设为低电平。
判断是否忙碌
cs引脚设为高电平。
(5)cs引脚设为低电平。
写使能命令
cs引脚设为高电平。
(6)cs引脚设为低电平。
写入数据命令
cs引脚设为高电平。
4、读操作: