SFUDは、オープンソースのシリアルSPIフラッシュユニバーサルドライバーライブラリです。市場には多くの種類のシリアルフラッシュがあるため、各フラッシュの仕様とコマンドは異なります。 SFUDは、これらのフラッシュの現在の違いを解決するように設計されており、当社の製品がさまざまなブランドと仕様のフラッシュをサポートし、フラッシュ関数を含むソフトウェアの再利用性とスケーラビリティを改善することを可能にし、同時に、フラッシュの外れや中止によって製品にもたらされるリスクを回避できます。
/sfud/inc/sfud_flash_def.h )で提供されるフラッシュパラメーター情報表でサポートされているかどうかを照会します。サポートされていない場合は、このFlashのパラメーター情報を構成ファイルに追加できます(詳細については、2.5の追加ライブラリで現在サポートされていないFlashを参照してください)。 Flashの仕様を取得した後、Flashでのすべての操作を実現できます。 次の表は、デモプラットフォームでリアルタイムでテストされたすべてのフラッシュを示しています。 SFDP標準をサポートしていないフラッシュは、Flashパラメーター情報テーブルで定義されています。 SFDP標準をサポートしないより多くのフラッシュは、将来改善および維持する必要があります(GitHub | Oschina |コーディング) 。
このオープンソースプロジェクトが素晴らしいと思われる場合は、プロジェクトのホームページの右上隅にある星をクリックして、困っている友人にそれを推奨できます。
| モデル | メーカー | 容量 | 最高速度 | SFDP標準 | QSPIモード | 述べる |
|---|---|---|---|---|---|---|
| W25Q40BV | ウィンボンド | 4MB | 50MHz | サポートされていません | ダブルライン | 生産は中止されました |
| W25Q80DV | ウィンボンド | 8MB | 104MHz | サポート | ダブルライン | |
| W25Q16BV | ウィンボンド | 16MB | 104MHz | サポートされていません | ダブルライン | SlipperTreeによって |
| W25Q16CV | ウィンボンド | 16MB | 104MHz | サポート | テストされていません | |
| W25Q16DV | ウィンボンド | 16MB | 104MHz | サポート | テストされていません | SlipperTreeによって |
| W25Q32BV | ウィンボンド | 32MB | 104MHz | サポート | ダブルライン | |
| W25Q64CV | ウィンボンド | 64MB | 80MHz | サポート | 4行 | |
| W25Q128BV | ウィンボンド | 128MB | 104MHz | サポート | 4行 | |
| W25Q256FV | ウィンボンド | 256MB | 104MHz | サポート | 4行 | |
| MX25L3206E | マクロニックス | 32MB | 86MHz | サポート | ダブルライン | |
| MX25L3233F | マクロニックス | 32MB | 133MHz | サポート | テストされていません | Jiapengliによる |
| KH25L4006E | マクロニックス | 4MB | 86MHz | サポート | テストされていません | Jiapengliによる |
| KH25L3206E | マクロニックス | 32MB | 86MHz | サポート | ダブルライン | |
| SST25VF016B | マイクロチップ | 16MB | 50MHz | サポートされていません | サポートされていません | SSTはMicrochipに買収されました |
| M25P40 | ミクロン | 4MB | 75MHz | サポートされていません | テストされていません | Redocchengによって |
| M25P80 | ミクロン | 8MB | 75MHz | サポートされていません | テストされていません | Redocchengによって |
| M25p32 | ミクロン | 32MB | 75MHz | サポートされていません | サポートされていません | |
| EN25Q32B | eon | 32MB | 104MHz | サポートされていません | テストされていません | |
| GD25Q16B | Gigadevice | 16MB | 120MHz | サポートされていません | テストされていません | Tanekliangによって |
| GD25Q32C | Gigadevice | 32MB | 120MHz | サポートされていません | テストされていません | gaupen1186 |
| GD25Q64B | Gigadevice | 64MB | 120MHz | サポートされていません | ダブルライン | |
| S25FL216K | サイプレス | 16MB | 65MHz | サポートされていません | ダブルライン | |
| S25FL032P | サイプレス | 32MB | 104MHz | サポートされていません | テストされていません | YC_911による |
| S25FL164K | サイプレス | 64MB | 108MHz | サポート | テストされていません | |
| A25L080 | アミック | 8MB | 100MHz | サポートされていません | ダブルライン | |
| A25LQ64 | アミック | 64MB | 104MHz | サポート | サポート | |
| F25L004 | ESMT | 4MB | 100MHz | サポートされていません | サポートされていません | |
| PCT25VF016B | pct | 16MB | 80MHz | サポートされていません | サポートされていません | SSTライセンスはSST25VF016Bとして識別されます |
| AT45DB161E | アデスト | 16MB | 85MHz | サポートされていません | サポートされていません | Adestoは、Atmelシリアルフラッシュ製品ラインを取得します |
| NM25Q128EV | nor_mem | 128MB | テストされていません | サポートされていません | テストされていません | SFDPは情報を読み取り、32GBを超えるものとして識別することができます。 |
| P25D40H | プヤ | 4MB | テストされていません | サポート | テストされていません | シャンによって |
| P25Q80H | プヤ | 8MB | テストされていません | サポート | テストされていません | シャンによって |
注:QSPIモードでは、ダブルワイヤーはサポートダブルワイヤーの高速読み取り値をサポートし、4線は4線速度読み取りをサポートすることを意味します。
一般的に言えば、Flashは4行の高速読み取り値をサポートし、2行の高速読み取りもサポートしています。
まず、このライブラリsfud_flashで主に使用されている構造を説明しましょう。その定義は/sfud/inc/sfud_def.hにあります。各SPIフラッシュは構造に対応し、構造ポインターはフラッシュデバイスオブジェクトと集合的に呼ばれます。初期化が成功した後、一般的なSPIフラッシュパラメーターはsfud_flash->chip構造に保存されます。 SPI FlashがSFDPもサポートしている場合、 sfud_flash->sfdpを介してより包括的なパラメーター情報を表示することもできます。次の関数の多くは、Flashデバイスオブジェクトを最初のエントリパラメーターとして使用して、指定されたSPIフラッシュに操作を実装します。
sfud_device_init 、Flashデバイステーブルのすべてのデバイスを初期化するために呼び出されます。フラッシュが1つしかない場合、単一の初期化のみにsfud_device_init使用できます。
注:初期化されたSPIフラッシュは、デフォルトではwrite保護されていません。 write-protectを有効にする必要がある場合は、sfud_write_status関数を使用してSPIフラッシュステータスを変更してください。
sfud_err sfud_init ( void ) sfud_err sfud_device_init ( sfud_flash * flash )| パラメーター | 説明する |
|---|---|
| フラッシュ | 初期化されるフラッシュデバイス |
SFUDがQSPIモードをオンにすると、SFUDのフラッシュドライバーはQSPIバスを使用した通信をサポートします。従来のSPIモードと比較して、QSPIを使用すると、フラッシュデータの読み取り値が加速できます。ただし、データを作成する必要がある場合、フラッシュ自体のデータ書き込み速度はSPI伝送速度よりも遅くなるため、QSPIモードでのデータ書き込み速度は大幅に改善されません。
したがって、QSPIモードに対するSFUDのサポートは、高速読み取りコマンドに限定されます。この関数を使用すると、フラッシュが使用するQSPIバスの実際のサポートされている最大データライン幅を構成できます。たとえば、次の行(デフォルト、つまり、従来のSPIモード)、2行、4行です。
設定後、SFUDは現在設定されているQSPIバスデータラインの幅を組み合わせて、QSPIフラッシュ拡張情報テーブルで最も適切で最速のクイック読み取りコマンドに一致します。その後、ユーザーがsfud_read()を呼び出すと、QSPIモード伝送関数を使用してコマンドを送信します。
sfud_err sfud_qspi_fast_read_enable ( sfud_flash * flash , uint8_t data_line_width )| パラメーター | 説明する |
|---|---|
| フラッシュ | フラッシュデバイス |
| data_line_width | QSPIバスでサポートされる最大データライン幅:1、2、4など |
フラッシュデバイステーブルは、使用するすべてのフラッシュデバイスオブジェクトを保存する責任があるSFUD構成ファイルで定義されているため、SFUDは複数のフラッシュデバイスをサポートして同時に駆動します。デバイステーブルの構成はSFUD_FLASH_DEVICE_TABLE /sfud/inc/sfud_cfg.hで定義されています。詳細な構成方法については、2.3構成方法フラッシュを参照してください)。このメソッドは、デバイステーブルのフラッシュデバイスをインデックス化することによりフラッシュデバイスオブジェクトを返し、デバイステーブルの範囲を超えてNULLを返します。
sfud_flash * sfud_get_device ( size_t index )| パラメーター | 説明する |
|---|---|
| 索引 | フラッシュデバイステーブルにあるフラッシュデバイスのインデックス値 |
sfud_err sfud_read ( const sfud_flash * flash , uint32_t addr , size_t size , uint8_t * data )| パラメーター | 説明する |
|---|---|
| フラッシュ | フラッシュデバイスオブジェクト |
| addr | アドレス開始 |
| サイズ | 開始アドレスから読み取られるデータの合計サイズ |
| データ | データを読む |
注:消去操作は、フラッシュチップの消去粒度に従って整列されます(詳細については、一般的にブロックサイズについてはフラッシュデータシートを参照してください。初期化が完了した後、
sfud_flash->chip.erase_granを介して表示できます)。 Flashチップの消去粒度に応じて、開始アドレスと消去データサイズが整列されるように注意してください。それ以外の場合、消去操作を実行した後、他のデータが失われます。
sfud_err sfud_erase ( const sfud_flash * flash , uint32_t addr , size_t size )| パラメーター | 説明する |
|---|---|
| フラッシュ | フラッシュデバイスオブジェクト |
| addr | アドレス開始 |
| サイズ | 開始アドレスからデータを消去する合計サイズ |
sfud_err sfud_chip_erase ( const sfud_flash * flash )| パラメーター | 説明する |
|---|---|
| フラッシュ | フラッシュデバイスオブジェクト |
sfud_err sfud_write ( const sfud_flash * flash , uint32_t addr , size_t size , const uint8_t * data )| パラメーター | 説明する |
|---|---|
| フラッシュ | フラッシュデバイスオブジェクト |
| addr | アドレス開始 |
| サイズ | 開始アドレスから書かれたデータの合計サイズ |
| データ | 記述されるデータ |
注:消去操作は、フラッシュチップの消去粒度に従って整列されます(詳細については、一般的にブロックサイズについてはフラッシュデータシートを参照してください。初期化が完了した後、
sfud_flash->chip.erase_granを介して表示できます)。 Flashチップの消去粒度に応じて、開始アドレスと消去データサイズが整列されるように注意してください。それ以外の場合、消去操作を実行した後、他のデータが失われます。
sfud_err sfud_erase_write ( const sfud_flash * flash , uint32_t addr , size_t size , const uint8_t * data )| パラメーター | 説明する |
|---|---|
| フラッシュ | フラッシュデバイスオブジェクト |
| addr | アドレス開始 |
| サイズ | 開始アドレスから書かれたデータの合計サイズ |
| データ | 記述されるデータ |
sfud_err sfud_read_status ( const sfud_flash * flash , uint8_t * status )| パラメーター | 説明する |
|---|---|
| フラッシュ | フラッシュデバイスオブジェクト |
| 状態 | 現在のステータス登録値 |
sfud_err sfud_write_status ( const sfud_flash * flash , bool is_volatile , uint8_t status )| パラメーター | 説明する |
|---|---|
| フラッシュ | フラッシュデバイスオブジェクト |
| is_volatile | 見逃すのは簡単ですか? True:見逃しやすく、停電後に失われるでしょう |
| 状態 | 現在のステータス登録値 |
すべての構成は/sfud/inc/sfud_cfg.h sfud_cfg.hにあります。以下の構成の紹介を参照して、プロジェクトに合った構成を選択してください。
SFUD_DEBUG_MODEマクロ定義をオン/オフにします
SFUD_USING_SFDPマクロ定義をオン/オフにします
注:閉じた後、ライブラリが
/sfud/inc/sfud_flash_def.hのライブラリが提供するフラッシュ情報テーブルのみが質問されます。これにより、ソフトウェアの適応性が低下しますが、コードの量が減ります。
SFUD_USING_FAST_READマクロ定義をオン/オフにします。多くのフラッシュ読み取りモードは、より高いSPI頻度を満たしていない場合があります(詳細については、各フラッシュのデータシート交換特性を参照してください)、高速読み取りモードを有効にする必要があります。
注:Fast Readモードは、読み取り時にデフォルトのnullバイトを挿入するため、SPIレートが遅いときに読み取りモードよりも遅くなる可能性があります。
SFUD_USING_FLASH_INFO_TABLEマクロ定義をオン/オフにします
注:閉じた後、このライブラリはSFDP仕様をサポートするフラッシュのみを駆動します。これにより、コードの量も適切に削減されます。さらに、2.3.2と2.3.3の2つのマクロ定義は、そのうちの少なくとも1つを定義し、両方の方法で選択することもできます。
コードの量をさらに減らすために、 SFUD_USING_SFDPとSFUD_USING_FLASH_INFO_TABLEも定義されていない場合があります。
この時点で、フラッシュデバイスを定義するときにフラッシュパラメーターを指定し、 sfud_device_initを呼び出してデバイスを初期化します。次のコードを参照してください。
sfud_flash sfud_norflash0 = {
. name = "norflash0" ,
. spi . name = "SPI1" ,
. chip = { "W25Q64FV" , SFUD_MF_ID_WINBOND , 0x40 , 0x17 , 8L * 1024L * 1024L , SFUD_WM_PAGE_256B , 4096 , 0x20 } };
......
sfud_device_init ( & sfud_norflash0 );
......製品に複数のフラッシュがある場合は、フラッシュデバイステーブルを追加できます。 SFUD_FLASH_DEVICE_TABLEのマクロ定義を変更すると、例は次のとおりです。
enum {
SFUD_W25Q64CV_DEVICE_INDEX = 0 ,
SFUD_GD25Q64B_DEVICE_INDEX = 1 ,
};
#define SFUD_FLASH_DEVICE_TABLE
{
[SFUD_W25Q64CV_DEVICE_INDEX] = {.name = "W25Q64CV", .spi.name = "SPI1"},
[SFUD_GD25Q64B_DEVICE_INDEX] = {.name = "GD25Q64B", .spi.name = "SPI3"},
}上記の2つのフラッシュデバイスを定義しています(ほとんどの製品の1つで十分です)。 2つのデバイスの名前は、 "W25Q64CV"および"GD25Q64B"で、それぞれ2つのSPIデバイス名"SPI1"と"SPI3"に対応しています( /sfud/port/sfud_port.cにあるSPIインターフェイスを移行するときに使用されます)。 SFUD_W25Q16CV_DEVICE_INDEXとSFUD_GD25Q64B_DEVICE_INDEXの2つの列挙は、デバイステーブルの2つのデバイスのインデックスを定義します。 sfud_get_device_table()メソッドを介してデバイステーブルを取得し、このインデックス値で指定されたデバイスにアクセスできます。
SFUD_USING_QSPIマクロ定義をオン/オフにします
有効にすると、SFUDはQSPIバスを使用してフラッシュ接続をサポートします。
ポートファイルは/sfud/port/sfud_port.cにあります。ファイル内のsfud_err sfud_spi_port_init(sfud_flash *flash)メソッドは、ライブラリが提供するポートメソッドです。 SPI読み取りドライバー(必須)、再試行時間(必須)、再試行インターフェイス(オプション)、SPIロック(オプション)の構成を完了します。より詳細な移植コンテンツについては、デモ内の各プラットフォームの移植ファイルを参照できます。
ここでは、 /sfud/inc/sfdu_flash_def.hを変更する必要があります。サポートされているすべてのフラッシュについては、 SFUD_FLASH_CHIP_TABLEマクロ定義を参照してください。事前に準備する必要があるフラッシュパラメーターは次のとおりです。名前|メーカーID |タイプID |容量ID |容量|書き込みモード|消去粒度(消去の最小単位)|粒度対応コマンド|を消去します。ここでは、Gigadeviceを使用したGD25Q64Bフラッシュを例として取ります。
このフラッシュは、Gioyi Innovationの早期生産モデルであるため、SFDP標準をサポートしていません。まず、データシートをダウンロードして、0x9Fコマンドによって返された3つのIDを見つける必要があります。ここでは、最後の2つのバイトID、つまりtype idとcapacity id必要です。 GD25Q64B 、これら2つのIDにそれぞれ0x40と0x17対応しています。上記の他のフラッシュパラメーターは、データシートに記載されています。ここでは、ライティングモードに焦点を当てます。このパラメーターは、ライブラリ自体によって提供されます。書き込みモードには4種類があります。詳細については、ファイルの上部にあるsfud_write_mode enumerationタイプを参照してください。同じフラッシュは、状況に応じて、複数の書き込みモードを同時にサポートできます。 GD25Q64Bの場合、サポートされている書き込みモードはSFUD_WM_PAGE_256B 、つまりページごとに1〜256バイトを書き込む必要があります。上記のGD25Q64Bフラッシュパラメーターと組み合わせると、次のとおりです。
{"GD25Q64B", SFUD_MF_ID_GIGADEVICE, 0x40, 0x17, 8*1024*1024, SFUD_WM_PAGE_256B, 4096, 0x20},
SFUD_FLASH_CHIP_TABLEマクロ定義の最後に追加して、 GD25Q64Bのライブラリのサポートを完了します。
現在、次のプラットフォームでデモをサポートしています
| パス | プラットフォームの説明 |
|---|---|
| /demo/stm32f10x_non_os | STM32F10Xベアメタルプラットフォーム |
| /demo/stm32f2xx_rtt | STM32F2XX + RT-Threadオペレーティングシステムプラットフォーム |
| /DEMO/STM32L475_NON_OS_QSPI | STM32L475 + QSPIモードベアメタルプラットフォーム |
| /demo/esp32_ext_spi_flash | ESP32C3 + SPI外部フラッシュESP-IDFフレームワーク |
MITオープンソースプロトコルを使用します。詳細については、プロジェクトのライセンスファイルの内容をお読みください。