10.picocalcのSDカードが遅いのはbaudrateの設定が悪いのを対策
jpgデータの読み込みが遅いんで何とかしたい。
とりあえず sdcard のドライバを確認すると、sdcard.py というmicropythonで広く使われてるソースだった。問題ないはずのコード。じゃぁbaudrateの設定を変えるだけで解決だね。と1MHzから5MHzに変えても500kHzに落としても性能は同じ。おや?
もしかしてSPIドライバの問題?と思ったがSPIドライバも標準提供品を使ってる。何もおかしいところがない。
変だな。Picoの標準品のドライバ使って性能が出ないなら大問題だろ?誰も困ってないの?おかしいだろ?
googleさんに相談したら、よくわからない高速版 sdcard.py とやらも見つけてくれた。でも改造箇所が多すぎてかなり怖い。試すと確かにちょっとは速いのだが...
あれ?ソースをよく見ると関数の呼び出し方が picocalcのドライバとちょっと違ってる。もしや...
お前が犯人だ!!
PicoCalcのSDカード初期化のためのラッパー関数が犯人。
引数で設定した baurate を sdcard.py に渡す必要があるのだが...
self.sd = sdcard.SDCard(
machine.SPI(self.spi_bus, baudrate=self.baudrate, polarity=0, phase=0,
sck=machine.Pin(self.sck_pin),
mosi=machine.Pin(self.mosi_pin),
miso=machine.Pin(self.miso_pin)),
machine.Pin(self.cs_pin)
)
一見良さそうに見えるじゃろ?それが罠じゃ
指定した baudrate をSPI の初期化時の baudrate に設定している。
しかし sdcard.py は内部でSPIを再設定しているので、sdcard.SDCard の引数として baudrate を設定すべき
self.sd = sdcard.SDCard(
machine.SPI(self.spi_bus, baudrate=self.baudrate, polarity=0, phase=0,
sck=machine.Pin(self.sck_pin),
mosi=machine.Pin(self.mosi_pin),
miso=machine.Pin(self.miso_pin)),
machine.Pin(self.cs_pin),
baudrate=self.baudrate
)
原因判明までエラい遠回りした
ボーレートを下げても現象が変わらない時点で気が付くべきだった。
ソース一式はこちら
https://github.com/bjsoftab4/PicoCalc-micropython-driver