SPI通信で遅れて1ビットずれてしまい、1日悩んだ。SPI通信の仕様をちゃんと読まなかったからだ。
今回はちゃんと読んで理解した内容を忘れないようにメモを残しておく。
覚えておくこと。
・マスター・スレーブ間の通信である。(当たり前)
・配線は5本、CLK、MISO、MOSI、CE、GND
・MISO(Master In Slave Out)、
・MOSI(Master Out Slave In)
スレーブ側はIC仕様によって異なるので、例としてL6470の場合、
→立上りで入力(MISO)
→立下りで出力(MOSI)
という仕様である。
これを端子名 MISO、MOSIと書いた部分に注目!
MasterとSlaveは入出力が反対になるのがSPIの特徴である。
ディジーチェーン2つ繋いだ構成でSPI通信を行うとき
4バイト送ったら最初の2バイトがマスターに届けられてないといけない。
これを考えると、クロックのタイミングは
MISO、MOSI MISO、MOSI MISO、MOSI MISO、MOSI、、、、
こういう順番と
MOSI、MISO、 MOSI、MISO、 MOSI、MISO、 MOSI、MISO、、、、
どっちが正しいか。
考えれば最後に出力になっていないと、前者だと1ビット欠落してしまう状態になる。(←ここではまった)
要するにCLKの論理は、スレーブの仕様によって決まって、
マスターのデータ取り込みタイミングは、MISOになるように設定する。
L6470の例だと、
・データを取り込み(MISO)は立ち上がり
・MISOが最後にした場合、CLKエッジはHIGHで終わるので負論理(^CLK)
波形が乗っているサイトの見てみると、
https://www.diolan.com/dln_doc/spi-transfer-modes.html
CPOL=CLKエッジ最後の状態 ・・・ HIGHなので CPOL=1
CPHA=CLK取り込み開始状態 ・・・ HIGH(HIGH→LOW)なのでCPHA=1
Mode=|CPOL|CPHA|のビットアサインなので、
Mode=11 =(3) Mode=3
0 件のコメント:
コメントを投稿