cancel
Showing results for 
Search instead for 
Did you mean: 

PSoC 5, 3 & 1

TeMa_2997106
Contributor II

PSoC5LP内にあるEEPROMに対して、16Byte未満の複数ByteをNon-Blockingで一括書込みしたいと考えています。

指定位置のデータを変更した後、EEPROM_StartWrite()を呼べば実現できると考えていますが正しいでしょうか。

※この関数がBlocking呼び出しなのかNon-Blocking呼び出しなのかがわかりませんでした。

もし、Non-Blockingではない、もしくは一括で書き込みできない場合は、

どのように処理すればよいでしょうか。

宜しくお願いします。

0 Likes
1 Solution
AikoO_51
Moderator
Moderator

結論から言うと、16 Byte未満の複数Byteの書き込みが可能で、且つブロッキングコードでないAPIはありません。

まずEEPROM_StartWrite API についてですが、EEPROMコンポーネントで自動生成されるEEPROM.cファイル内にAPIの説明について下記の記載があります。

*  This function does not block. The function returns once the SPC has begun

*  writing the data. This function must be used in combination with

*  EEPROM_1_Query(). EEPROM_1_Query() must be called

*  until it returns a status other than CYRET_STARTED. That indicates that the

*  write has completed. Until EEPROM_1_Query() detects that

*  the write is complete, the SPC is marked as locked to prevent another

*  SPC operation from being performed.

*  Starts a write of a row (16 bytes) of data to the EEPROM.

APIの処理内容でもブロッキングコードにはなっていないのですが,16 Byte固定での書き込みになります。

 

PSoC CreatorにあるPSoC5LPEEPROMサンプルコードで使用されているEEPROM_WriteByteAPIは、Byteごとに書き込みを行うのですが、処理が終わるまでブロックされます。

ですので、どのような処理を希望するかによりますが、Non-Blockを諦めてEEPROM_WriteByte を使用し、16 Byte 未満の希望のByte数のdataを書き込むという選択や、EEPROM_StartWrite APIを使用して16 Byteに満たない分のByte数を補うcodeを作成するなどの工夫が必要になります。

以上の点を考慮して、どのような処理にするかご検討ください。

Aiko Ohtaka
Infineon Technologies

View solution in original post

0 Likes
4 Replies
MaMi_1205306
Honored Contributor

EEPROMコンポーネントで自動生成されるEEPROM.cファイル内に

EEPROM_StartWrite APIの説明について下記の記載があります。

*  This function does not block. The function returns once the SPC has begun

*  writing the data. This function must be used in combination with

*  EEPROM_1_Query(). EEPROM_1_Query() must be called

*  until it returns a status other than CYRET_STARTED. That indicates that the

*  write has completed. Until EEPROM_1_Query() detects that

*  the write is complete, the SPC is marked as locked to prevent another

*  SPC operation from being performed.

APIの処理内容みてもブロッキングコードにはなっていないので、

EEPROMへ書き込む際は他の処理を行わないように、

割り込みを無効にするか、クリティカルセクションとして保護する必要があると思います。

EEPROM_StartWriteのAPIを使用したことは無いのですが、

説明に(ROW)書き込みを行うと記載があるため、

*  Starts a write of a row (16 bytes) of data to the EEPROM.

Byte書き込みを行うのであればEEPROM_WriteByteのAPIを使用した方が良いような気がしています。

EEPROM_WriteByteのAPIならば処理が終わるまでブロックされると記載されていますし、

配列で変数を用意し、forループで連続的に書き込むなどの使用法は過去に行ったことはあります。

PSoC CreatorにあるPSoC5LPのEEPROMサンプルコードではこちらのEEPROM_WriteByteのAPIが使用されていますので、

そちらを参照して頂いても良いかもしれません。

0 Likes
TeMa_2997106
Contributor II

ありがとうございます。

行いたいのはNon-Blocking呼び出しですので、EEPROM_StartWrite() 自体は使えそうですが、

Byte単位での書き込みはEEPROM_WriteByte()の方がよいと思いますので、

他処理を含めてどちらがよいかは総合的に判断したいと思います。

0 Likes
AikoO_51
Moderator
Moderator

結論から言うと、16 Byte未満の複数Byteの書き込みが可能で、且つブロッキングコードでないAPIはありません。

まずEEPROM_StartWrite API についてですが、EEPROMコンポーネントで自動生成されるEEPROM.cファイル内にAPIの説明について下記の記載があります。

*  This function does not block. The function returns once the SPC has begun

*  writing the data. This function must be used in combination with

*  EEPROM_1_Query(). EEPROM_1_Query() must be called

*  until it returns a status other than CYRET_STARTED. That indicates that the

*  write has completed. Until EEPROM_1_Query() detects that

*  the write is complete, the SPC is marked as locked to prevent another

*  SPC operation from being performed.

*  Starts a write of a row (16 bytes) of data to the EEPROM.

APIの処理内容でもブロッキングコードにはなっていないのですが,16 Byte固定での書き込みになります。

 

PSoC CreatorにあるPSoC5LPEEPROMサンプルコードで使用されているEEPROM_WriteByteAPIは、Byteごとに書き込みを行うのですが、処理が終わるまでブロックされます。

ですので、どのような処理を希望するかによりますが、Non-Blockを諦めてEEPROM_WriteByte を使用し、16 Byte 未満の希望のByte数のdataを書き込むという選択や、EEPROM_StartWrite APIを使用して16 Byteに満たない分のByte数を補うcodeを作成するなどの工夫が必要になります。

以上の点を考慮して、どのような処理にするかご検討ください。

Aiko Ohtaka
Infineon Technologies

View solution in original post

0 Likes
TeMa_2997106
Contributor II

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

Non-Blockingを前提とすると、後者のように足りないデータ分をダミー等で埋めるのが実現は簡単そうですので、

その方向で進めたいと思います。

以上です。

0 Likes