Howto

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

アナログ・デバイセズ製の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を使用した別の通信が発生するとデータを読み出せない可能性があるため)