本实例用的是STM32F103VET6平台,它有3个SPI接口(这里使用SPI1),各信号线连接到FLASH(型号:W25X16)的CS,CLK,DO,DIO线,以实现SPI通讯,对FLASH进行读写.
(这里采用主模式,全双工通讯,通过查询发送数据寄存器和接收数据寄存器状态确保通讯正常)
mian函数:
1#define sFLASH_ID 0xEF3015(前面加个1,免得变大)
u32 DeviceID;
u32 FlashID;
int main(void)
{
/115200 8-N-1/
USART1_Config();
SPI_FLASH_Init();
DeviceID = SPI_FLASH_ReadDeviceID();
Delay(200);
FlashID = SPI_FLASH_ReadID();
printf("\r\n FlashID is 0x%X, Manufacturer Device ID is 0x%X\r\n",FlashID,DeviceID);
if(FlashID == sFLASH_ID)
{
printf("\r\n 检测到 flash W25X16 !\r\n");
SPI_FLASH_SectorErase(FLASH_SectorToErase);
SPI_FLASH_BufferWrite(Tx_Buffer, FLASH_WriteAddress, BufferSize);
printf("\r\n 写入的数据为:%s \r\t", Tx_Buffer);
SPI_FLASH_BufferRead(Rx_Buffer, FLASH_ReadAddress, BufferSize);
printf("\r\n 读出的数据为:%s \r\n", Tx_Buffer);
TransferStatus1 = Buffercmp(Tx_Buffer, Rx_Buffer, BufferSize);
if( PASSED == TransferStatus1)
{
printf("\r\n 2M 串行 flash(W25X16)测试成功!\n\r");
}
else
{
printf("\r\n 2M 串行 flash(W25X16)测试失败!\n\r");
}
}
else
{
printf("\r\n 获取不到 W25X16 ID!\n\r");
}
SPI_Flash_PowerDown();
while(1);
}
mian函数的流程:
1,调用 USART1_Config() 初始化串口;
2,调用 SPI_FLASH_Init() 初始化SPI模块;
3,调用 SPI_FLASH_ReadDeviceID 读取FLASH器件生产厂商的ID信息;
4,调用 SPI_FLASH_ReadID 读取FLASH器件的设备ID信息;
5,如果读取ID正确,则调用 SPI_FLASH_SectorErase()把FLASH内容擦除,擦除后调用 SPI_FLASH_BufferWrite()向FLASH写入数据,然后再调用 SPI_FLASH_BufferRead()从刚刚写入的地址中读出数据,最后调用 Buffercmp()对写入和读取的数据进行匹配,匹配成功则把标志变量 TransferStatus1赋值为 PASSED(自定义的枚举变量);
6,根据标志量 TransferStatus1判断FLASH数据的:擦除,写入,读取是否正常,分情况输出到终端;
7,如果读取FLASH的ID信息错误,则直接向终端输出检测不到FLASH信息;
8,最后调用 SPI_Flash_PowerDown()函数关闭 FLASH设备的电源(因为数据写入到FLASH后并不会因断电而丢失,所以需要使用的时候再开启FLASH电源);
PS:
读取器件ID信息可以知道设备与主机是否能够正常工作,也便于区分不同的器件,可以在使用的FLASH用户数据手册找到ID表
SPI的初始化:
void SPI_FLASH_Init(void)
{
SPI_InitTypeDef SPI_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);
/这里是GPIO初始化部分,将4个引脚都设定好/
/!< Configure SPI_FLASH_SPI pins: SCK /
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
/!< Configure SPI_FLASH_SPI pins: MISO /
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
GPIO_Init(GPIOA, &GPIO_InitStructure);
/!< Configure SPI_FLASH_SPI pins: MOSI /
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
GPIO_Init(GPIOA, &GPIO_InitStructure);
/!< Configure SPI_FLASH_SPI_CS_PIN pin: SPI_FLASH Card CS pin /
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
/* Deselect the FLASH: Chip Select high */
SPI_FLASH_CS_HIG