Changes between Initial Version and Version 1 of PCAL9555APW


Ignore:
Timestamp:
Feb 15, 2016 11:35:30 PM (8 years ago)
Author:
kishida
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • PCAL9555APW

    v1 v1  
     1== I2C接続 GPIOエクスパンダ PCAL9555APWの使い方 ==
     2
     3[https://www.switch-science.com/catalog/2352/ PCAL9555APW I2C GPIOエクスパンダ]の
     4使い方の説明と、Aruduino向けのサンプルスケッチのページです。
     5
     6PCAL9555APWは、マイコンとI^2^C通信によって接続される、汎用I/Oポート拡張モジュールです。
     7
     8== 特徴 ==
     9
     10商品ページより一部抜粋したものを載せます。
     11
     12 * 動作電圧 1.65V~5.5V
     13 * 16ポート(8ポート×2グループ)の汎用I/Oのコントロールが可能
     14 * 各ポートは独立に入力・出力の設定が可能
     15 * I^2C^用プルアップ抵抗用のパターンあり(抵抗は未実装)
     16 * I^2^Cアドレス設定用はんだジャンパ×3あり
     17 * ICからの割り込み出力信号あり
     18
     19== 使い方 ==
     20
     21本製品はI^2^C通信によって制御されます。
     22下に実体配線図を示します。
     23
     24[[Image(PCAL9555APW-line.png,500)]]
     25
     26本製品にはI^2^C通信時のプルアップ用抵抗は実装されていません。
     27
     28ピンヘッダと合わせて各自で実装してください。
     29
     30プルアップ抵抗は基板裏面のR1とR2に1608サイズの10kΩ程度のチップ抵抗をはんだ付けしてください。
     31
     32また、ArduinoのWireライブラリを使用する場合は内蔵プルアップが有効になりますので、プルアップ抵抗を省略してもかまいません。
     33
     34=== 通信方法 ===
     35
     36デバイスアドレスは、本製品における標準ではArduino向けの7bit表記で0x20です。
     37
     38[[Image(image-1438315045486.JPG,500px)]]
     39
     40これは、基板上のジャンパA0,A1,A2を加工することで変更可能です。
     41販売時は3つともGND(0のシルク側)に接続されています。
     42
     43==== 送信 ====
     44
     45デバイスアドレスを送信した後にコマンドバイトを送信します。
     46このコマンドバイトは、後続のデータをどのレジスタが受け取るのかを決定づけます。
     47コマンドバイトは、連続したレジスタアドレスではないので少し注意が必要です。
     48
     49また、本デバイスには22個のレジスタが存在していますが、2個を1組とした11個の組として動作します。
     5011個のレジスタは後述する機能欄にて簡単に説明します。
     51
     52ある一つのレジスタにデータを送信した場合、次のデータはペアとなっているもう一つのレジスタに書き込まれます。
     53
     54例えば、OUTPUT port registor1(コマンドバイト:0x03)にまずデータを送信した場合、
     55次のデータは、同じOUTPUT port registorであるOUTPUT port registor0(コマンドバイト:0x02)に書き込まれます。
     56
     57データを書き込み続けると、同じレジスタ種内部でロールオーバーします。
     58
     59例えば、先述の例に追加して更にデータを書き込むと、書き込み対象のレジスタに相当するコマンドバイトは
     600x03->0x02->0x03->...という風にになります。
     61
     62==== 受信 ====
     63
     64読みだす際にも、同様にコマンドバイトを設定する必要があります。
     65
     66また、送信の時と同様に2個をペアとしたレジスタを読み込みます。
     67
     68例えば、INPUT port registor1(コマンドバイト:0x01)からデータを読んだ場合、
     69次は、同じINPUT port registorであるINPUT port registor0(コマンドバイト:0x00)のデータを読みます。
     70
     71データを読み込み続けると、同じレジスタ種内部でロールオーバーします。
     72
     73通信を行うときは以上の点について注意する必要があります。
     74
     75
     76
     77=== 機能 ===
     78
     79簡単な説明をします。詳細についてはデータシートを参照してください。
     80
     81==== INPUTレジスタ(0x00,0x01) ====
     82
     83ICのピンの状態が反映されます。これはピンの入出力設定に左右されません。
     84
     85==== OUTPUTレジスタ(0x02,0x03) ====
     86
     87Configrationレジスタによって出力に設定されたピンは、このレジスタの内容が反映されます。
     88このレジスタから読みだした内容は、設定内容であり、実際の出力状態ではありません。
     89
     90==== Polarity inversionレジスタ(0x04,0x05) ====
     91
     921にセットされたビットに対応するピンに関して、入力に設定されたピンの状態を反転してINPUTレジスタに反映させます。
     93
     94==== Configurationレジスタ(0x06,0x07) ====
     95
     961にセットされたビットに対応するピンをハイインピーダンス入力に設定します。
     970にセットした場合は出力です。
     98
     99==== Output drive strengthレジスタ(0x40,0x41,0x42,0x43) ====
     100
     1011ポートあたり2ビットの設定があります。出力に設定されたピンをドライブするために利用する回路の数を変更します。
     102
     103==== Input latchレジスタ(0x44,0x45) ====
     104
     105指定した入力ピンの状態変化を割り込みピンに反映させたり、INPUTレジスタに反映させたりします。
     106
     107==== Pull-up/pull-down enable(0x46,0x47) ====
     108
     109各ピンに対してプルアップ・プルダウンの有効・無効設定をします。
     110
     111==== Pull-up/pull-down selection(0x48,0x49) ====
     112
     113プルアップ・プルダウンが有効なピンに対して、プルアップかプルダウンを設定します。
     114
     115==== Interrupt maskレジスタ(0x4A,0x4B) ====
     116
     117割り込みを検出するかどうかの設定です。
     118
     119==== Interrupt statusレジスタ(0x4C,0x4D) ====
     120
     121割り込みが検出されたかどうかの状態を示します。
     122
     123==== Output port configurationレジスタ(0x4F) ====
     124
     125出力に設定されたポート(0,1ごと)に対して、オープンドレイン回路を利用するかプッシュプル回路を利用するかを設定します。
     126
     127== サンプルプログラム ==
     128
     129PORT0,1の状態をArduinoIDEのシリアルモニタに表示し続けます。
     130{{{
     131/*******************************************************************************
     132// SWITCHSCIENCE wiki -- http://trac.switch-science.com/
     133// PCAL9555APW Arduino Sample
     134*******************************************************************************/
     135#include <Wire.h>
     136
     137#define PCAL9555APW_ADDR 0x20 // in 7bit for Arduino
     138
     139#define INPUT_REG     0x00
     140#define OUTPUT_REG    0x02
     141#define INVERS_REG    0x04
     142#define CONFIG_REG    0x06
     143#define OUTPUT_DRIVE  0x40
     144#define INPUT_LATCH   0x44
     145#define PULLUP_EN     0x46
     146#define PULLUP_SEL    0x48
     147#define INTRRPT_MASK  0x4A
     148#define INTRRPT_STAT  0x4C
     149#define OUTPUT_CONFIG 0x4F
     150
     151
     152void datasend(int,int,int *,int);
     153void dataread(int,int,int *,int);
     154
     155void setup()
     156{
     157  Serial.begin(9600);
     158  Wire.begin();
     159}
     160
     161void loop()
     162{
     163  int port_input[2]; //入力状態を取得する変数
     164  dataread(PCAL9555APW_ADDR, INPUT_REG, port_input, 2);
     165  Serial.print("port0:");
     166  Serial.print(port_input[0], BIN);
     167  Serial.print("\tport1:");
     168  Serial.println(port_input[1], BIN);
     169}
     170
     171void datasend(int id,int reg,int *data,int datasize)
     172{
     173  Wire.beginTransmission(id);
     174  Wire.write(reg);
     175  for(int i=0;i<datasize;i++)
     176  {
     177    Wire.write(data[i]);
     178  }
     179  Wire.endTransmission();
     180}
     181
     182void dataread(int id,int reg,int *data,int datasize)
     183{
     184  Wire.beginTransmission(id);
     185  Wire.write(reg);
     186  Wire.endTransmission(false);
     187  Wire.requestFrom(id, datasize, false);
     188  for(int i=0;i<datasize;i++)
     189  {
     190    data[i] = Wire.read();
     191  }
     192  Wire.endTransmission(true);
     193}
     194}}}
     195