ArduinoとSDカードを使用したSPIフラッシュのプログラミング

背景


次回のクリーニング中に、延長コードが誤ってオフになり、作業システムユニットとモニターが接続されました。 システムユニットの構成は次のとおりです。


電源を入れた後、システムユニットは5つの厄介なきしみ音を発し始めました。これは、プロセッサの誤動作に対応しているようです。 Yandex.Marketによると、プロセッサのコストは現在11,000ルーブルです。 購入するのは非常に高価ですが、安価ですが、弱くはありません。 一般的に、少し怖い...

私はインターネットを調べたところ、誤動作の正確な原因は完全に異なる可能性があることがわかりました。 これは小さな希望に影響を与えました。 しかし、どういうわけかこのまさに理由を見つける必要があります。

まず、別の古いBPを接続しました-コンピューターが起動しません。

さらにチェックするために、車のコンプを持ち帰りました。 構成:


コンポーネントが交換可能であることが判明したのは良いことです。

私は車のコンピューターからプロセッサーを引き出し、ホームコンピューターに挿入しました-コンピューターは起動しません。 しかし、プロセッサがまだ無傷であり、マザーボードに欠陥があるという希望がありました。これはわずかに安価です(ただし、H61とH67以外のチップセットの新しいチップは不足しています)。

次に、ホームプロセッサをカーコンピューターに挿入しました。コンピューターは動作しました。 その結果、プロセッサは動作し、問題はマザーボードにあります。 彼はBIOS(Winbond 25Q64BVAIG)で罪を犯し始めました。

実際、プログラミング


BIOSチップがはんだ付けされておらず、通常のDIP-8ソケット上にあるのは良いことです。 私にはプログラマーがいません;中国で注文して1か月待つのは選択肢ではありません。 妻のラップトップと入手可能なArduino Nanoからプログラマーを作ることにしました。 インターネットで大騒ぎします...基本的にどこでもファームウェアはCOMポート経由でアップロードされますが、メモリカードからフラッシュすることにしました(はるかに高速のようです)。

接続図をスケッチしました:



ブレッドボード上のすべてを組み立てました:



メモリカードの種類とサイズ、フォーマット方法、ファイル名は、SD Arduinoライブラリの要件に準拠する必要があります。

最初に、SPIフラッシュの内容を読み取り、メモリカード上のファイルに書き込むスケッチをスケッチしました。同時に、Checksum-32メソッドを使用してチェックサムを計算しました。 単純な合計。

ReadFlash_WriteSD.ino
/*  SPI-Flash: CS - D9 MOSI - D11 MISO - D12 CLK - D13  SD-Card Shield: CS - D10 MOSI - D11 MISO - D12 CLK - D13 */ #include <SD.h> #include <SPIFlash.h> #define Flash_CS 9 #define SD_CS 10 #define FILENAME "BIOS.ROM" File myFile; SPIFlash flash(Flash_CS); void setup() { Serial.begin(115200); while (!Serial) {} //     //  SD- Serial.println("Initializing SD card..."); if (!SD.begin(SD_CS)) { Serial.println("Initialization SD card failed!"); return; } Serial.println("Initialization done."); //   ,   Serial.print(FILENAME); if (SD.exists(FILENAME)) { Serial.println(" exists, removing..."); SD.remove(FILENAME); } else { Serial.println(" doesn't exist."); } //        Serial.print("Creating "); Serial.print(FILENAME); Serial.println("..."); myFile = SD.open(FILENAME, FILE_WRITE); //       -     if (myFile) { //  SPI Flash Serial.println("Initializing SPI Flash..."); flash.begin(); // / /  256  uint8_t data_buffer[256]; //   uint32_t maxPage = flash.getMaxPage(); // Checksum (32 bit) uint32_t checkSum = 0; for (int page = 0; page < maxPage; page++) { //    if ((page % 1000) == 0) { Serial.print(page + 1); Serial.print("/"); Serial.println(maxPage); } //   SPI Flash flash.readByteArray(page, 0, &data_buffer[0], 256); //        myFile.write(data_buffer, 256); //    for (int i = 0; i < 256; i++) { checkSum += data_buffer[i]; } } //      myFile.close(); //    Serial.print("Checksum-32: 0x"); Serial.println(checkSum, HEX); Serial.println("Done."); } else { //    ,      Serial.println("Error creating "); Serial.println(FILENAME); } } void loop() { //   } 


スケッチを開始し、結果のファイルを元のBIOSと比較しました-約140,000バイトの不一致が判明しました。

その後、メモリカードからファイルを読み取り、以前にチップを消去してSPIフラッシュに書き込むスケッチを書きました。

ReadSD_WriteFlash.ino
 /*  SPI-Flash: CS - D9 MOSI - D11 MISO - D12 CLK - D13  SD-Card Shield: CS - D10 MOSI - D11 MISO - D12 CLK - D13 */ #include <SD.h> #include <SPIFlash.h> #define Flash_CS 9 #define SD_CS 10 #define FILENAME "B75PRO31.90" File myFile; SPIFlash flash(Flash_CS); void setup() { Serial.begin(115200); while (!Serial) {} //     //  SD- Serial.println("Initializing SD card..."); if (!SD.begin(SD_CS)) { Serial.println("Initialization SD card failed!"); return; } Serial.println("Initialization done."); if (!SD.exists(FILENAME)) { Serial.print(FILENAME); Serial.println(" doesn't exist."); return; } //     Serial.print("Opening "); Serial.print(FILENAME); Serial.println("..."); myFile = SD.open(FILENAME, FILE_READ); //     -     if (myFile) { Serial.print("File "); Serial.print(FILENAME); Serial.println(" is open."); //  SPI Flash Serial.println("Initializing SPI Flash..."); flash.begin(); //   if (flash.eraseChip()) { Serial.println("Chip erased."); } else { Serial.println("Error erasing chip."); return; } // / /  256  uint8_t data_buffer[256]; //   uint32_t maxPage = flash.getMaxPage(); // Checksum (32 bit) uint32_t checkSum = 0; for (int page = 0; page < maxPage; page++) { //    if ((page % 1000) == 0) { Serial.print(page + 1); Serial.print("/"); Serial.println(maxPage); } //      myFile.read(data_buffer, 256); //     SPI Flash flash.writeByteArray(page, 0, &data_buffer[0], 256); //    for (int i = 0; i < 256; i++) { checkSum += data_buffer[i]; } } //      myFile.close(); //    Serial.print("Checksum-32: 0x"); Serial.println(checkSum, HEX); Serial.println("Done."); } else { //     -     Serial.print("Error opening "); Serial.println(FILENAME); } } void loop() { //   } 


私はそれを始め、待って、スケッチがチェックサムを引き出した、それは元のファイルのチェックサムと一致した。 しかし、これはメモリカード上のファイルのチェックサムですが、SPIフラッシュの内容のチェックサムが必要です。

最初のスケッチを使用できますが、同じアルゴリズムを使用してSPIフラッシュの内容のチェックサムのみを考慮する3番目のスケッチを作成しました。

Checksumflash.ino
 /*  SPI-Flash: CS - D9 MOSI - D11 MISO - D12 CLK - D13 */ #include <SPIFlash.h> #define Flash_CS 9 SPIFlash flash(Flash_CS); void setup() { Serial.begin(115200); while (!Serial) {} //     //   ,    SD- pinMode(10, OUTPUT); digitalWrite(10, HIGH); //  SPI Flash Serial.println("Initializing SPI Flash..."); flash.begin(); //    256  uint8_t data_buffer[256]; //   uint32_t maxPage = flash.getMaxPage(); // Checksum (32 bit) uint32_t checkSum = 0; for (int page = 0; page < maxPage; page++) { //    if ((page % 1000) == 0) { Serial.print(page + 1); Serial.print("/"); Serial.println(maxPage); } //   SPI Flash flash.readByteArray(page, 0, &data_buffer[0], 256); //    for (int i = 0; i < 256; i++) { checkSum += data_buffer[i]; } } //    Serial.print("Checksum-32: 0x"); Serial.println(checkSum, HEX); Serial.println("Done."); } void loop() { //   } 


SPIフラッシュのチェックサムは、元のファイルのチェックサムと同じです。

フラッシュされたBIOSチップをホームコンピューターに挿入した後、安全に動作しました。

Arduino IDEでは、ライブラリ管理を介してSPIFlashライブラリをインストールする必要があります。

チェックサムは、HxD HxDエディターを使用して計算されました。

PS:元々、私はこれをSDモジュールとして使用していました。

しかし、彼には頻繁に不具合があり、SDカードは初期化されませんでした。 Arduinoがコンピューターに接続されたときのSDカード自体の「ホット」再接続が役立ちました。

PPS:抵抗の代わりに、双方向信号コンバーターを接続しようとしました:

しかし、この計画は彼とはうまくいかなかった。

Source: https://habr.com/ru/post/J318110/


All Articles