CYUSB3014のEEPROMへの書き込みについて

Tip / ログイン to post questions, reply, level up, and achieve exciting badges. Know more

cross mob
user_3987996
Level 3
Level 3
25 replies posted 10 replies posted 5 replies posted

以前にも質問させていただきましたが、CUYSB3014のSPI接続のEEPROMにプログラムを書き込むときに

EEPROM側で書き込みロックがかかているものだと、CYPRESSの書き込みユーティリティでは書き込みが

できませんでしたが、CYUSB3014の元から入っているファームを書き換える等で書き込みロックがかかっている

EEPROMにユーティリティで書き込みができるようにする方法をお教え下さい。

0 件の賞賛
1 解決策
HirotakaT_91
Moderator
Moderator
Moderator
500 replies posted 250 replies posted 100 replies posted

以前の質問というのはこちらのスレッドのことでよろしいでしょうか?

SPI BOOT2

やりたいこととしては、EEPROMにあるProtection機能をFX3 Firmwareから解除し、EZ-PD USB Control CenterからSPI EEPROMにFirmwareを書き込めるようにするということでよろしいでしょうか。

上記スレッドに重複することですが、S25FS128Sを参考にしてみますと、S25FS128Sデータシートの"7.6.3.1 Configuration Register 1 Non-Volatile (CR1NV)"において、BPNV_O(CR1NV[3])が初期設定(工場出荷時)でNon-Volatileになっています。そして、 BP_NV0/1/2は0に設定されており、ProgramまたはErase操作から保護されていない状態です。そのため、特に議論点はないかと存じます。

一方で、SST25VF016B(Microchip社製)では、デフォルトで各BPビットは1に設定されており、全てのブロックが保護されている状態にあります。

本データシートの"4.3.4 BLOCK PROTECTION (BP3,BP2, BP1, BP0)"にあるように、WP#がHighに設定されていれば、Write-Status-Register (WRSR)コマンドを使用して全てのBPを0に設定できます。

pastedImage_2.png

次に、WRSRを使うシーケンスは"4.4.14 WRITE-STATUS-REGISTER (WRSR)"と"FIGURE 4-17: ENABLE-WRITE-STATUS-REGISTER (EWSR) OR WRITE-ENABLE (WREN) AND WRITE-STATUS-REGISTER (WRSR) SEQUENCE"に示されております。

pastedImage_1.png

(SST25VF016Bの使い方詳細についてはMicrochip社へお問い合わせください。)

FX3でSPIコマンドを発行する方法は、サンプルファームウェアですとUsbSpiRegMode (cyfxusbspiregmode) または USBFlashProg (cyfxflashprog)辺りが参考になります。

これらのreadme.txtに書かれているように、以下の手順でSPI Writeが実行されます。

  1. Erase the required sector: CY_FX_RQT_SPI_FLASH_ERASE_POLL with wValue

     as 1 and length as 0.

  2. Wait for erase to complete: CY_FX_RQT_SPI_FLASH_ERASE_POLL with wValue

     as 0 and IN length as 1. Repeat this until the returned value has WIP zero.

  3. Write data to page: CY_FX_RQT_SPI_FLASH_WRITE with correct parameters.

  4. Wait for write to complete: CY_FX_RQT_SPI_FLASH_ERASE_POLL with wValue

     as 0 and IN length as 1. Repeat this until the returned value has WIP zero.

よって、BPビットを変更するのは、このCY_FX_RQT_SPI_FLASH_ERASE_POLLが初めて実行される前に行えば良いと考えます。

UsbSpiRegModeファームウェアの場合、CyFxSpiEraseSectorという関数が定義されており、ここでSector Eraseが実施されています。

Sector Eraseの実施前に、BPビットを変更するためのコマンド(上記のFIGURE 4-17)を実装してみてください。

(2020/04/06 18:00時加筆修正)

よって、ProgramまたはErase操作を行う前に、BPビットを変更する必要があるわけですが、USB BOOTでFX3 RAM上にそのような動作を行うプログラムを書き込みます。BPビットの変更操作のプログラムではSPIコマンドを発行する必要があるわけですが、FX3でSPIコマンドを発行する方法は、サンプルファームウェアですとUsbSpiRegMode (cyfxusbspiregmode) または USBFlashProg (cyfxflashprog)辺りが参考になります。

これによって、BPビットを変更できますので、その後Control CenterからSPI Flashに書き込みたいプログラムを書き込みます。

Best regards,

Hirotaka Takayama

元の投稿で解決策を見る

0 件の賞賛
3 返答(返信)
HirotakaT_91
Moderator
Moderator
Moderator
500 replies posted 250 replies posted 100 replies posted

以前の質問というのはこちらのスレッドのことでよろしいでしょうか?

SPI BOOT2

やりたいこととしては、EEPROMにあるProtection機能をFX3 Firmwareから解除し、EZ-PD USB Control CenterからSPI EEPROMにFirmwareを書き込めるようにするということでよろしいでしょうか。

上記スレッドに重複することですが、S25FS128Sを参考にしてみますと、S25FS128Sデータシートの"7.6.3.1 Configuration Register 1 Non-Volatile (CR1NV)"において、BPNV_O(CR1NV[3])が初期設定(工場出荷時)でNon-Volatileになっています。そして、 BP_NV0/1/2は0に設定されており、ProgramまたはErase操作から保護されていない状態です。そのため、特に議論点はないかと存じます。

一方で、SST25VF016B(Microchip社製)では、デフォルトで各BPビットは1に設定されており、全てのブロックが保護されている状態にあります。

本データシートの"4.3.4 BLOCK PROTECTION (BP3,BP2, BP1, BP0)"にあるように、WP#がHighに設定されていれば、Write-Status-Register (WRSR)コマンドを使用して全てのBPを0に設定できます。

pastedImage_2.png

次に、WRSRを使うシーケンスは"4.4.14 WRITE-STATUS-REGISTER (WRSR)"と"FIGURE 4-17: ENABLE-WRITE-STATUS-REGISTER (EWSR) OR WRITE-ENABLE (WREN) AND WRITE-STATUS-REGISTER (WRSR) SEQUENCE"に示されております。

pastedImage_1.png

(SST25VF016Bの使い方詳細についてはMicrochip社へお問い合わせください。)

FX3でSPIコマンドを発行する方法は、サンプルファームウェアですとUsbSpiRegMode (cyfxusbspiregmode) または USBFlashProg (cyfxflashprog)辺りが参考になります。

これらのreadme.txtに書かれているように、以下の手順でSPI Writeが実行されます。

  1. Erase the required sector: CY_FX_RQT_SPI_FLASH_ERASE_POLL with wValue

     as 1 and length as 0.

  2. Wait for erase to complete: CY_FX_RQT_SPI_FLASH_ERASE_POLL with wValue

     as 0 and IN length as 1. Repeat this until the returned value has WIP zero.

  3. Write data to page: CY_FX_RQT_SPI_FLASH_WRITE with correct parameters.

  4. Wait for write to complete: CY_FX_RQT_SPI_FLASH_ERASE_POLL with wValue

     as 0 and IN length as 1. Repeat this until the returned value has WIP zero.

よって、BPビットを変更するのは、このCY_FX_RQT_SPI_FLASH_ERASE_POLLが初めて実行される前に行えば良いと考えます。

UsbSpiRegModeファームウェアの場合、CyFxSpiEraseSectorという関数が定義されており、ここでSector Eraseが実施されています。

Sector Eraseの実施前に、BPビットを変更するためのコマンド(上記のFIGURE 4-17)を実装してみてください。

(2020/04/06 18:00時加筆修正)

よって、ProgramまたはErase操作を行う前に、BPビットを変更する必要があるわけですが、USB BOOTでFX3 RAM上にそのような動作を行うプログラムを書き込みます。BPビットの変更操作のプログラムではSPIコマンドを発行する必要があるわけですが、FX3でSPIコマンドを発行する方法は、サンプルファームウェアですとUsbSpiRegMode (cyfxusbspiregmode) または USBFlashProg (cyfxflashprog)辺りが参考になります。

これによって、BPビットを変更できますので、その後Control CenterからSPI Flashに書き込みたいプログラムを書き込みます。

Best regards,

Hirotaka Takayama

0 件の賞賛

回答ありがとうございます。

UsbSpiRegMode (cyfxusbspiregmode) または USBFlashProg (cyfxflashprog)辺りを参考にしてBPビットを変更するためのコマンドを

作り込んで、一度USB BOOTで作成したプログラムをEZ-PD USB Control Centerで書き込んで実行した後に、再度EZ-PD USB Control CenterでSPI BOOTするようにプログラムを書き込むという認識でいいでしょうか?

以上、宜しくお願いします。

0 件の賞賛

はい、面倒な動作かもしれませんが、その流れで行っていただくことを想定しています。

Re: SPI BOOT2

>> SST25VF016B の場合、電源投入後は必ず保護されてしまうので、 FX3 の RAM 上のプログラムで BPx を書き換えておいて、電源を落とさないようにして Control Center から SPI Flash に書き込みを行うという方法が考えられます。

上記の投稿にあるように、まずはUSB BOOTでBPxを書き換えるような動作をするプログラムを書き込み、その後Control CenterからSPI FlashにSPI BOOTするようにプログラムを書き込みます。

分かりやすくするために始めの回答に少し加筆しておきます。

Best regards,

Hirotaka Takayama

0 件の賞賛