助けてくれてありがとう。残念ながら、この LUT の変更は解決策ではなく、ベンダー ID では依然として 0xff が読み取られます。C コード全体を皆さんと共有します。
/*
* 著作権 (c) 2016、Freescale Semiconductor, Inc.
* 著作権 2016-2018 NXP
* 無断転載を禁じます。
*
*
* SPDXライセンス識別子: BSD-3条項
*/
#include "pin_mux.h"
#include "clock_config.h"
#include "board.h"
#include "fsl_debug_console.h"
#include "fsl_rgpio.h"
#include "fsl_lpi2c.h"
#include "fsl_iomuxc.h"
#include "fsl_lpi2c.c"
#include "fsl_flexspi.h"
#include "app.h"
#include "fsl_debug_console.h"
#include "fsl_cache.h"
#include "pin_mux.h"
#include "clock_config.h"
#include "board.h"
#include "fsl_common.h"
/****************************************************************************************
* 定義
**********************************************************************************/
/****************************************************************************************
* プロトタイプ
**********************************************************************************/
/****************************************************************************************
* 変数
**********************************************************************************/
/* プログラムデータバッファは4バイトのアラインメントにする必要があります。これにより、このメモリ領域が次のように構成されているため、バスフォールトをCAN。
MPU によるデバイス メモリ。*/
SDK_ALIGN (静的uint8_t s_nor_program_buffer [ 256 ], 4 );
静的uint8_t s_nor_read_buffer [ 256 ];
extern status_t flexspi_nor_flash_erase_sector ( FLEXSPI_Type *ベース、 uint32_tアドレス);
extern status_t flexspi_nor_flash_page_program ( FLEXSPI_Type * base 、 uint32_t dstAddr 、 const uint32_t * src );
外部status_t flexspi_nor_get_vendor_id ( FLEXSPI_Type *ベース、 uint8_t *ベンダーID );
外部status_t flexspi_nor_enable_quad_mode ( FLEXSPI_Type *ベース);
外部status_t flexspi_nor_erase_chip ( FLEXSPI_Type *ベース);
外部void flexspi_nor_flash_init ( FLEXSPI_Type *ベース);
/****************************************************************************************
* コード
**********************************************************************************/
flexspi_device_config_tデバイス構成= {
. flexspiRootClk = 12000000 , //12 MHz、ノイズあたりOK
.フラッシュサイズ = FLASH_SIZE 、
. CS間隔単位 = kFLEXSPI_CsIntervalUnit1SckCycle 、
. CS間隔 = 2 、
.CSホールド時間 = 3 、
. CSセットアップ時間 = 3 、
.データ有効時間 = 0 、
.列スペース = 0 、
. enableWordAddress = 0 、
. AWRSeqIndex = 0 、
. AWRシーケンス番号 = 0 、
. ARDSeqインデックス = NOR_CMD_LUT_SEQ_IDX_READ 、
. ARDシーケンス番号 = 1 、
. AHBWriteWaitUnit = kFLEXSPI_AhbWriteWaitUnit2AhbCycle 、
. AHBWriteWaitInterval = 0 ,
};
const uint32_t customLUT [ CUSTOM_LUT_LENGTH ] = {
/* 高速読み取りクアッドモード -SDR */
[ 4 * NOR_CMD_LUT_SEQ_IDX_READ + 0 ] =
FLEXSPI_LUT_SEQ ( kFLEXSPI_Command_SDR 、 kFLEXSPI_4PAD 、 0xEB 、 kFLEXSPI_Command_RADDR_SDR 、 kFLEXSPI_4PAD 、 0x18 )、
[ 4 * NOR_CMD_LUT_SEQ_IDX_READ + 1 ] = FLEXSPI_LUT_SEQ (
kFLEXSPI_Command_DUMMY_SDR 、 kFLEXSPI_4PAD 、 0x0A 、 kFLEXSPI_Command_READ_SDR 、 kFLEXSPI_4PAD 、 0x04 )、
/* ステータスレジスタの読み取り */
[ 4 * NOR_CMD_LUT_SEQ_IDX_READSTATUSREG ] =
FLEXSPI_LUT_SEQ ( kFLEXSPI_Command_SDR 、 kFLEXSPI_4PAD 、 0xB5 、 kFLEXSPI_Command_DUMMY_SDR 、 kFLEXSPI_4PAD 、 0x0 )、
[ 4 * NOR_CMD_LUT_SEQ_IDX_READSTATUSREG + 1 ] =
FLEXSPI_LUT_SEQ ( kFLEXSPI_Command_READ_SDR 、 kFLEXSPI_4PAD 、 0x04 、 kFLEXSPI_Command_STOP 、 kFLEXSPI_1PAD 、 0x0 )、
/* ID を読み取る */
[ 4 * NOR_CMD_LUT_SEQ_IDX_READID ] =
FLEXSPI_LUT_SEQ ( kFLEXSPI_Command_SDR , kFLEXSPI_1PAD , 0x9E , kFLEXSPI_Command_READ_SDR , kFLEXSPI_1PAD , 0x04 ), // 0x9F から 0X9E に変更
/* 書き込み可能4パッド */
[ 4 * NOR_CMD_LUT_SEQ_IDX_WRITEENABLE_OPI ] =
FLEXSPI_LUT_SEQ ( kFLEXSPI_Command_SDR 、 kFLEXSPI_4PAD 、 0x06 、 kFLEXSPI_Command_STOP 、 kFLEXSPI_1PAD 、 0x00 )、
/* 書き込み許可 */
[ 4 * NOR_CMD_LUT_SEQ_IDX_WRITEENABLE ] =
FLEXSPI_LUT_SEQ ( kFLEXSPI_Command_SDR 、 kFLEXSPI_4PAD 、 0x06 、 kFLEXSPI_Command_STOP 、 kFLEXSPI_1PAD 、 0 )、
/* セクタ消去 */
[ 4 * NOR_CMD_LUT_SEQ_IDX_ERASESECTOR ] =
FLEXSPI_LUT_SEQ ( kFLEXSPI_Command_SDR 、 kFLEXSPI_4PAD 、 0x20 、 kFLEXSPI_Command_RADDR_SDR 、 kFLEXSPI_4PAD 、 0x18 )、
/* プログラム */
[ 4 * NOR_CMD_LUT_SEQ_IDX_PAGEPROGRAM_QUAD ] =
FLEXSPI_LUT_SEQ ( kFLEXSPI_Command_SDR 、 kFLEXSPI_4PAD 、 0x32 、 kFLEXSPI_Command_RADDR_SDR 、 kFLEXSPI_4PAD 、 0x18 )、
[ 4 * NOR_CMD_LUT_SEQ_IDX_PAGEPROGRAM_QUAD + 1 ] =
FLEXSPI_LUT_SEQ ( kFLEXSPI_Command_WRITE_SDR 、 kFLEXSPI_4PAD 、 0x01 、 kFLEXSPI_Command_STOP 、 kFLEXSPI_4PAD 、 0 )、
/* クアッドモードに入る */
[ 4 * NOR_CMD_LUT_SEQ_IDX_ENABLEQUAD ] =
FLEXSPI_LUT_SEQ ( kFLEXSPI_Command_SDR 、 kFLEXSPI_1PAD 、 0x35 、 kFLEXSPI_Command_STOP 、 kFLEXSPI_1PAD 、 0x00 )、
/* ダミー書き込み。AHB 書き込みコマンドがトリガーされたときには何もしません。*/
[ 4 * NOR_CMD_LUT_SEQ_IDX_WRITE ] =
FLEXSPI_LUT_SEQ ( kFLEXSPI_Command_STOP 、 kFLEXSPI_1PAD 、 0x0 、 kFLEXSPI_Command_STOP 、 kFLEXSPI_1PAD 、 0x0 )、
/* Qual SDR読み取りを使用してステータスレジスタを読み取る */
[ 4 * NOR_CMD_LUT_SEQ_IDX_READSTATUS_OPI ] =
FLEXSPI_LUT_SEQ ( kFLEXSPI_Command_SDR 、 kFLEXSPI_4PAD 、 0x05 、 kFLEXSPI_Command_READ_SDR 、 kFLEXSPI_4PAD 、 0x02 )、
};
int main ( void )
{
uint32_t i = 0 ;
status_tステータス;
uint8_tベンダーID = 0 ;
pcal6524_handle_tハンドル;
/* clang-format オフ */
const clock_root_config_t lpi2cClkCfg = {
.clockOff = false 、
. mux = 0 , // 24MHz発振器ソース
. div = 1
};
/* clang-format オン */
BOARD_ConfigMPU ();
BOARD_InitBootPins ();
BOARD_BootClockRUN ();
BOARD_InitDebugConsole ();
CLOCK_SetRootClock ( BOARD_PCAL6524_I2C_CLOCK_ROOT 、 & lpi2cClkCfg );
CLOCK_EnableClock ( BOARD_PCAL6524_I2C_CLOCK_GATE );
/* M.2 nor フラッシュカードに 3.3V を設定します */
BOARD_InitPCAL6524 ( &ハンドル);
PCAL6524_SetDirection ( &ハンドル, ( 1 << BOARD_PCAL6524_EXT1_PWREN ), kPCAL6524_Output );
PCAL6524_SetPins ( &ハンドル, ( 1 << BOARD_PCAL6524_EXT1_PWREN ));
flexspi_nor_flash_init ( EXAMPLE_FLEXSPI );
PRINTF ( " \r\n FLEXSPI の例を開始しました! \r\n " );
/* ベンダーIDを取得します。 */
ステータス= flexspi_nor_get_vendor_id ( EXAMPLE_FLEXSPI 、 & vendorID );
if (ステータス!= kStatus_Success )
{
ステータスを返します。
}
PRINTF ( "ベンダーID: 0x %x \r\n " , vendorID );
#if ! (定義済み( XIP_EXTERNAL_FLASH ))
/* チップ全体を消去します。*/
PRINTF ( "FlexSPI 経由でチップ全体を消去しています... \r\n " );
ステータス= flexspi_nor_erase_chip (EXAMPLE_FLEXSPI);
if (ステータス!= kStatus_Success)
{
ステータスを返します。
}
PRINTF ( "消去が完了しました! \r\n " );
#endif
/* クアッドモードに入ります。*/
ステータス= flexspi_nor_enable_quad_mode ( EXAMPLE_FLEXSPI );
if (ステータス!= kStatus_Success )
{
ステータスを返します。
}
/* セクタを消去します。*/
PRINTF ( "FlexSPI 経由のシリアル NOR を消去しています... \r\n " );
ステータス= flexspi_nor_flash_erase_sector ( EXAMPLE_FLEXSPI 、 EXAMPLE_SECTOR * SECTOR_SIZE );
if (ステータス!= kStatus_Success )
{
PRINTF ( "セクター消去失敗! \r\n " );
- 1を返します。
}
memset ( s_nor_program_buffer 、 0xFFU 、 sizeof ( s_nor_program_buffer ));
DCACHE_InvalidateByRange ( EXAMPLE_FLEXSPI_AMBA_BASE + EXAMPLE_SECTOR * SECTOR_SIZE 、 FLASH_PAGE_SIZE );
memcpy ( s_nor_read_buffer , ( void * )( EXAMPLE_FLEXSPI_AMBA_BASE + EXAMPLE_SECTOR * SECTOR_SIZE ),
sizeof ( s_nor_read_buffer ));
memcmp ()の場合、 s_nor_program_buffer 、 s_nor_read_buffer 、 sizeof ( )の場合、 s_nor_program_bufferは、次のようになります。
{
PRINTF ( "データを消去 - 読み取ったデータ値が正しくありません! \r\n " );
- 1を返します。
}
それ以外
{
PRINTF ( "データの消去 - 正常に完了しました。 \r\n " );
}
( i = 0 ; i < 0xFFU ; i ++ )の場合
{
s_nor_program_buffer [ i ] = i ;
}
ステータス=
flexspi_nor_flash_page_program ( EXAMPLE_FLEXSPI 、 EXAMPLE_SECTOR * SECTOR_SIZE 、 ( void * ) s_nor_program_buffer );
if (ステータス!= kStatus_Success )
{
PRINTF ( "ページ プログラム エラー! \r\n " );
- 1を返します。
}
DCACHE_InvalidateByRange ( EXAMPLE_FLEXSPI_AMBA_BASE + EXAMPLE_SECTOR * SECTOR_SIZE 、 FLASH_PAGE_SIZE );
memcpy ( s_nor_read_buffer , ( void * )( EXAMPLE_FLEXSPI_AMBA_BASE + EXAMPLE_SECTOR * SECTOR_SIZE ),
sizeof ( s_nor_read_buffer ));
memcmp ( s_nor_read_buffer 、 s_nor_program_buffer 、 sizeof ( s_nor_program_buffer ) ) != 0の場合
{
PRINTF ( "プログラムデータ - 読み取ったデータ値が正しくありません! \r\n " );
- 1を返します。
}
それ以外
{
PRINTF ( "プログラムデータ - 正常に実行されました。 \r\n " );
}
ステータス= flexspi_nor_get_vendor_id ( EXAMPLE_FLEXSPI 、 & vendorID );
if (ステータス!= kStatus_Success )
{
ステータスを返します。
}
PRINTF ( "ベンダーID: 0x %x \r\n " , vendorID );
PRINTF ( "ステータス: %d \r\n " , status );
一方( 1 )
{
}
}