STM32F0 SPI 读取W25Q64 读取数据不对的问题

直入正题,用的芯片是STM32F091RCT6, 用SPI读取W25Q64时,读取数据不对,主要原因是SPI的分频值配置的问题。

当我将SPI分频值配置8的时候,读取的数据都不对,只有将分频配置成8,也就是速度是6MBits/s的时候,读取的数据才是正确的。

看hal库spi的说明:

#define  GPIO_SPEED_FREQ_LOW      (0x00000000U)  /*!< range up to 2 MHz, please refer to the product datasheet */
#define  GPIO_SPEED_FREQ_MEDIUM   (0x00000001U)  /*!< range  4 MHz to 10 MHz, please refer to the product datasheet */
#define  GPIO_SPEED_FREQ_HIGH     (0x00000003U)  /*!< range 10 MHz to 50 MHz, please refer to the product datasheet */

我的SPI配置是:

void MX_SPI1_Init(void)
{

  hspi1.Instance = SPI1;
  hspi1.Init.Mode = SPI_MODE_MASTER;
  hspi1.Init.Direction = SPI_DIRECTION_2LINES;
  hspi1.Init.DataSize = SPI_DATASIZE_8BIT;
  hspi1.Init.CLKPolarity = SPI_POLARITY_HIGH;
  hspi1.Init.CLKPhase = SPI_PHASE_2EDGE;
  hspi1.Init.NSS = SPI_NSS_SOFT;
  hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_8; //必须是8分频才行,读取数据才是正确的
  hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
  hspi1.Init.TIMode = SPI_TIMODE_DISABLE;
  hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
  hspi1.Init.CRCPolynomial = 7;
  hspi1.Init.CRCLength = SPI_CRC_LENGTH_DATASIZE;
  hspi1.Init.NSSPMode = SPI_NSS_PULSE_DISABLE;
  if (HAL_SPI_Init(&hspi1) != HAL_OK)
  {
    Error_Handler();
  }

}

分频是32,即48/32=1.5MBits/s,属于低速,所以引脚配置为:

    GPIO_InitStruct.Pin = GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;//这里是HIGH还是MEDIUM都可以
    GPIO_InitStruct.Alternate = GPIO_AF0_SPI1;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

 

这样读取出来的数据就是正确的了:只有在8分频的时候读取的才是正确的。其他都试过,都不正确

2020-3-30日更正:

经过这几天的测试,上面的方法也不能保证每次读取都是正确的,通过查找资源以及原来F1芯片上的代码,发现通过在初始化完成后,进行1字节的读取操作,之后每次的读写操作就都是正确的了,虽然问题解决了,但是还不清楚原理???

如下图,加上红色框框里面的这句话就读写正常了:

同时,也是受到这篇文章的启发,https://blog.csdn.net/weixin_44529321/article/details/103720347https://blog.csdn.net/weixin_44529321/article/details/103720347

但是我按照这篇文章中的方法将CS默认高电平,我的程序也还是不行,只有加上那句读写1字节的才做才可以。

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
要在STM32微控制器上读取W25Q64芯片的ID,你可以遵循以下步骤: 1. 配置SPI接口:首先,确保你STM32微控制器上的SPI接口已经正确配置。你需要配置SPI引脚、时钟和模式等参数,使其与W25Q64芯片兼容。 2. 初始化SPI:在代码中初始化SPI接口,设置SPI的参数,如数据传输速率、数据位顺序和时钟极性等。 3. 发送读取ID的指令:使用SPI接口向W25Q64芯片发送读取ID的指令。W25Q64芯片读取ID指令是0x90,需要将该指令通过SPI接口发送给芯片。 4. 读取ID数据:通过SPI接口从W25Q64芯片读取ID数据。W25Q64芯片的ID数据包括制造商ID和设备ID,共16位。你可以通过SPI接口发送空字节(0x00)来接收芯片返回的ID数据。 下面是一个简单的示例代码,展示了如何在STM32读取W25Q64芯片的ID: ```c #include "stm32f4xx.h" #include "spi.h" #define W25Q64_CMD_READ_ID 0x90 uint16_t readW25Q64ID(void) { uint8_t txData[4] = {W25Q64_CMD_READ_ID, 0x00, 0x00, 0x00}; uint8_t rxData[4] = {0}; // 发送读取ID的指令 SPI_TransmitReceive(txData, rxData, 4); // 返回ID数据 return (rxData[2] << 8) | rxData[3]; } int main(void) { // 初始化SPI接口和其他相关设置 // 读取W25Q64芯片的ID uint16_t chipID = readW25Q64ID(); // 处理读取到的ID数据 while (1) { // 主循环 } } ``` 请注意,这只是一个简单示例代码,具体的实现可能因不同的STM32型号和开发环境而有所不同。你需要根据自己的情况进行适当的修改和调整。此外,确保在使用SPI接口时,你已正确配置芯片选择引脚(例如片选引脚)和SPI接口的时钟等参数。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值