5. I 2 C デバイスの活用
5.3. I/O エクスパンダー(PCF8574)を使用する
ここでは、I2C バスに I/O エクスパンダーを接続する方法を紹介します。
使用するデバイスは以下のとおりです。
• PCF8574(NXP Semiconductors 製)
今回使用する PCF8574 は、以下の特長を持ちます。
• 単電源動作(2.5~6V)
• I2C 接続(スタンダードモード)
• アドレス 0x20~0x27(同一バスに 8 つ接続可能)
• GPIO 数 8
Armadillo 標準ガイド ハードウェア拡張編 I2C デバイスの活用
• 入出力方向の設定不要
• 入力変化割り込み機能あり
5.3.1. 接続方法
Armadillo-640 との接続を示します。Armadillo-640 の CON14 から出ている I2C4 に PCF8574 を 接続します。アドレスを指定する A0~A2 は全て GND に接続しておきます[6]。例として、スイッチや LED を接続しています。スイッチはオンで Low 入力になるようにし、LED は Low 出力で点灯するよう にします。
図 5.19 I2C 接続 I/O エクスパンダー回路図
5.3.2. 対応カーネルイメージの作成
PCF8574 のドライバを有効にした Linux カーネルと、DTB を作成します。
標準状態のカーネルのソースコードを元に変更する手順は次の通りです。
1. Device Tree の編集
2. カーネルコンフィギュレーションでのデバイスドライバの有効化 3. カーネルと DTB をビルドし Armadillo に書き込み
はじめに Device Tree を作成します。ファイル名は arch/arm/boot/dts/armadillo-640-i2c4.dtsi です(「1.3. サンプルソースコード」のページからダウンロードできます)。
[6]複数のスレーブをバスに接続する場合は、A0~A2 の設定を変えてアドレスが重複しないようにしてください。
Armadillo 標準ガイド ハードウェア拡張編 I2C デバイスの活用
&iomuxc {
pinctrl_i2c4: i2c4grp { fsl,pins= <
MX6UL_PAD_UART2_TX_DATA__I2C4_SCL 0x40010808 MX6UL_PAD_UART2_RX_DATA__I2C4_SDA 0x40010808 >;
};
};
&i2c4 {
status = "okay";
clock-frequency = <50000>;
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_i2c4>;
pcf8574@20 { //
#address-cells = <2>;
#size-cells = <0>;
compatible = "nxp,pcf8574";
reg = <0x20>; //
gpio-controller;
#gpio-cells = <2>;
};
};
図 5.20 armadillo-640-i2c4.dtsi デバイス名@スレーブアドレス(16 進表記)
スレーブアドレス(16 進表記)
さきほどのファイルへの include を arch/arm/boot/dts/armadillo-640.dts に追加してください。
#include "armadillo-640-lcd70ext-l00.dtsi"
#endif
#include "armadillo-640-i2c4.dtsi" //追加行 / {
model = "Atmark Techno Armadillo-640";
図 5.21 armadillo-640.dts
続いて「イメージをカスタマイズする」と同様に menuconfig を使用してカーネルコンフィギュレー ションを変更します。
[ATDE ~/linux-4.14-at[version]]$ make ARCH=arm menuconfig
図 5.22 menuconfig の実行
Device Drivers --->
-*- GPIO Support --->
Armadillo 標準ガイド ハードウェア拡張編 I2C デバイスの活用
I2C GPIO expanders --->
[*] PCF857x, PCA{85,96}7x, and MAX732[89] I2C GPIO expanders ← 有効にする
図 5.23 menuconfig
変更を加え、カーネルコンフィギュレーションを確定してください。
以上の変更後、「イメージをカスタマイズする」と同様にカーネルと DTB をビルドし、Armadillo に 書き込んでください。
5.3.3. 使用例
まず、GPIO クラスディレクトリを作成します。
[armadillo ~]# ls /sys/class/gpio/
export gpiochip128 gpiochip504 gpiochip96 gpiochip0 gpiochip32 gpiochip64 unexport [armadillo ~]# echo 504 > /sys/class/gpio/export [armadillo ~]# echo 505 > /sys/class/gpio/export [armadillo ~]# echo 506 > /sys/class/gpio/export [armadillo ~]# echo 507 > /sys/class/gpio/export [armadillo ~]# echo 508 > /sys/class/gpio/export [armadillo ~]# echo 509 > /sys/class/gpio/export [armadillo ~]# echo 510 > /sys/class/gpio/export [armadillo ~]# echo 511 > /sys/class/gpio/export [armadillo ~]# ls /sys/class/gpio/
export gpio506 gpio509 gpiochip0 gpiochip504 unexport ←gpio504~gpio511 が作成された gpio504 gpio507 gpio510 gpiochip128 gpiochip64
gpio505 gpio508 gpio511 gpiochip32 gpiochip96 [armadillo ~]# cat /sys/class/gpio/gpio504/direction
in ←初期状態では入力
図 5.24 GPIO クラスディレクトリ作成コマンド実行例 次に、実際に PCF8574 の GPIO にアクセスし、LED を点灯させてみます。
[armadillo ~]# cat /sys/class/gpio/gpio504/direction
in ←初期状態では入力
[armadillo ~]# echo high > /sys/class/gpio/gpio504/direction ←high に設定しても LED1 は消灯のまま [armadillo ~]# echo low > /sys/class/gpio/gpio504/direction ←low に設定すると LED1 が点灯 [armadillo ~]# echo 1 > /sys/class/gpio/gpio504/value ←1 に設定すると LED1 が消灯 [armadillo ~]# echo 0 > /sys/class/gpio/gpio504/value ←0 に設定すると LED1 が点灯
図 5.25 出力コマンド実行例 最後に、スイッチの状態を取得してみます。
[armadillo ~]# cat /sys/class/gpio/gpio505/value ←スイッチが ON の時に実行 0
Armadillo 標準ガイド ハードウェア拡張編 I2C デバイスの活用
[armadillo ~]# cat /sys/class/gpio/gpio505/value ←スイッチが OFF の時に実行 1
図 5.26 入力コマンド実行例
5.3.4. プロトコル
PCF8574 のデータには 2 種類あります。
表 5.3 PCF8574 のデータバイト
データ名 データ方向
GPIO 出力値 W GPIO 入力値 R
GPIO 出力値の書き込みは以下のように行います。
S Address byte A GPIO output data A P
図 5.27 PCF8574 通信フォーマット(書き込み) GPIO 入力値の読み出しは以下のように行います。
S Address byte A GPIO input data N P
図 5.28 PCF8574 通信フォーマット(読み出し)
PCF8574 のアドレスバイトのフォーマットを示します。7 ビットアドレスの上位 4 ビットは固定で 0100 です。下位 3 ビットは対応するピン(A2~A0)で設定可能です。今回の例では全て GND に接続し たので、A2~A0 は全て 0 になります。
R/W
0 1 0 0 A2 A1 A0
MSB LSB
図 5.29 PCF8574 アドレスバイト
GPIO 出力値、GPIO 入力値のフォーマットを示します。各ビットはピン P7~P0 にそのまま対応しま す。GPIO 出力値で 0 を書き込むと、Low 出力になり、1 を書き込むと、High 出力になります。High 出力は弱いプルアップとなっており、入力も兼ねています。そのため、「図 5.19. I2C 接続 I/O エクスパ ンダー回路図」のようにスイッチはオンで Low 入力になるようにし、LED は Low 出力で点灯するよう にします。
P0
P7 P6 P5 P4 P3 P2 P1
MSB LSB
図 5.30 PCF8574 データバイト