1概述
SO8N封装的高速串行闪存M25PXX系列尺寸紧凑,成本低廉,适合各种对成本有较高要求的计算机及消费电子产品的代码存储应用,如打印机、光驱、无线局域网(WLAN)模块以及机顶盒(STB)。
M25PXX系列串行闪存容量为512 Kb~128 Mb可选择,具有先进的写保护机制,支持速度高达50 MHz的SPI兼容总线的存取操作。这一系列闪存IC的工作电压范围为2.7~3.6 V,工作温度范围为-40℃~+85℃。软件功能包括整体擦除和扇区擦除、灵活的页编程指令和写保护,JEDEC标准2字节电子签名简化了设备身份验证,同时向后兼容1字节电子签名。数据保存期限为20年,每个扇区可承受100 000次擦写循环。
2芯片简介
2.1引脚排列和功能
M25P10单片容量为1 Mb,其引脚排列如图1所示,引脚功能如表1所列。
图1M25P10引脚图
表1M25P10引脚功能
2.2芯片的内部逻辑结构
如图2所示,M25P10的内部逻辑结构由5部分组成: 控制逻辑、I/O移位寄存器、地址寄存器和地址计数器、数据缓存寄存器、存储器页阵列。其中,存储器页阵列每页128字节,共1 024页。
图2M25P10内部逻辑结构图
3存储器的读写接口与操作命令
3.1SPI接口
M25P10与MCU之间采用增强型4线SPI接口,在一个系统中允许多片以复用总线方式连接,连接示意图如图3所示。
图3M25P10与MCU的SPI接口图
3.2存储器操作命令及其格式
M25P10支持的操作指令共有10条(如表2所列),所有命令都是8位。部分命令需要3字节地址和至少1字节数据,详见表2。
表2M25P10的存储命令
操作步骤如图4所示。首先选中芯片(即片选信号拉低),然后串行输入命令字节(1字节)和地址字节(0或3字节),接着串行输入或输出数据字节,最后把片选信号拉高,M25P10启动内部控制逻辑,自行完成相应的操作。
图4存储命令操作步骤
4M25P10与AVR单片机的接口设计
4.1电路图
AVR单片机是基于RISC指令集的单片机,接口丰富,带有功能完善的SPI接口。这里以ATmega88驱动M25P10为例,接口电路图如图5所示。单片机ATmega88 SPI接口引脚SCK、MISO、MOSI分别接M25P10的引脚C、Q、D,另外单片机还需要一个引脚提供片选信号。
图5M25P10与ATmega88接口电路图
4.2驱动程序设计
M25P10驱动程序包括:SPI初始化,数据读取,数据写入,扇区擦除,整体擦除,掉电休眠,掉电唤醒等函数。这里使用标准C编程,编译器选择AVR GCC。
AVR单片机具有非常完善的SPI接口,由控制寄存器SPCR和状态寄存器SPSR控制。其结构分别如下:
这里将SPI配置为主机模式,时钟倍速,SPI初始化与读写函数代码如下:
void spi_init(void){//SPI初始化
/*设置引脚MOSI、SCK、SS为输出,其他为输入*/
DDRB = _BV(PB5) |_BV(PB3) |_BV(PB2);
SPSR = _BV(SP2X);//SPI时钟倍速为fosc/2,fosc为
//CPU时钟
/* SPI使能,配置成主机传送模式,时钟上升沿有效,时钟不分频 */
SPCR = _BV(SPE) |_BV(MSTR);
}
void write_spi(uint8_t dat) {//通过SPI写1字节数据
SPDR = dat;
while(!(SPSR & (1<<SPIF)));//这里采用查询方式
}
uint8_t read_spi() {//通过SPI读回1字节数据
SPDR = 0;
while(!(SPSR & (1<<SPIF)));//这里采用查询方式
return SPDR;
}
M25P10状态寄存器由SRWD、BP[1∶0]、WEL、WIP等位构成,SRWD与引脚一起,实现写保护;BP[1∶0]用来设置分块操作;WEL (Write Enable Latch)=1表示写允许,否则禁止写操作;WIP(WriteInProcess)=1表示写操作正在进行中,否则写操作结束。一般在启动新的读写数据操作前,通过读状态寄存器检测写操作是否正在进行;如果前次写操作正在进行中,则不允许新的读写操作发生。忙检测函数代码如下:
void check_busy(void) {//忙检测
CLR_SS();//片选拉低
write_spi(RDSR);//定义RDSR=0x05,发出读状态
//寄存器命令
while((read_spi() & 0x01))//读状态寄存器,直到WIP=0
if(time_out()) break;//超时退出
SET_SS();//片选拉高
}
其中CLR_SS()和SET_SS()为宏定义,分别使片选引脚电平拉低和拉高。
其他读写、擦除函数等略——编者注。
M25P10将1 Mb(即131 072字节)分成4个扇区(Sector),地址范围如表3所列。
数据擦除有两种方式: 扇区擦除和整体擦除。其中,扇区地址由地址位16、15确定。执行数据擦除函数将会使内部所有数据变为FFH。
以上代码都通过实际运行测试。实践证明,M25P10性能可靠,是一款高性价比的串行闪存。
表3存储空间分块地址范围
结语
笔者前不久在设计一款温度测量记录仪时选择了M25P10作为存储器,并参考英文数据手册,编写了测试程序。发现命令简单,容易上手,性能完全满足设计要求。现在总结出来,希望有一定的参考价值。