首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >stm32和外部闪存W25q16

stm32和外部闪存W25q16
EN

Stack Overflow用户
提问于 2020-09-02 19:56:49
回答 2查看 658关注 0票数 0

我正在和W25Q16一起研究STM32L432KC。每次我得到0xFF。根据数据表,为了获得芯片制造商代码,我需要发送0x90和3个虚拟字节。芯片应返回0xEF0x17。但是,由于某种原因,我收到了2字节的0xFF

代码语言:javascript
复制
SPI_HandleTypeDef hspi1;

static 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_LOW;
  hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;
  hspi1.Init.NSS = SPI_NSS_SOFT;
  hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_32;
  hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
  hspi1.Init.TIMode = SPI_TIMODE_DISABLE;
  hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
  hspi1.Init.CRCPolynomial = 10;
  hspi1.Init.CRCLength = SPI_CRC_LENGTH_DATASIZE;
  hspi1.Init.NSSPMode = SPI_NSS_PULSE_ENABLE;
  if (HAL_SPI_Init(&hspi1) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }
}

#define SPI_SEL2_Pin GPIO_PIN_15
#define SPI_SEL2_GPIO_Port GPIOA
#define ChipSelect()            HAL_GPIO_WritePin(SPI_SEL2_GPIO_Port, SPI_SEL2_Pin, GPIO_PIN_RESET)
#define ChipDeselect()          HAL_GPIO_WritePin(SPI_SEL2_GPIO_Port, SPI_SEL2_Pin, GPIO_PIN_SET)

#define COMMAND_IDENTIFICATION 0x90

uint8_t buffer_tx[4];
uint8_t buffer_rx[2];

uint16_t GetIdentification()
{
    buffer_tx[0] = COMMAND_IDENTIFICATION;
    buffer_tx[1] = 0x0;
    buffer_tx[2] = 0x0;
    buffer_tx[3] = 0x0;

    ChipSelect();
    HAL_SPI_Transmit(&hspi1, buffer_tx, 4, 1000); // send 0x90, 0x0, 0x0, 0x0
    HAL_SPI_Receive(&hspi1, buffer_rx, 2, 1000); // receive 0xFF, 0xFF 
    ChipDeselect();
    return ((uint8_t)buffer_rx[0] << 8) | (uint8_t)buffer_rx[1];
}

int main(void)
{
    MX_SPI1_Init();
    HAL_Delay(1000);
    uint16_t id = GetIdentification();
    printf("Manufacturer ID: 0x%.4X\r\n", id);
    while 
    {
    }   
}

我怎么才能修复它?

EN

Stack Overflow用户

发布于 2020-09-03 07:16:07

如果不能访问您的硬件设置,就很难知道出了什么问题。看起来你是在正确的轨道上,只要坚持下去,检查所有可能的错误来源,并将问题缩小到简单和可测试的范围内。首先找出是否可能是硬件问题,然后尝试修复软件。

一些提示,这可能会有所帮助:

SPI数据线(本例中为DO/MISO)上的

  • 0xFF可能意味着它始终处于高电平状态。所以闪存芯片不会响应你的命令。它有助于在处理驱动程序时使用逻辑分析仪、示波器或类似设备验证这一点。如果可能,还要检查预期数据位是否在MOSI引脚上可见。点击是否可见?

  • 用万用表检查所有引脚电压。测量值是否与预期一致?(/HOLD引脚?)

用于芯片选择(PA15)的

  • 管脚是否配置为输出管脚?(也可以在STM32CubeMX配置器软件中完成。)

代码语言:javascript
复制
    /* configure /CS pin to be an output pin */
    GPIO_InitTypeDef init = {0};
    init.Pin = SPI_SEL2_Pin;
    init.Speed = GPIO_SPEED_FREQ_LOW;
    init.Mode = GPIO_MODE_OUTPUT_PP;
    init.Pull = GPIO_NOPULL;
    if (HAL_GPIO_Init(SPI_SEL2_GPIO_Port, &init) != HAL_OK) {
        Error_Handler();
    }
    ChipDeselect();
    HAL_Delay(100);

  • 外围设备配置是否正确?检查SPI时钟极性和相位(即hspi1.Init.CLKPolarity和hspi1.Init.CLKPhase)、位顺序(即hspi1.Init.FirstBit (最先为最低有效位/最低有效位))和时钟速度(即hspi1.Init.BaudRatePrescaler (开始时为低电平,如果需要可稍后增加))。检查datasheet,有时试错也能达到目的。

  • 闪存芯片可能处于断电状态。-快速浏览数据手册后,似乎有一个指令编号为0xAB0x90替代命令,称为“释放掉电/设备ID”(参见数据手册中的第9.3.7节)。-请注意,此指令只会唤醒芯片,当以其“简短形式”使用时,引用数据表:

如图38a所示,若要将器件从掉电状态释放出来,可通过将/CS引脚驱动为低电平、将指令代码“ABh”移位并将/CS驱动为高电平来发出指令。

  • 搜索web,并尝试查找类似的驱动程序作为参考。这些Winbond闪存IC非常常见。一旦您了解了如何从闪存读取制造商ID,就可以按照数据手册一步一步地将其他命令/功能集成到驱动程序中。(另请阅读状态和配置寄存器部分(第7章),稍后可能需要在写入操作期间轮询状态位。)将代码拆分成可以在individually...

中测试的小函数

对于一次性发送和接收数据,

  • HAL_SPI_TransmitReceive()非常有用。
票数 0
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63705022

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档