GD32F470ZIT6 MCU,调试读写SPI flash,连接的是华邦的W25Q128,读取ID获取的是FFFFFF,帮我写一个正确的代码
时间: 2024-05-06 18:19:13 浏览: 260
好的,以下是一个简单的例程,用于读取华邦W25Q128 SPI Flash的ID。
```c
#include "gd32f4xx.h"
#include "stdio.h"
#define SPI_FLASH_PAGESIZE 256
#define SPI_FLASH_ID 0xEF4018
static void spi_flash_init(void);
static uint32_t spi_flash_read_id(void);
int main(void)
{
uint32_t flash_id;
spi_flash_init();
flash_id = spi_flash_read_id();
printf("Flash ID: %06X\n", flash_id);
while(1){}
}
static void spi_flash_init(void)
{
/* 使能GPIOB时钟 */
rcu_periph_clock_enable(RCU_GPIOB);
/* 使能SPI1时钟 */
rcu_periph_clock_enable(RCU_SPI1);
/* 配置SPI1的SCK、MISO、MOSI引脚,这里使用的是PB13、PB14、PB15 */
gpio_init(GPIOB, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_13 | GPIO_PIN_14 | GPIO_PIN_15);
/* 配置SPI1的CS引脚,这里使用的是PB12 */
gpio_init(GPIOB, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_12);
/* 配置SPI1的工作模式 */
spi_parameter_struct spi_init_struct;
spi_init_struct.trans_mode = SPI_TRANSMODE_FULLDUPLEX;
spi_init_struct.device_mode = SPI_MASTER;
spi_init_struct.frame_size = SPI_FRAMESIZE_8BIT;
spi_init_struct.clock_polarity_phase = SPI_CK_PL_HIGH_PH_2EDGE;
spi_init_struct.nss = SPI_NSS_SOFT;
spi_init_struct.prescale = SPI_PSC_4;
spi_init_struct.endian = SPI_ENDIAN_MSB;
spi_init(SPI1, &spi_init_struct);
/* 使能SPI1 */
spi_enable(SPI1);
}
static uint32_t spi_flash_read_id(void)
{
uint8_t tx_data[4] = {0x9F, 0x00, 0x00, 0x00};
uint8_t rx_data[4] = {0, 0, 0, 0};
/* 使能SPI Flash */
gpio_bit_reset(GPIOB, GPIO_PIN_12);
/* 发送读取ID的命令 */
for (uint8_t i = 0; i < 4; i++)
{
spi_i2s_data_transmit(SPI1, tx_data[i]);
while (RESET == spi_i2s_flag_get(SPI1, SPI_FLAG_TBE));
while (RESET == spi_i2s_flag_get(SPI1, SPI_FLAG_RBNE));
rx_data[i] = spi_i2s_data_receive(SPI1);
}
/* 禁止SPI Flash */
gpio_bit_set(GPIOB, GPIO_PIN_12);
/* 检查ID是否正确 */
if ((rx_data[1] == 0xEF) && (rx_data[2] == 0x40) && (rx_data[3] == 0x18))
{
return SPI_FLASH_ID;
}
else
{
return ((uint32_t)rx_data[1] << 16) | ((uint32_t)rx_data[2] << 8) | rx_data[3];
}
}
```
在此代码中,spi_flash_init()函数用于初始化SPI1,并将CS引脚设置为高电平。spi_flash_read_id()函数用于发送读取ID的命令,并返回读取到的ID。在这个例程中,默认情况下,我们使用的是4线SPI模式。如果需要使用其他模式,请参考W25Q128的数据手册来修改代码。
注意:在运行此代码之前,请确保将GPIOB引脚连接到华邦W25Q128 SPI Flash的对应引脚,并根据需要修改SPI Flash的连接方式。
阅读全文