diverta / onecard-fido

MIT License
0 stars 0 forks source link

[TFT接続対応] nRF52840アプリケーションにSPIを追加実装 #753

Closed makmorit closed 1 year ago

makmorit commented 1 year ago

概要

FORMIKE社の超小型TFTディスプレイ「KWH009ST01-F01」を、nRF52840に接続できるようにするため、nRF52840アプリケーションにSPIペリフェラルを追加実装します。

nRF52840とTFTディスプレイの接続は、#735 で製作した接続用治具を使用します。

makmorit commented 1 year ago

進めかた

Nordic社から、nRF5_SDK_17.1.0/examples/peripheral/spiというサンプルアプリケーションが公開されているので、まずは手始めに、こちらのサンプルで動作確認するようにします。 ただし、TFTディスプレイからのデータ受信は無いため、その部分をコメントアウトするなりして実行させるようにします。

makmorit commented 1 year ago

進捗

nRF52840 DKに、#761 で製造した治具を接続し、Commit 05f0bf1 までの対応を施したプログラムで動作確認を実施しました。

結果としては、任意のデータを送信後、次のデータを送信する直前でBUSYを検出してしまい、SPI通信が成立しない状況です。 事象の詳細としては、アプリケーションが開始(=main.cの永久ループが開始)した後だと、前述のBUSY検出が発生しています。 (アプリケーション開始前では、BUSY検出が無く、SPI通信は正常に成立しているようです)

Logs dropped (199)
<error> app_tiny_tft: SPI driver is not ready for a new transfer
Logs dropped (199)
<error> app_tiny_tft: SPI driver is not ready for a new transfer
Logs dropped (199)
<error> app_tiny_tft: SPI driver is not ready for a new transfer
Logs dropped (199)
<error> app_tiny_tft: SPI driver is not ready for a new transfer
:
<error> app_tiny_tft: SPI driver is not ready for a new transfer
Logs dropped (200)
<info> app: TFT display filled by yellow

対策としては、アプリケーションの永久ループ内で、USB通信と同様、例えば「通信が完了した」「BUSYでない」といったステータス判定を行うよう実装する必要がありそうです。 GitHubで公開されている、他プロジェクトの事例も調査しながら、対策検討を続けたいと思います。

makmorit commented 1 year ago

対応結果の確認

対策としては、アプリケーションの永久ループ内で、USB通信と同様、例えば「通信が完了した」「BUSYでない」といったステータス判定を行うよう実装する必要がありそうです。

本件TFTモジュールに対するSPI通信が、送信Onlyであり、そもそも非同期である必要がないため、ノンブロッキング送信に改修しました(Commit 0577896ご参照)。 この結果、nRF52840アプリケーションでも、nRF5340アプリケーションと同様、TFTの動作が正常に行われる事を確認いたしました。

<debug> app_tiny_tft: nrf_drv_spi_init returns 0 
<info> app: TFT display initialize done
<info> app: TFT display filled by yellow
<info> app: TFT display filled by black