2017-02-27 20 views
0

我需要读取闪存设备W25Q32FV的设备ID。 在W25Q32FV文档中写入:“读取制造商/设备ID指令是提供JEDEC分配的制造商ID和特定设备ID的ID指令的替代方案 读取制造商/设备ID指令非常类似于从掉电模式/设备ID 指令,该指令是通过将/ CS引脚驱动为低电平并将指令码“90h” 后跟24位地址(A23-A0)的000000h。之后,如图39中的 所示,Winbond(EFh) 的制造商ID和器件ID在CLK的下降沿以最高有效位(MSB)先移出.W25Q32FV的器件ID值为列于制造商和器件识别 表。该指令是由驾驶/ CS高完成“STM43F4发现:如何通过SPI读取闪存器件?

Figure 39

而且我的STM32F4 Dicovery(STM32F407VGTx)代码:

#define spi_enable HAL_GPIO_WritePin(GPIOC, GPIO_PIN_5, GPIO_PIN_RESET) 
#define spi_disable HAL_GPIO_WritePin(GPIOC, GPIO_PIN_5, GPIO_PIN_SET) 

spi_enable; 
uint8_t read_id = 0x90; 
HAL_SPI_Transmit(&hspi1, &read_id, 1, 1000); 

address[0] = 0x00;address[1] = 0x00;address[2] = 0x00; 
HAL_SPI_Transmit(&hspi1, address, 3, 1000); 

HAL_SPI_Receive(&hspi1, &manualId, 1, 1000); 
HAL_SPI_Receive(&hspi1, &deviceId, 1, 1000);  

spi_disable; 

初始化函数:

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_2; 
    hspi1.Init.FirstBit = SPI_FIRSTBIT_LSB; 
    hspi1.Init.TIMode = SPI_TIMODE_DISABLE; 
    hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; 
    hspi1.Init.CRCPolynomial = 10; 
    if (HAL_SPI_Init(&hspi1) != HAL_OK) 
} 

它确实不工作:(

+0

您是否在设置SPI时检查了极性和相位?为了详尽,您可以共享SPI init代码和spi_enable/disable函数的内容。 –

+0

是:#定义SPI_ENABLE \t \t HAL_GPIO_WritePin(GPIOC,GPIO_PIN_5,GPIO_PIN_RESET) 的#define SPI_DISABLE HAL_GPIO_WritePin(GPIOC,GPIO_PIN_5,GPIO_PIN_SET) –

+0

SPI INIT: 静态无效MX_SPI1_Init(无效) { 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_2; hspi1.Init.FirstBit = SPI_FIRSTBIT_LSB; hspi1.Init.TIMode = SPI_TIMODE_DISABLE; hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; hspi1.Init.CRCPolynomial = 10;如果(HAL_SPI_Init(&hspi1)!= HAL_OK) } –

回答

0

序列应该是MSB优先所以在void MX_SPI1_Init(void)取代

hspi1.Init.FirstBit = SPI_FIRSTBIT_LSB; 

通过

hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB; 

。 最好的办法是更新STMCube当然。

+0

谢谢,我会试试看 –