以下是初始化AT32F435芯片的QSPI(四线SPI)接口,以驱动W25Q128JV闪存芯片,并使其工作在XIP(执行内存)模式下的示例代码:
#include "AT32f4xx.h"
// 初始化QSPI
void QSPI_Init() {
// 使能QSPI时钟
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_QSPI, ENABLE);
// 配置GPIO引脚
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13; // QSPI引脚配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);
// 配置QSPI参数
QSPI_InitTypeDef QSPI_InitStructure;
QSPI_InitStructure.QSPI_RP = 0x10; // 时钟极性为0
QSPI_InitStructure.QSPI_CP = 0x00; // 时钟相位为0
QSPI_InitStructure.QSPI_BaudRatePrescaler = 0x01; // 波特率分频为2
QSPI_InitStructure.QSPI_FIFOThresh = 0x08; // FIFO阈值为8
QSPI_InitStructure.QSPI_DFS = 0x00; // 数据帧大小为8位
QSPI_Init(QSPI, &QSPI_InitStructure);
// 使能QSPI
QSPI_Cmd(QSPI, ENABLE);
}
// 初始化W25Q128JV
void W25Q128JV_Init() {
// 发送命令,使W25Q128JV进入XIP模式
// 命令格式:0x38 (Fast Read Dual Output)
QSPI_DataLoad(QSPI, 0x38); // 发送命令
while(QSPI->CR&0x80); // 等待传输完成
}
int main() {
// 初始化QSPI
QSPI_Init();
// 初始化W25Q128JV,使其进入XIP模式
W25Q128JV_Init();
while(1) {
// 程序主循环
}
}
这个示例代码假设QSPI的引脚已经连接到了PC10、PC11、PC12和PC13,并且已经正确配置为复用推挽输出模式。
在QSPI_Init函数中,首先配置了QSPI的GPIO引脚,然后配置了QSPI的各项参数,包括时钟极性、时钟相位、波特率分频等,并最终使能了QSPI。
在W25Q128JV_Init函数中,发送了一个命令(0x38)给W25Q128JV闪存芯片,该命令将使闪存芯片进入XIP模式(执行内存模式)。
你需要根据实际硬件连接和需要修改GPIO引脚配置和QSPI参数,并确保W25Q128JV芯片可以正确接收到并处理发送的命令。
|