spidevを使ってみた
先日Orange Pi Zeroでspidevが出てくるようにしたが、
前にZeroの2MBフラッシュと交換しようとして買ったSPIフラッシュ(macronix MX25L12835F)が手元にあって、今日SOP8のDIP変換ボードが届いたんで試してみることにした。
https://www.emcraft.com/stm32f769i-discovery-board/accessing-spi-devices-in-linux
↑にSPIフラッシュのIDを確認するコマンドを送るサンプルがあったんでそのまま使ってみた。
が、応答3byteだと思うんだがなんで6byteなんだろ。サンプルのソースコードでも6byteになってるが・・・
あとググって調べたところxfer(変数名がxferではなくtrの例が多かったが)の配列要素が1で同じとこにtx_bufとrx_bufを設定してる例が多かった。
これは要素数が1だとSPI_IOC_MESSAGE(2)のとこもSPI_IOC_MESSAGE(1)になるぽいんだが、
試しに要素数1でやってみたら、
TXの送信中もrx_bufに入る感じと思う。
だから配列の要素数を増やして分離すれば応答だけを取れる?
データシート見るとコマンドの送信がコマンド番号1byteに続いてダミー2byteとアドレス1byteを送信しているようにも見えるんだが、
xfer[0].len = 1;を3に(ダミーが1byteと勘違いした)んだが、応答ずれちゃいそうな気がするが結果が変わらなかった。
配列の要素が切り替わるときにCSが切り替わってたりするのか?
調べてもよくわからんかった。
改造の際にmemset(xfer, 0, sizeof xfer);を消してみたら、
設定しない構造体の要素は0に初期化しないとダメな感じ?
前にZeroの2MBフラッシュと交換しようとして買ったSPIフラッシュ(macronix MX25L12835F)が手元にあって、今日SOP8のDIP変換ボードが届いたんで試してみることにした。
https://www.emcraft.com/stm32f769i-discovery-board/accessing-spi-devices-in-linux
↑にSPIフラッシュのIDを確認するコマンドを送るサンプルがあったんでそのまま使ってみた。
# ./spi /dev/spidev1.0
response(7): c2 20 18 c2 20 18
データシートの9-5のとこに0x9Fの出力がc2 20 18って書いてあるんでデバイスは機能してるぽい。response(7): c2 20 18 c2 20 18
が、応答3byteだと思うんだがなんで6byteなんだろ。サンプルのソースコードでも6byteになってるが・・・
# ./spi /dev/spidev1.0
response(6): 18 c2 20 00 00 00
サンプルのソースコードからxfer[1].lenを3にしたら一応3byteになった。response(6): 18 c2 20 00 00 00
あとググって調べたところxfer(変数名がxferではなくtrの例が多かったが)の配列要素が1で同じとこにtx_bufとrx_bufを設定してる例が多かった。
これは要素数が1だとSPI_IOC_MESSAGE(2)のとこもSPI_IOC_MESSAGE(1)になるぽいんだが、
試しに要素数1でやってみたら、
# ./spi /dev/spidev1.0
response(6): 00 c2 20 18 c2 20
こんな感じで返ってきた。response(6): 00 c2 20 18 c2 20
TXの送信中もrx_bufに入る感じと思う。
だから配列の要素数を増やして分離すれば応答だけを取れる?
データシート見るとコマンドの送信がコマンド番号1byteに続いてダミー2byteとアドレス1byteを送信しているようにも見えるんだが、
xfer[0].len = 1;を3に(ダミーが1byteと勘違いした)んだが、応答ずれちゃいそうな気がするが結果が変わらなかった。
配列の要素が切り替わるときにCSが切り替わってたりするのか?
調べてもよくわからんかった。
改造の際にmemset(xfer, 0, sizeof xfer);を消してみたら、
# ./spi /dev/spidev1.0
SPI_IOC_MESSAGE: Invalid argument
で機能しなかった。SPI_IOC_MESSAGE: Invalid argument
設定しない構造体の要素は0に初期化しないとダメな感じ?
デバイス情報が返ってくるだけのコマンドを試したわけだが、SPIフラッシュなんでデータの読み書きができる。
データの読み込みはデータシート読んだところ、
READ(0x03)コマンドで、アドレス3byteを続けて送って、
指定アドレスから読み始めてCSが切り替わるまで出力が続くぽいように認識した。
書き込みは、
まずWREN(0x06)コマンドを送る必要がある。1byte送信するだけ。
そのあとPP(0x02)コマンドで、アドレス3byteを続けて送って、続けて256byteのデータを送る。
送り終わったらCSを上げる必要があり、CSが下がりっぱだとキャンセルされるぽい。
erase系のコマンドもあるが、このデバイスは使わなくても上書きできるっぽい?
そんなわけで読み書きも近日試したい。
SPIデバイスはCSなしで3ピンでもできるとか見たけど、SPIフラッシュはCS使うんだね。
Orange Pi Zeroの2MBフラッシュだとLinux入れれないから交換しようと思って買った16MBフラッシュだが、
内蔵wifiのXR819が使いこなせないのと、臨時に用意したrtl8188fuもなんか断線する・・・
wifiが良くないのと、3Dプリンタ用にするのにGPIOが不足するんでイマイチな感じだから2MBのままでいいかなと思ってる。
MX25L12835Fは2個買ったことだし1個を今回DIP変換ボードにのっけちゃったが、これはこれでデバイスのテストがブレッドボードでできてありと思う。
フラッシュならなら外部回路無しで機能するからSPI入門に丁度いい感じ。
もう1個あるMX25L12835Fはなにかストレージが必要なデバイス作ることになったときに使うことにする。
Orange Pi Zeroに不満があるが、デバイス作るようにESP32を買ってみようかと思ってる。
調べたところだと、まともに使う前から挫折中のSTM32と違って開発環境がCUIで公式ドキュメントもわかりやすそうな感じ。
STM32はGUI使う前提みたいな情報ばっかで難しい・・・
Orange Pi Zeroはまあ今回みたいにSPIとかI2Cとかのデバイスをテストするときに便利かなと。
XR819はどうにかしてほしいが・・・
データの読み込みはデータシート読んだところ、
READ(0x03)コマンドで、アドレス3byteを続けて送って、
指定アドレスから読み始めてCSが切り替わるまで出力が続くぽいように認識した。
書き込みは、
まずWREN(0x06)コマンドを送る必要がある。1byte送信するだけ。
そのあとPP(0x02)コマンドで、アドレス3byteを続けて送って、続けて256byteのデータを送る。
送り終わったらCSを上げる必要があり、CSが下がりっぱだとキャンセルされるぽい。
erase系のコマンドもあるが、このデバイスは使わなくても上書きできるっぽい?
そんなわけで読み書きも近日試したい。
SPIデバイスはCSなしで3ピンでもできるとか見たけど、SPIフラッシュはCS使うんだね。
Orange Pi Zeroの2MBフラッシュだとLinux入れれないから交換しようと思って買った16MBフラッシュだが、
内蔵wifiのXR819が使いこなせないのと、臨時に用意したrtl8188fuもなんか断線する・・・
wifiが良くないのと、3Dプリンタ用にするのにGPIOが不足するんでイマイチな感じだから2MBのままでいいかなと思ってる。
MX25L12835Fは2個買ったことだし1個を今回DIP変換ボードにのっけちゃったが、これはこれでデバイスのテストがブレッドボードでできてありと思う。
フラッシュならなら外部回路無しで機能するからSPI入門に丁度いい感じ。
もう1個あるMX25L12835Fはなにかストレージが必要なデバイス作ることになったときに使うことにする。
Orange Pi Zeroに不満があるが、デバイス作るようにESP32を買ってみようかと思ってる。
調べたところだと、まともに使う前から挫折中のSTM32と違って開発環境がCUIで公式ドキュメントもわかりやすそうな感じ。
STM32はGUI使う前提みたいな情報ばっかで難しい・・・
Orange Pi Zeroはまあ今回みたいにSPIとかI2Cとかのデバイスをテストするときに便利かなと。
XR819はどうにかしてほしいが・・・