STM32F103 SPI MISO无法正常工作

2019-07-14 16:52发布

在我的一个小项目中,我使用STMF103C8T6作为Winbond的MCU和SPI存储器W25Q128来存储数据。存储器芯片连接到SPI1。这是该计划的一部分: 1.png 代码主要由CubeMX生成。我只添加了一些与内存芯片通信的代码:初始化:
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;
  if (HAL_SPI_Init(&hspi1) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }
}
W25Q128代码:

#define CS_Pin GPIO_PIN_3
#define CS_GPIO_Port GPIOA
#define ChipSelect() HAL_GPIO_WritePin(CS_GPIO_Port, CS_Pin, GPIO_PIN_RESET)
#define ChipDeselect() HAL_GPIO_WritePin(CS_GPIO_Port, CS_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 ", id);
    while
    {
    }   
}
根据数据表获取芯片制造商代码,我需要发送0x90和3个虚拟字节。芯片应该返回0xEF,0x17。但由于某种原因,我收到2个字节的0xFF。好吧,我已经在PCB上更换了两次但没有结果的芯片。我仍然收到0xFF,0xFF。我已将逻辑分析仪连接到PCB上的芯片,令我惊讶的是,我得到以下图片: 2.png 根据图表,一切都很好。芯片按预期发送0xEF,0x17。但由于某些原因,我的STM32没有看到。我已经重新检查了PCB,我重新安装了几个芯片,我尝试过W25Q128和W25Q64 - 都失败了,我只收到0xFF,0xFF而不是实际数据。它可能是什么,我该如何解决?

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
4条回答
zhangminmin
1楼-- · 2019-07-14 22:13
请阅读芯片关于#WP和#HOLD引脚功能的数据表。两者都是低电平有效,你把它拉到GND,所以它们都是有效的。这可能会也可能不会实现您想要实现的目标。
richips
2楼-- · 2019-07-15 03:28
它不起作用,因为#HOLD引脚接地,因此W25Q128处于HOLD模式。#HOLD引脚应连接到3.3V以按预期工作。
hisysteeoke
3楼-- · 2019-07-15 03:44
看起来你是对的。我很可能在PCB中以某种方式出错。但我对一个问题非常感兴趣 - 为什么逻辑分析仪显示芯片响应?
chenwei6991627
4楼-- · 2019-07-15 04:45
 精彩回答 2  元偷偷看……

一周热门 更多>