警告メッセージ

Howtoは、Armadilloシリーズを有効に活用するための参考資料です。使用ソフトウェアのバージョンなど諸条件の差異によって、記載内容と実際の動作が異なる場合があります。また、すべての機能検証や長期の動作試験を行ったものではありませんので、必ずご使用目的に適合した検証・試験を行ってください。

Howto : SPI接続のADC(アナログ・デバイセズ AD7988)を使用する

対象製品: Armadillo-640

アナログ・デバイセズ製のADC「AD7988」をArmadillo-640のCON9に接続する方法を紹介します。
Armadilloからの制御にはECSPI1とGPIOを使用します。

回路構成

使うもの

以下を使用します。

  • Armadillo-640
  • AD7988 (AD7988-1、AD7988-5どちらでも可)
  • AD7988の基板・電源・配線等

接続方法

以下の通りに接続します。

Armadillo
(CON9)
ピンの機能 AD7988 ピンの機能
15 ECSPI1_SCLK 8 SCK
16 GPIO3_IO26 6 CNV
18 ECSPI1_MISO 7 SDO
19 GND 5 GND
20 VCC_3.3V 10 VIO
20 VCC_3.3V 9 SDI

ECSPI1_MOSIは接続しません。
AD7988の入力側の回路はデータシート等を参考にしてください。

ArmadilloのLinuxカーネルとDTBをビルド

ここでは「Armadillo-640 製品マニュアル」に倣い、Linuxカーネルのソースコードのディレクトリ名はlinux-v4.14-at[version]と表します。
各コマンドはlinux-v4.14-at[version]ディレクトリで開始してください。

ドライバの追加・デバイスの登録

以下のコマンドでAD7988.patchをダウンロードしLinux カーネルディレクトリでパッチをあててください。
patchコマンドでエラーが出ず、lsコマンドで4つのファイルすべてがファイルの更新日時=patch実行日時になっていれば成功です。

[PC ~/linux-v4.14-at[version]]$ wget https://download.atmark-techno.com/misc/howto_armadillo-640-SPI-ADC-AD7988/AD7988.patch
[PC ~/linux-v4.14-at[version]]$ patch -p 1 < AD7988.patch 
patching file arch/arm/boot/dts/armadillo-640.dts
patching file drivers/iio/adc/ad7988.c
patching file drivers/iio/adc/Kconfig
patching file drivers/iio/adc/Makefile
[PC ~/linux-v4.14-at[version]]$ ls -l drivers/iio/adc/Kconfig drivers/iio/adc/Makefile arch/arm/boot/dts/armadillo-640.dts drivers/iio/adc/ad7988.c
-rw-rw-r-- 1 atmark atmark  7573 [patch実行日時] arch/arm/boot/dts/armadillo-640.dts
-rw-rw-r-- 1 atmark atmark 27351 [patch実行日時] drivers/iio/adc/Kconfig
-rw-rw-r-- 1 atmark atmark  3405 [patch実行日時] drivers/iio/adc/Makefile
-rw-rw-r-- 1 atmark atmark  6346 [patch実行日時] drivers/iio/adc/AD7988.c

ドライバの有効化

menuconfigでLinuxカーネルの以下のコンフィギュレーションを有効にしてください。
(Armadillo-640 製品マニュアル内「19.2. イメージをカスタマイズする」を参照)

[PC ~/linux-v4.14-at[version]]$ make ARCH=arm menuconfig
Device Drivers  --->  
  [*] SPI support  --->                     ← 有効化  
    [*]   Freescale i.MX SPI controllers    ← 有効化  

Device Drivers  --->  
  [*] Industrial I/O support  --->          ← 有効化  
    Analog to digital converters  --->  
      [*] Analog Devices AD7988 ADC driver  ← 有効化  

ビルド/書き込み

以上の設定が終わりましたら、uImageとarmadillo-640.dtbをビルドしてください。
その後、2つのファイルをArmadilloに書き込んでください。
(Armadillo-640 製品マニュアル内「19.2. イメージをカスタマイズする」を参照)

[PC ~/linux-v4.14-at[version]]$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- 
LOADADDR=0x82000000 uImage          ←「~uImage」まで1つのコマンドです
[PC ~/linux-v4.14-at[version]]$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-
[PC ~/linux-v4.14-at[version]]$ ls arch/arm/boot/uImage
arch/arm/boot/uImage
[PC ~/linux-v4.14-at[version]]$ ls arch/arm/boot/dts/armadillo-640.dtb
arch/arm/boot/dts/armadillo-640.dtb

確認

さきほど書き込んだLinuxカーネルで起動すると/sys/bus/iio/devices/ディレクトリ下に、
新しくiio\:deviceX(Xには数字が入ります)ディレクトリが作成されています。

以下のコマンドで値を読むことができます。

[armadillo ~]# cat /sys/bus/iio/devices/iio\:device0/in_voltage0_raw
12345     ← 0~65535の数値が表示されます

AD7988のVREFが5Vの場合、以下の通りに換算できます。
in_voltage0_raw × 5 ÷ 65536 = 入力電圧(V)

in_voltage0_raw 入力電圧(V)
0 0.000
32768 2.500
65535 4.999

その他の設定

Armadilloの/sys/bus/iio/devices/iio\:device0/in_voltage_scaleを参照する場合は、
arch/arm/boot/dts/armadillo-640.dts内のregulator-min-microvoltとregulator-max-microvoltの値をAD7988のREF端子の電圧(μV)に合わせてください。

以下のコマンドで値を読むことができます。(1LSBあたりの入力電圧(mV)になっています。)

[armadillo ~]# cat /sys/bus/iio/devices/iio\:device0/in_voltage_scale
0.076293945     ← 5Vの場合は約0.076mV

正しく合わせると、in_voltage0_raw ÷ in_voltage_scaleでAD7988の入力電圧(mV)を計算することができます。

注意事項

このドライバは「CS MODE, 3-WIRE」のみ対応します。(AD7988データシートを参照)
また、同じSPIのバスにAD7988以外を接続することは想定していません。
(AD7988のCNVをLにしてから変換結果を読み出すまでに、ECSPI1を使用した別の通信が発生するとデータを読み出せない可能性があるため)

カテゴリ: