妄想の話は、実際に動作確認した話ではないので、ご注意を。
はじめに
MSX用IDEインターフェースのBEER202には8255というチップが搭載されており、パラレルインターフェースとして利用することができます。
さらに部品を追加してI2C通信ができるようになると、安価に入手可能なセンサ類を接続することが可能になります。
Copilotと対話しながら、環境構築を行いました。
I2CブリッジICの選定
主に二種類あるようです。
- PCA9564(NXP):I²Cバスコントローラ。8ビットパラレルインターフェースを持ち、MSXのI/Oポートから制御可能
- PCF8584(古いがMSX世代に近い):同様にI²Cバスをパラレルで制御
検索すると、PCF8584のDIP版が入手できるようです。
BEER202との接続
20ピン2列のコネクタへのPCF8584の接続を想定しています。
以下のような接続になるかと思います。
| JP2信号 | PCF8584ピン | 役割 |
|---|---|---|
| HD0–HD7 | D0–D7 | データバス |
| HA0–HA2 | A0–A2 | レジスタ選択 |
| HCS | /CS | チップセレクト |
| HWR | WR | 書き込み制御 |
| HRD | RD | 読み出し制御 |
| RESET | RESET | リセット |
| +5V/GND | VCC/GND | 電源 |
PCF8584がセンサ類とつながる端子
- SCL → 外部I²Cバス(プルアップ抵抗は4.7kΩ)
- SDA → 外部I²Cバス(プルアップ抵抗は4.7kΩ)
初期化例(クロック設定 + I²Cモード有効)
前提
- HD0–HD7 → データバス
- HA0–HA2 → レジスタ選択
- HCS, HWR, HRD → 制御信号
- PCF8584レジスタ番号:
- 0 = DR(データ)
- 1 = CR(制御)
- 2 = SR(ステータス)
10 OUT &H40, 128 ' 8255モード設定: 全ポート出力
20 REM クロック設定 (CLKレジスタ = 0)
30 OUT &H41, 0 ' HA0-HA2 = 0 (CLKレジスタ)
40 OUT &H40, &H1C ' HD0-HD7 = クロック値 (100kHz)
50 OUT &H42, 1 ' HCS=1, HWR=1
60 OUT &H42, 0 ' WR解除
70 REM モード設定 (CRレジスタ = 1)
80 OUT &H41, 1 ' HA0-HA2 = 1 (CRレジスタ)
90 OUT &H40, &H80 ' HD0-HD7 = I²Cエンジン有効
100 OUT &H42, 1
110 OUT &H42, 0
1バイト送信例(スレーブアドレス + データ)
120 REM スレーブアドレス送信 (例: 0xA0)
130 OUT &H41, 0 ' HA0-HA2 = 0 (DRレジスタ)
140 OUT &H40, &HA0 ' HD0-HD7 = スレーブアドレス
150 OUT &H42, 1
160 OUT &H42, 0
170 REM スタート条件発行
180 OUT &H41, 1 ' CRレジスタ
190 OUT &H40, &H90 ' STA + WRビット
200 OUT &H42, 1
210 OUT &H42, 0
220 REM データ送信 (例: 0x55)
230 OUT &H41, 0
240 OUT &H40, &H55
250 OUT &H42, 1
260 OUT &H42, 0
270 REM ストップ条件発行
280 OUT &H41, 1
290 OUT &H40, &H40 ' STOビット
300 OUT &H42, 1
310 OUT &H42, 0
320 PRINT "送信完了"
- OUT &H40 → HD0-HD7(データ)
- OUT &H41 → HA0-HA2(レジスタ選択)
- OUT &H42 → HCS/HWR/HRD(制御信号)
- ACK確認は、HRDを使って読み込み(INP(&H40))でSRレジスタをチェック
ACK確認例
400 REM ステータス確認
410 OUT &H41, 2 ' HA0-HA2 = 2 (SRレジスタ)
420 OUT &H42, 4 ' HCS=1, HRD=1
430 STATUS = INP(&H40) ' HD0-HD7から読み込み
440 OUT &H42, 0 ' RD解除
450 IF (STATUS AND &H80) = 0 THEN PRINT "ACK OK" ELSE PRINT "NACK"
- STATUS AND &H80 → ACKビット(0ならACK、1ならNACK)
おわりに
I2CブリッジICを接続することで、I2C通信ができるようになるようです。