• 検索結果がありません。

I/O エクスパンダー(PCF8574)を使用する

ドキュメント内 Armadillo標準ガイド ハードウェア拡張編 (ページ 32-36)

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 データバイト

ドキュメント内 Armadillo標準ガイド ハードウェア拡張編 (ページ 32-36)

関連したドキュメント