2019/03/29

ESP32(トラ技スペシャル IoT Express)でSDを動かす

自分が使っているESPボードは、トラ技スペシャルの付録の、IoT Expressボードで、SDカードが付いているので、これを動かしてみる。sdカード用ドライバが必要なようで、これをuPyCraftを使ってESPのフラッシュに送り込む。

https://github.com/micropython/micropython/blob/master/drivers/sdcard/sdcard.py

https://github.com/pycom/pycom-micropython-sigfox/blob/master/drivers/sdcard/sdcard.py

トラ技スペシャルより、SPIは1系統で、CSはGPIO5なので以下を指定
import machine, sdcard, os
sd = sdcard.SDCard(machine.SPI(1), machine.Pin(5))
しっかり怒られた。
>>> sd = sdcard.SDCard(machine.SPI(1), machine.Pin(5))
Traceback (most recent call last):
  File "", line 1, in 
  File "sdcard.py", line 54, in __init__
  File "sdcard.py", line 82, in init_card
OSError: no SD card
本ではもう少しオプションが付いていて、その通りに打ち込んだ。
spi = machine.SPI(1,baudrate=32000000,polarity=1,phase=0,sck=machine.Pin(18),mosi=machine.Pin(23),miso=machine.Pin(19))
すると、下記のように、動いているように思える。
>>> sdcard.SDCard(spi,machine.Pin(5))
 [0;32mI (1471856) gpio: GPIO[23]| InputEn: 0| OutputEn: 0| OpenDrain: 0| Pullup: 1| Pulldown: 0| Intr:0  [0m
 [0;32mI (1471856) gpio: GPIO[19]| InputEn: 0| OutputEn: 0| OpenDrain: 0| Pullup: 1| Pulldown: 0| Intr:0  [0m
 [0;32mI (1471866) gpio: GPIO[18]| InputEn: 0| OutputEn: 0| OpenDrain: 0| Pullup: 1| Pulldown: 0| Intr:0  [0m
 [0;32mI (1472166) gpio: GPIO[23]| InputEn: 0| OutputEn: 0| OpenDrain: 0| Pullup: 1| Pulldown: 0| Intr:0  [0m
 [0;32mI (1472166) gpio: GPIO[19]| InputEn: 0| OutputEn: 0| OpenDrain: 0| Pullup: 1| Pulldown: 0| Intr:0  [0m
 [0;32mI (1472176) gpio: GPIO[18]| InputEn: 0| OutputEn: 0| OpenDrain: 0| Pullup: 1| Pulldown: 0| Intr:0  [0m

>>> 

osライブラリのコマンドを使ってマウントが必要 https://dfram.hatenablog.jp/entry/2017/11/27/215940
>>> os.listdir()
['boot.py', 'blink.py', 'sdcard.py', 'sd']
>>> os.listdir('/sd')
[]
>>> 

>>> os.mount(sd,'/sd')
Traceback (most recent call last):
  File "", line 1, in 
OSError: [Errno 19] ENODEV


フォーラム等を見てみる。。
https://forum.pycom.io/category/21/micropython
https://forum.micropython.org/


https://github.com/micropython/micropython/issues/3816#issuecomment-392512522


上記コメントによると、0セクタを読んだ時にバッファの最後は0x55aa でないといけないとある。
ためしてみると。。以下の通り、SDのセクタ読み込みのレベルでは正しく動作しているようである。
buffer=bytearray(512)
sd.readblocks(0,buffer)
>>> "{:x}".format(buffer[510])
'55'
>>> "{:x}".format(buffer[511])
'aa'

試しに、BeagleBoneの起動SDならマウントできた(一体どのようなフォーマットだったのか)。よって、読めるかどうかは、マウントさせようとしているSDのファイルフォーマットによると思われる。

ラズパイ用の起動SDだとエラーになった。
>>> uos.mount(sd,'/sd')
Traceback (most recent call last):
  File "", line 1, in 
OSError: [Errno 1] EPERM
memo

https://github.com/loboris/MicroPython_ESP32_psRAM_LoBo

読める、読めないの違いは、SDカードのMBR(Master Boot Record)の扱いの差と思っているのですが、
そもそもたまたま読めるBeagleBone用のSDがどういう素性なのかわかっておらず。

https://jp.easeus.com/partition-manager/how-to-format-sd-card.html
https://qiita.com/mt08/items/c684d72345b591f4a27f

No comments:

Post a Comment