質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.51%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

Q&A

解決済

2回答

4545閲覧

CSピンを使わずにwiringPiを用いてSPI通信を行いたい

Ryupe

総合スコア426

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

0グッド

1クリップ

投稿2017/12/07 14:22

#現在のコード
以下、抜粋

python

1import wiringpi2 as wp 2import struct 3 4L6470_SPI_SPEED = 1000000 #通信速度1MHz 5 6CS_PIN = 5 #BCMで指定 7 8def L6470_write(channel, data): #ドライバーに1Byteの情報を送る関数 9 bydata = struct.pack("B", data) #16進数の'data'を2進数の'bydata'に変換 10 wp.wiringPiSPIDataRW(channel, bydata) #ドライバに送信 11 12if __name__=="__main__": 13 speed = 0 14 15 wp.wiringPiSetupGpio() 16 wp.wiringPiSPISetup (0, L6470_SPI_SPEED) #CS0ピンと1MHzで通信開始 <= おそらくこの書き方が変わるか 17 #別の記法がある。 18 print("***** Start program *****") 19 20 #NOP(何もしない)命令 21 L6470_write(0, 0x00) 22 L6470_write(0, 0x00) 23 L6470_write(0, 0x00) 24 L6470_write(0, 0x00) 25 #デバイスのリセット 26 L6470_write(0, 0xC0) 27 print("***** OK RESET *****")

#やりたいこと

raspberrypiの{MISO, MOSI, SCLK}ピンは使用するが、CSピンはGPIOピンに置き換えをしたうえでコーディングをしたい。その場合、上のコードの「wp.wiringPiSPISetup (0, L6470_SPI_SPEED)」の部分を書き換えるだろうが、どのように書き換えたらいいのかわからない。

また、wiringPiのライブラリにより、送信する際は1ByteごとにCSピンを下げたり上げたりして通信対象を確定しているように思えるが、GPIOとなるとその辺りの処理はどうやるのか??

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

Ryupeさん、

使用するデバイスは、L6470っぽいので、そのL6470のデータシートの38ページ、Serial Interfaceの説明とFigure 17. SPI timings diagramあたりを見ると、CSの動作としては

The communication starts when CS is forced low.

  • CSをLOWにして通信開始。(= アクティブLOW)

After each byte transmission the CS input must be raised and be kept high for at least tdisCS in order to allow the device to decode the received command and put the return value into the SHIFT register.

  • 1バイト転送毎に、CSは、少なくともtdisCS時間(>800ns)、HIGHを保持すること。その間にデバイスが受信コマンドをデコードして、シフトレジスタに返す値をセットする。

  • あと、CSが下りてから、CK開始まで、tsetCS(Chip select setup time) > 350ns。

ということなので、CSのGPIO制御としては、

  • 1バイト転送(=wiringPiSPIDataRWの呼び出し)前にCSピンををLOW、後にHIGHにする。
  • もしかしたら、CSの設定後にWait(1msくらい)が必要かも?

あとは、wiringPiのGPIO制御に従って、↓のようにしてみるのはどうでしょうか

py

1import time # sleepを使う。 2 3 4#使用するCS pinを出力設定にする 5wp.pinMode(PIN_CS_1, 1) 6wp.pinMode(PIN_CS_2, 1) 7wp.pinMode(PIN_CS_3, 1) 8# 未使用時、初期設定、出力HIGH 9wp.digitalWrite(PIN_CS_1, 1) 10wp.digitalWrite(PIN_CS_2, 1) 11wp.digitalWrite(PIN_CS_3, 1) 12... 13 14 15def L6470_write_with_cs_control(channel, data, pin_cs): 16 bydata = struct.pack("B", data) 17 wp.digitalWrite(pin_cs, 0) # LOW 出力 18 time.sleep(0.001) # 1msウェイト 19 wp.wiringPiSPIDataRW(channel, bydata) 20 wp.digitalWrite(pin_cs, 1) # HIGH 出力 21 time.sleep(0.001) # 1msウェイト 22 23...

投稿2017/12/08 00:51

編集2017/12/08 01:54
mt08

総合スコア1825

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Ryupe

2017/12/08 01:47

回答ありがとうございます。 なんとなくこうかなとコードを書き換えてみたらうまくいっていました。 mt08さんの回答を見て方向性が合っていてホッとしました。 time.sleepを使用して遅延させる部分に関しては気づかなかったのでコードを修正させてもらいました。 ありがとうございます。
guest

0

書き換えるだろうが

書き換えません

送信する際は1ByteごとにCSピンを下げたり上げたりして通信対象を確定しているように思えるが、GPIOとなるとその辺りの処理はどうやるのか??

1ByteごとにCSとして使うGPIOを下げたり上げたりします。

投稿2017/12/07 23:36

ozwk

総合スコア13512

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Ryupe

2017/12/08 01:49

回答ありがとうございます。 ozwkさんの回答を参考にコードを書き換えてみたところ動作確認が出来ました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.51%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問