STM32Cube硬件SPI读取W25QXXID

一、接口介绍

1.1HAL_SPI_TransmitReceive()

参数1:SPI外设句柄;

参数2:要发送的数据缓冲区的指针;

参数3:接收数据的缓冲区的指针;

参数4:发送和接收的数据字节数

参数5:超时时间。

1.2HAL_SPI_Transmit()__去掉参数3

1.3HAL_SPI_Receive()__去掉参数2

二、Cube配置

 

 

三、编程

void T3(void const * argument)
{
  /* USER CODE BEGIN T3 */
	  printf("serial start...\r\n");
	  uint16_t ID = W25Qxx_ReadID();
	  printf("%#x\r\n", ID);
	  ID = W25QReadID();
	  printf("%#x\r\n", ID);
	  printf("serial end...\r\n");
  /* Infinite loop */
  for(;;)
  {
	  osDelay(1);
  }
  /* USER CODE END T3 */
}
uint8_t SPI1_TransmitReceive(uint8_t Senddata) {
	uint8_t Receivedata;
	HAL_SPI_TransmitReceive(&hspi1, &Senddata, &Receivedata, 1, 1000);
	return Receivedata;
}//发送一个字节并返回一个字节
uint16_t W25QReadID(void) {
	uint16_t res = 0;
	HAL_GPIO_WritePin(CS_GPIO_Port, CS_Pin, 0);//select
	SPI1_TransmitReceive(0x90);//查阅W25Q的要求
	SPI1_TransmitReceive(0x00);
	SPI1_TransmitReceive(0x00);
	SPI1_TransmitReceive(0x00);
	res |=  SPI1_TransmitReceive(0xFF) << 8;//发送任意数据,目的在于接收返回值
	res |= SPI1_TransmitReceive(0xFF);
	HAL_GPIO_WritePin(CS_GPIO_Port, CS_Pin, 1);
	return res;
}
...
uint16_t W25Qxx_ReadID(void)
{
  uint16_t res;
  uint8_t Txbuff[4] ={0x90, 0x00, 0x00, 0x00};
  HAL_GPIO_WritePin(CS_GPIO_Port, CS_Pin, 0);//select
  HAL_SPI_Transmit(&hspi1,(uint8_t *)Txbuff, 4, 4000);
  HAL_SPI_Receive(&hspi1,(uint8_t *)&res, 2 , 2000);
  HAL_GPIO_WritePin(CS_GPIO_Port, CS_Pin, 1);
  return res;
}

四、现象

 

### 使用 STM32CubeMX 配置硬件 SPI读取 W25Q128 Flash 芯片 #### 硬件准备 为了成功配置并使用 STM32G070RBT6 的硬件 SPI 接口来读取 W25Q128 Flash 数据,需准备好相应的开发板以及 SPI Flash 设备。确保 SPI Flash 正确连接到 MCU 上对应的 SPI 引脚上。 #### STM32CubeMX 中的 SPI 外设配置 启动 STM32CubeMX 并创建新项目,在 Pinout & Configuration 页面找到 SPI 模块,将其模式设置为 Master Full-Duplex,并调整参数如下: - **Mode**: Master Full-Duplex - **Baud Rate Prescaler**: 根据需求设定预分频系数,通常可以保持默认值。 - **Clock Polarity (CPOL)** 和 **Clock Phase (CPHA)** 应当匹配所使用的 SPI Flash 器件的要求;对于大多数情况,默认选项即可满足要求。 - **Data Size**: 设置为 8-bit 或者根据实际应用需要更改。 - **NSS Management**: Hardware NSS pin enabled or Software depending on your design choice. 完成上述配置之后生成初始化代码以便后续编程调用[^1]。 #### 添加必要的库文件和支持函数 除了利用 HAL 库提供的基础 API 进行数据传输之外,还需要额外定义一些针对特定型号 SPI Flash (这里是 W25Q128)的操作命令集及其辅助功能。这可以通过引入第三方驱动程序或者自行编写相关逻辑实现。例如,下面是一个简单的 C 文件片段用于发送单字节指令给 SPI Flash 同时接收返回的结果: ```c uint8_t SPI_FLASH_SendByte(uint8_t byteToSend){ uint8_t received; /* 发送一个字节并通过SPI总线获取响应 */ HAL_SPI_TransmitReceive(&hspi2, &byteToSend, &received, 1, HAL_MAX_DELAY); return received; } ``` 此部分具体取决于个人项目的架构设计,可能涉及到更复杂的操作如页擦除、扇区擦除等,这些都需要依据官方文档中的说明进行编码处理[^2]。 #### 主应用程序流程 最后一步是在 `main()` 函数里加入对之前提到的支持函数的实际调用,从而完成整个读取过程。这里给出一段伪代码作为参考: ```c int main(void){ // 初始化系统时钟和其他外设... while(1){ // 执行某些条件判断或者其他任务... // 当需要访问外部存储器时执行以下动作 // Step A: Select the device by pulling CS low. GPIO_WritePinLow(SPI_CS_GPIO_Port,SPI_CS_Pin); // Step B: Send read command followed by address bytes to specify location within flash memory. SPI_FLASH_SendByte(W25X_ReadData); // Command code for reading data from memory array SPI_FLASH_SendByte((address >> 16) & 0xFF); // MSB of target address SPI_FLASH_SendByte((address >> 8) & 0xFF); SPI_FLASH_SendByte(address & 0xFF); // LSB of target address // Step C: Read back desired number of bytes into buffer variable(s). for(i=0;i<length;i++){ *(buffer+i)=SPI_FLASH_SendByte(DUMMY_BYTE); } // Step D: De-select the device after operation completes. GPIO_WritePinHigh(SPI_CS_GPIO_Port,SPI_CS_Pin); // 继续其他循环体内的工作... } } ``` 以上就是关于如何基于 STM32CubeMX 来配置硬件 SPI 实现与 W25Q128 Flash 之间的简单交互的方法概述[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值