GD25Q32是一款基于SPI的Flash芯片,容量为32/8=4M bytes。它的引脚如下:
该芯片支持多种SPI操作方式,包括:Standard SPI(标准SPI)
、Dual SPI(双线 SPI)
和Quad SPI(四线 SPI) 。有关SPI的介绍可以参考:
SO,WP,SCLK,SI,HOLD为SPI通信引脚,使用标准SPI通信的话,一般只需考虑SCLK,SO和SI就已足够了。
与标准SPI的引脚对应为:
名称 | 标准 | GD25Q32 |
片选 | CS | CS# |
时钟 | CLK | SCLK |
主机发 | MOSI | SI(IO0) |
主机收 | MISO | SO(IO1) |
GD25Q32属于FLASH,因此和EEPROM不同的是,它无法按字节写入,必须按page去写。擦除的时候可以按扇区或块擦除。每个page有256bytes,注意到每个block可以有32K或64K bytes,这个在后面会影响具体的操作。
接下来直接展示驱动代码,具体解析可以看注释,使用STM32的硬件SPI
//使用spi3读一个字节,用的标准库
unsigned char flash_spi_rchar(void)
{
while((SPI3->SR&SPI_I2S_FLAG_TXE)==0) ;
SPI3->DR = 0xff;
while((SPI3->SR&SPI_I2S_FLAG_RXNE)==0) ;
return SPI3->DR;
}
//使用spi3写一个字节
void flash_spi_wchar(unsigned char ucChar)
{
while((SPI3->SR&SPI_I2S_FLAG_TXE)==0) ;
SPI3->DR = ucChar;
while((SPI3->SR&SPI_I2S_FLAG_RXNE)==0) ;
SPI3->DR;
}
首先列举一下芯片的默认指令,后面代码中出现的指令可以直接对照参考
继续上代码,主要是读写的驱动函数
unsigned char flash_read_status(void)
{
unsigned char ucChar;
FLASH_CS_EN;
flash_spi_wchar(0x05); //读取状态;
ucChar = flash_spi_rchar();
FLASH_CS_DIS;
return ucChar;
}
void flash_write_trail(unsigned int nAddress,unsigned char* ucData,unsigned int nLength)
{
unsigned int i,n;
while(flash_read_status()&0x01); //忙;
FLASH_CS_EN;
flash_spi_wchar(0x06); //写使能;
FLASH_CS_DIS;
FLASH_CS_EN;
flash_spi_wchar(0xd8); //擦除BLOCK,按64K擦除;
flash_spi_wchar((nAddress>>16)&0xff); //存储地址
flash_spi_wchar((nAddress>>8)&0xff);
flash_spi_wchar(nAddress&0xff);
FLASH_CS_DIS;
while(flash_read_status()&0x01); //忙
for(n=1; (n*256)<=nLength; n++) //256的倍数,表示按页写
{
while(flash_read_status()&0x01); //忙
FLASH_CS_EN;
flash_spi_wchar(0x06); //写使能;
FLASH_CS_DIS;
FLASH_CS_EN;
flash_spi_wchar(0x02); //写入数据;
flash_spi_wchar(((nAddress+(n-1)*256)>>16)&0xff);
flash_spi_wchar(((nAddress+(n-1)*256)>>8)&0xff);
flash_spi_wchar((nAddress+(n-1)*256)&0xff);
for(i=0; i<256; i++)
flash_spi_wchar(*ucData++);
FLASH_CS_DIS;
}
while(flash_read_status()&0x01); //忙
FLASH_CS_EN;
flash_spi_wchar(0x06); //写使能;
FLASH_CS_DIS;
FLASH_CS_EN;
flash_spi_wchar(0x02); //写入数据;
flash_spi_wchar(((nAddress+(n-1)*256)>>16)&0xff);
flash_spi_wchar(((nAddress+(n-1)*256)>>8)&0xff);
flash_spi_wchar((nAddress+(n-1)*256)&0xff);
for(i=0; i<(nLength%256); i++)
flash_spi_wchar(*ucData++);
FLASH_CS_DIS;
}
unsigned char flash_read_char(unsigned int nAddress)
{
unsigned char ucChar;
while(flash_read_status()&0x01); //忙;
FLASH_CS_EN;
flash_spi_wchar(0x03); //读数据
flash_spi_wchar((nAddress>>16)&0xff); //存储地址
flash_spi_wchar((nAddress>>8)&0xff);
flash_spi_wchar(nAddress&0xff);
ucChar = flash_spi_rchar();
FLASH_CS_DIS;
return ucChar;
}
以上就是GD25Q32的驱动代码,驱动函数中是按64K擦除的,如果需要按32K擦除,则使用0x52指令即可。
差点忘了,FLASH_CS_EN和FLASH_CS_DIS表示片选使能和失能,即CS引脚的拉高或拉低,由于低电平有效,因此FLASH_CS_EN表示的是引脚拉低。