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而不是实际数据。它可能是什么,我该如何解决?

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。