2017-02-27 4 views
0

フラッシュデバイスW25Q32FVのデバイスIDを読み取る必要があります。 W25Q32FVドキュメントの書き込み:「製造元/デバイスIDの読み取り命令」は、JEDECの割り当てられた製造元IDと特定のデバイスIDの両方を提供する、電源切断/デバイス解除コマンド ID命令の代替品です。 製造元/命令は、/ CSピンをローに駆動し、命令コード "90h" の後に24ビットのアドレス(A23-A0)をシフトすることによって開始される、パワーダウン/デバイスIDからの解放の命令と非常に似ています。 000000h。その後、Winbond(EFh) の製造者IDとデバイスIDは、図39の のように、最上位ビット(MSB)を先頭にしてCLKの立下りエッジでシフトアウトされます。W25Q32FVのデバイスID値は製造元とデバイス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; 

init関数:

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

有ります。#define 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; if(HAL_SPI_Init(&hspi1)!= HAL_OK) } –

答えて

0

シーケンスはMSBファーストである必要がありますvoid MX_SPI1_Init(void)

hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB; 

によって

hspi1.Init.FirstBit = SPI_FIRSTBIT_LSB; 

交換してください。 これを行う最善の方法は、もちろんSTMCubeを更新することです。

+0

ありがとう、私はそれを試してみる –

関連する問題