2016年8月30日火曜日

ベースマシンのシーケンサー シーケンス再生中にLCDを表示する(SPIの調査)

SPIクロックの指定


シーケンサーのSPI信号を測定してみたところ、LCD表示に使っているSPI2のSCLが500kHz程度だったので、st7567用のライブラリにSPIのクロックを設定するメンバ関数を追加した。(ライブラリのデフォルトではSPIクロックは1MHzの指定)

st7567LCD:
https://developer.mbed.org/users/ryood/code/st7567LCD/#0e21d2f2155a

SPI1はシーケンス送信、SPI2はLCD表示に使用していてともにSPI::frequency()でクロックを16MHzを設定するようにした。

SPI1

ch2:SPI1のSCK

オシロのカーソルで測定するとクロックは約10.5Mhz。

SPI2

ch1:SPI2のSCK

SPI1とは横軸の縮尺が違い、オシロのカーソルで測定するとクロックは約5.25Mhz。

プログラムで同じ16MHzを指定してもSPI1とSPI2で実際のクロック数が異なっている。

SPI信号のタイミング


SPIのクロックを上げて、簡単な文字列を表示するようにすると、シーケンス再生中にLCDに描画することができた。

mbad repository:
https://developer.mbed.org/users/ryood/code/BaseMachine_Sequencer/ (revision 29)

SPI信号

ch1:SPI2(LCD) ch2:SPI1(Sequence)

拡大

さらに拡大

ch2:SPI1(Sequence)はRtosTimerを使って1msごとにSPIコマンドを発行している。ch1:SPI2(LCD)はmain関数のメイン・ループ内でLCDへのSPIコマンドを発行している。"rtos.h"をインクルードしているのでmain関数は最初のスレッドで動作し、優先順位の高いRtosTimerの割込み時間外でSPI信号を出力しているようだ。

シーケンス打ち込み用のグリッド画面のSPI信号



ch1:SPI2(LCD)

拡大

SPIコマンドの発行時間は約3.3ms。これを1ms以下にすればシーケンス再生中にシーケンス打ち込みのLCD表示ができるかな??st7565ライブラリの中身を見ると1バイトずつSPI信号を送っているの様なので、RtosTimerの割込みは効きそうなものだけど。

簡単な文字列表示も一旦画面をclearしているので(?)、同じ3.3msかかっているようだが。

シーケンス打ち込み用のハードウェアを作りながらもう少し調べる予定。

メモ:


SPIのCSのタイミング調整にwait_us()を使っているのでもう一度タイミングを見計らってちゃんとする。

ついでに消費電流をテスタで測ってみた。Nucleoは今回はUSBで給電しているので除外。プラス側が約120mA、マイナス側は約7mAとかなり差がある。電池電源にするとプラス側の電池の減りが速そうだ。