铁电体比EEPROM读写速度更快,且该芯片的接口是SPI接口,本质上DSP的数据存储,属于SPI主从机数据交互。
DSP做主机时会控制通信的时钟,铁电模块FM25CL64作为从机是不能产生时钟的。如果从机要发送数据,那可以在主机发送数据的时钟上发送数据,这也就是主机DSP读取数据时的虚写/伪写操作。
铁电模块操作码
#define Read_CMD 0x0300 //读25LC640命令0000 0011
#define Write_CMD 0x0200 //写25LC640命令0000 0010
#define Wren_CMD 0x0600 //写25LC640使能命令0000 0110
#define Wrdi_CMD 0x0400 //复位 写25LC640使能命令0000 0100(禁止写操作)
#define Rdsr_CMD 0x0500 //读25LC640状态寄存器命令0000 0101(读状态,看有没有读取结束)
#define Wrsr_CMD 0x0100 //写25LC640状态寄存器命令0000 0001(写状态,看有没有写结束)
#define State 0x0200 //写入25LC640状态寄存器的数据
注意DSP的SPI虽然可以配置为8bit收发模式,但是DSP的SPI是16位收发,而且DSP在发数据时候是高位数据有效,收数据是低位数据有效。因此,操作码的宏定义主动将其左移8位。
SPI读写铁电体流程图
写入数据
读取数据
使能写操作
读状态
写入的注意
一开始没注意SPI存在mode 0-3四种类型,初期在存储数据时,经常遇到存入0X41等二进制结尾为1的数据会出现错误的情况。从0-15的数据存储结果如下:
00FF
0004
0004
0003
0004
0004
0006
0007
000A
000A
000A
000B
000C
000C
000E
000F
铁电模块的时序要求相对比EEPROM较低,理论上写入字节后不需要延时即可写入下一个字节,且不同于FLASH,不存在只能从1转为0的情况,不需要将数据位提前写入FF。铁电的数据存储也不是页操作,直接向相应地址写入字节即可。
因此,排除以上的可能后,就是SPI的Mode 0&3的选择问题。
两者都是上升沿触发,但是时序上有一定的差别
因此SPI Mode选错后,出现部分数据的最后一位丢失的情况。
经过实验,确定了版上模块的SPI采用的是mode 3,只需要将spi模块配置为mode 3即可。
经过修改后的程序,无论几个字节的数据(字节、整型和浮点数)都能正确存储。
字节(0-15)的存储结果如下:
0000
0100
0200
0300
0400
0500
0600
0700
0800
0900
0A00
0B00
0C00
0D00
0E00
0F00
浮点数的存储结果如下: