複数spiデバイス接続時の排他制御について


#1

Candy Pi Lite LTE と Raspberry Pi を用いてシステム開発を行っています。
接続するSPIデバイスが他にも有り、排他制御として、それぞれのデバイスのCS(CE)をコントロールする必要が有ると考えています。
参考となる資料、使用できるコマンドやAPIなどの情報が有りましたら、ご教授頂けますか?


#2

ご質問ありがとうございます。
RaspbianではSPIにおけるチップセレクトの制御をLinuxのカーネルにておこなっています。このため、ユーザーアプリケーションが排他制御を明示的に行うことはありません。代わりに、spidevのデバイスドライバーを使用してSPI通信を行うことができます。Python向けのspidevラッパーモジュールもありますのでお試しいただければと思います。他にもいくつかあるようですので、用途に合ったものをお選びいただければと思います。

なお、raspi-configのSPI設定を明示的にEnable/Disable設定しないようにしてください。CANDY Pi Liteをセットアップした状態ではすでにCE0のSPIデバイスを利用可能になっています。

$ ls /dev/spidev0.0 

とターミナルで実施していただき、/dev/spidev0.0と表示されるはずですので、ご確認ください。

CANDY Pi Liteは、SPI0 CE1を使用していますので、CE1へ接続しないようにご注意ください。また、Raspberry Pi B+以降で利用できるSPI1につきましては、一部GPIOピンがCANDY Pi Liteと重複しているため、ご利用いただけません。

こちらでは手元にあったAnalog Devices ADT7310(SPI接続)をRaspberry Pi3でつないだところ動作を確認できていますので、「SPI ADT7310 ラズパイ」の検索結果あたりで見つかるサンプルコードを参考までにご覧ください。


#3

本件に関して更に質問させてください。当方、Candy Pi Lite 3G と Raspberry Pi 3Bでシステム開発を行っています。更に申し上げると、ADコンバータ(MCP3008)で取得したデジタルデータをSPI0経由で取り込んでCandy Pi Lite 3Gでクラウドに挙げることを考えています。

上記を参考にしながら開発を行っているのですが、AD値が取得できません。併せて下記の現象が発生しています。対策/解決方法を教えていただけるようお願いします。

なお、Candy Pi Liteを接続していない状態ではAD値が取得できることを確認しています。

<問題現象>
①AD値が常に0で取得され、正しい値が得られない。

<その他の気になる現象>
②/dev/spidev0,1が無い。(見えない。)

pythonコードで制御しており、複雑な制御はしていないつもりです。Web上にある情報を拝借してコードを作成しました。SPI制御に関する主要な個所は次のように定義しています。

import spidev
spi = spidev.SpiDev()
spi.open(0, 0)

Candy Pi Liteはデフォルト状態で使っているのでCE1を使っていると考えています。従って、当方のコード、回路はCE0を使っています。CExによるスレーブデバイスの切り替え方法について注意することがあれば教えていただきたくお願いします。


#4

ご質問ありがとうございます。

以前こちらでSPI経由の温度センサーを使用した検証コードを見たところ、最初の方が以下のようになっていました。

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import spidev
import time

spi = spidev.SpiDev()
spi.open(0, 0)  # port 0,cs 0
spi.max_speed_hz = 1000000

ポイントは、最後のspi.max_speed_hz = 1000000の箇所となります。
Qiitaのこちらの投稿や、そこで言及されている[ 「カラー図解 最新 Raspberry Piで学ぶ電子工作」補足によると、このような指定が必要と記載されています。

ただ、CANDY Pi Lite 3Gを取り付けない場合はA/Dコンバーターが動作するとのことで、その辺りはこちらも状況がよくわかりませんが、最近のOSイメージをご利用の場合は、Linuxカーネルのバージョンはkernel 4.9.43以降となっているはずなので、上記リンク先の情報などをご覧いただいてお試しいただければと思います。

なお、言及されている「②/dev/spidev0,1が無い。(見えない。)」については、これは期待通りの動作で問題ありません。ドライバーが占有しているため使用できない状態になっています。


#5

お世話になっております。
返信が遅くなりすみませんでした。

頂いた情報でAD値が読み取れるようになりました。
勉強不足でした。

”②/dev/spidev0,1が無い。(見えない。)”の件は安心
しました。

どうもありがとうございました。今後もよろしくお
願いいたします。