2017-02-27 19 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

謝謝,我會試試看 –