
■ MCP23017 I2C(SPI)バス 16ビット I/Oエキスパンダ ■ |
MCP23017はI2Cバスの2本の信号線、MCP23S17はSPIバスの4本の信号線を使用して、マイコンに16個のI/Oポートを拡張するICです。
各ポート毎に入力/出力の切り替えや内蔵プルアップ抵抗の設定が可能なので、マイコンのポートピンが足りないときや、外部にスイッチやLEDを増設する際に重宝します。
スレーブ・アドレスを8つから選択できるので、同じI2C(SPI)バスに8個のMCP23017 (MCP23S17)を接続できます。
○ 動作電源電圧 : 1.8V〜5.5V。
○ 低スタンバイ電流 : 1μA (最大)
○ 各出力ピンの最大シンク電流 : 25mA
○ 各出力ピンの最大ソース電流 : 25mA
○ I2Cインターフェイス (MCP23017) : 100kHz, 400kHz, 1.7MHz
○ SPI インターフェイス (MCP23S17) : 10MHz (最大)
○ 割り込み出力(INTA,INTB) : アクティブHigh、アクティブLow、オープンドレイン。
○ 3つのアドレスピンで、8つのスレーブ・アドレスを選択可能。
・操作方法の詳細は、日本語データシートに詳しく記載されています。
・一番難解な点は、「IOCON: I/Oエクスパンダ コンフィグレーション レジスタ」の設定です。
IOCON : I/Oエクスパンダ コンフィグレーション レジスタ |
bit7 |
bit6 |
bit5 |
bit4 |
bit3 |
bit2 |
bit1 |
bit0 |
BANK |
MIRROR |
SEQOP |
DISSLW |
HAEN |
ODR |
INTPOL |
- |
初期値は[0000_0000] |
bit7 |
BANK: レジスタのアドレス指定を制御する
1 = 各ポートに関連付けられているレジスタが別々のバンクに分かれる
0 = レジスタが全部同じバンクに入れられる( アドレスが連続した状態) |
bit6 |
MIRROR: INT ピンのMirror ビット
1 = INT ピン同士を内部接続する
0 = INT ピン同士を接続しない。INTAはPORTAに、INTBはPORTBに関連付けられる。 |
bit5 |
SEQOP: シーケンシャル動作モードビット
1 = シーケンシャル動作が無効になり、アドレスポインタはインクリメントされない
0 = シーケンシャル動作が有効になり、アドレスポインタがインクリメントされる |
bit4 |
DISSLW: SDA 出力のスルーレート制御ビット
1 = スルーレートは無効
0 = スルーレートは有効 |
bit3 |
HAEN: ハードウェア アドレス イネーブル ビット(MCP23S17 のみ) (Note 1)
1 = MCP23S17のアドレスピンを有効にする
0 = MCP23S17のアドレスピンを無効にする |
bit2 |
ODR: INT ピンをオープンドレイン出力として設定する
1 = オープンドレイン出力(INTPOL ビットよりも優先される)
0 = アクティブ ドライバ出力( 極性はINTPOL ビットで設定する) |
bit1 |
INTPOL: このビットでINT 出力ピンの極性を設定する
1 = アクティブHigh
0 = アクティブLow |
bit0 |
未実装: 「0」として読み出し |
Note 1: MCP23017 はアドレスピンが常に有効です。
・単純な拡張I/Oとして使用する場合は、初期値[0000_0000]のままでOKです。
・I2CやSPIのコマンドを連続して送るプログラムによっては、bit7の[BANK]とbit5の
[SEQOP]を使用目的によって変更することで、プログラムの簡素化が図れます。
・bit7の[BANK]は、各レジスターの並び方を、機能するレジスター順かGPIOAまたは
GPIOBごとに配置するかを変更できます。
・bit5の[SEQOP]は、同じポートの内容を連続して変化させる場合に、アクセスした
レジスターのアドレスを自動的に加算しないように設定できます。
・その他のビットの詳細は、データシートを参照して下さい。
・「IODIR: I/O方向レジスター」は、GPIOAまたはGPIOBの各ポートを、ビットごとに入力
または出力に設定します。
・「GPPU: GPIOプルアップ抵抗レジスター」は、入力に設定したポートに対して、
内蔵された100KΩの抵抗でプルアップする設定ができます。
・「GPIOAまたはGPIOB: 汎用I/Oポートレジスター」によって、ポートピンに対する
入力または出力を行います。
・その他、「IPOL: 入力極性」や割り込み関連の操作は、データシートを参照して下さい。

MCP23017 I2C G-LCD アダプターのテスト |
・Amazonや中国通販(AliExpress)で入手できる、MCP23017 I2C グラフィックLCD アダプター
(完成基板)のテストです。
・グラフィックLCDは多くのポートピンを使用しますが、I2Cの2本のポートピンで表示が可能になります。
・ただし、描画速度は極端に遅くなります。
・秋月電子のTG12864B-02WWBV等の、20ピンで横1列のグラフィックLCDモジュールの裏面に、
直接ハンダ付けで実装できます。
・I2Cバスのプルアップ抵抗器やスレーブアドレス選択用のハンダ・ジャンパーも搭載されているので、
電源とマイコンから2つのポートを接続するだけで、グラフィックLCDの表示が可能です。
・アダプターのI2CアドレスA0,A1,A2を変えることで、同じI2Cバス上に8台までグラフィックLCDを
接続することも可能です。
(スレーブアドレスのA0,A1,A2は、それぞれのアダプターで選択を変えて下さい)
(並列接続した際に、ボード上のI2Cバスのプルアップ抵抗値が、2KΩ程度より低くならないように
注意して下さい)
・LCDによってバックライトLEDの電流制限抵抗器が必要な場合は、LEDのジャンパーピンを外して
抵抗器を取り付けます。
・テストはArduinoボードを使用していますが、各種AVRマイコン回路に接続できます。
注意!
この図面を使用した、いかなる損害にも責任を負いません。
|
・接続するLCDが1台の場合は、 「MCP23017 I2C G-LCD アダプターの設定」ルーチンをそのまま
使用可能です。
・2台以上のLCDを使用する場合は、下記の行を追加して下さい。
Const Mcp23017_multi = 1 '複数G-LCDモードにする。
Dim Glcd_address As Byte : Glcd_address = &H40 'MCP23017のスレーブ・アドレス。
(&H40,&H42,&H44,&H46,&H48,&H4A,&H4C,&H4E)
・同時に、それぞれのスレーブアドレスで下記の初期化を実行して下さい。
Glcd_address = &H42 '2台目のG-LCDを指定する。
!CALL _set_display 'グラフィックLCDを初期化する。
・各LCDの表示命令の前に「Glcd_address = &H42」行でアドレスを指定して、表示するLCDを
選択して下さい。
・I2Cバスは、ポートピンを自由に選択できるソフトウェアI2Cと、AVRの専用ピンを使用する
ハードウェアTWIが選択できます。
・「Const I2c_select = 1」行で、0:ソフトウェアI2C と 1:TWI で指定します。
・ソフトウェアI2Cの場合は、使用するSCLとSDAピンを指定して下さい。
・ハードウェアTWIの場合は、各AVRの専用ピン名を記述して下さい。
・ATtinyチップに搭載されているUSIを使用する場合は、別途USI用のプログラムを参照して下さい。
・XMEGA・XTINYチップを使用する場合は、別途XMEGA・XTINY用のプログラムを参照して下さい。
・バックライトを制御する場合は、下記の設定を使用して下さい。
Backlight = 0 : Glcdcmd &H3E , 1 : Glcdcmd &H3E , 2 'LCD画面とバックライトをオフにする。
Backlight = 1 : Glcdcmd &H3E , 1 : Glcdcmd &H3E , 2 'バックライトをオンにする。
Backlight = 1 : Glcdcmd &H3F , 1 : Glcdcmd &H3F , 2 'LCD画面とバックライトをオンにする。
・[glcdKS108_I2C_MCP23017.lib] ライブラリを、
C:\Program Files\MCS Electronics\BASCOM-AVR\LIB\ に保存してからコンパイルして下さい。
・[font8x8.font] と [KS108.bgf] ファイルを、下記のテストプログラムと同じフォルダーに保存して下さい。
複数LCDのテスト。
USIのテスト。
XMEGA・XTINY 用のテスト。(BASCOM-AVR(製品版)とXTINY Add Onが必要です)
注意! 著作権は放棄しておりませんので、販売や配布目的での使用は絶対にしないで下さい。 (記事の無断転載を除き、個人での使用は可能です。 改変、自作品の掲載、リンクもご自由に。)
|
|
|