1. 初识NM25Q128:从芯片手册开始
拿到一款新的芯片,第一件事就是找它的数据手册(datasheet)。NM25Q128是一款128Mb的SPI NorFlash,很多嵌入式项目都会用到它。我第一次接触这个芯片时,也是有点懵的——手册几十页,全是英文,该从哪里看起呢?
其实很简单,先看目录结构。NM25Q128的手册通常包含这几个关键部分:内存组织、指令集、时序图、电气特性。对我们写驱动来说,最重要的是前三部分。内存组织告诉我们芯片的存储结构,指令集是控制芯片的方法,时序图则是确保通信正确的关键。
NorFlash和NAND Flash不同,它支持按字节读取,但写入前需要先擦除。NM25Q128将16MB容量分为256个块(block),每个块有16个扇区(sector),每个扇区4KB。这意味着最小擦除单位是4KB,写操作可以按页(page)进行,每页256字节。
刚开始看手册可能会觉得枯燥,但只要你抓住这几个关键点,就能快速上手。我自己习惯先看指令集,因为这是驱动开发的核心。NM25Q128支持标准SPI模式0和模式3,通信速率最高可达104MHz,在实际项目中完全够用。
2. 搭建开发环境:硬件连接与SPI初始化
在开始写代码前,得先把硬件环境搭好。NM25Q128采用标准的SPI接口,只需要4根线:SCK(时钟)、MOSI(主机输出从机输入)、MISO(主机输入从机输出)、CS(片选)。有些板子还支持Quad SPI,但基础驱动用标准SPI就够了。
我用的是STM32系列MCU,通过STM32CubeMX配置SPI外设特别方便。打开CubeMX,选择对应的SPI接口,配置为全双工主模式,数据大小8位,硬件NSS信号禁用(我们用软件控制片选)。时钟极性(CPOL)和相位(CPHA)要根据手册设置——NM25Q128支持模式0(CPOL=0,CPHA=0)和模式3(CPOL=1,CPHA=1),我一般用模式0。
// SPI初始化代码示例
void SPI2_Init(void)
{
SPI_HandleTypeDef hspi2;
hspi2.Instance = SPI2;
hspi2.Init.Mode = SPI_MODE_MASTER;
hspi2.Init.Direction = SPI_DIRECTION_2LINES;
hspi2.Init.DataSize = SPI_DATASIZE_8BIT;
hspi2.Init.CLKPolarity = SPI_POLARITY_LOW; // CPOL = 0
hspi2.Init.CLKPhase = SPI_PHASE_1EDGE; // CPHA = 0
hspi2.Init.NSS = SPI_NSS_SOFT;
hspi2.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2; // 设置时钟分频
hspi2.Init.FirstBit = SPI_FIRSTBIT_MSB;
hspi2.Init.TIMode = SPI_TIMODE_DISABLE;
hspi2.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
if (HAL_SPI_Init(&hspi2) != HAL_OK)
{
Error_Handler();
}
}
片选引脚(CS)需要单独配置为GPIO输出,推挽模式,上拉电阻。在实际连接时,记得加上10kΩ的上拉电阻,确保信号稳定。电源引脚最好并联一个0.1μF的去耦电容,减少电源噪声。
3. 解读时序图:掌握通信的关键
时序图是datasheet中最重要又最容易让人困惑的部分。我第一次看时序图时,完全不知道那些箭头和波形在说什么。但其实只要掌握几个关键点,就能轻松读懂。
以


3375

被折叠的 条评论
为什么被折叠?



