2026年 06月 13日
[PC-G850V] ポケコンでI2C通信 実機確認 - ピンのON/OFFを見直し 図解 (6/13)
![[PC-G850V] ポケコンでI2C通信 実機確認 - ピンのON/OFFを見直し 図解 (6/13)_a0034780_03442748.png](https://pds.exblog.jp/pds/1/202606/15/80/a0034780_03442748.png)
【SDA/SCLへの出力の場合】
![[PC-G850V] ポケコンでI2C通信 実機確認 - ピンのON/OFFを見直し 図解 (6/13)_a0034780_03443648.png](https://pds.exblog.jp/pds/1/202606/15/80/a0034780_03443648.png)
【SDA/SCLからの入力の場合】
【両4,5ピン出力の場合】
(4,5)=(SCL 0,SDA 0):pioset(0),pioput(0)
(4,5)=(SCL 1,SDA 0):pioset(1),pioput(1)
(4,5)=(SCL 0,SDA 1):pioset(2),pioput(2)
(4,5)=(SCL 1,SDA 1):pioset(3) と設定
【両4,5ピン入力の場合】
(4,5)=(0,0):pioset(3),w=pioget(),(w & 0x03)==0
(4,5)=(1,0):pioset(3),w=pioget(),(w & 0x01)==1
(4,5)=(0,1):pioset(3),w=pioget(),(w & 0x02)==1
(4,5)=(1,1):pioset(3),w=pioget(),(w & 0x03)==3
ただし、**I2Cとしては「1を出力する」のではなく、「1は入力(Hi-Z)にする」**という考え方になるので、少し整理すると分かりやすくなります。
出力
SCL SDA 設定
0 0 pioset(0), pioput(0)
1 0 pioset(1), pioput(1)
0 1 pioset(2), pioput(2)
1 1 pioset(3)
ここで、
pioset(0):4,5ピンとも出力
pioset(1):4ピン入力、5ピン出力
pioset(2):4ピン出力、5ピン入力
pioset(3):4,5ピンとも入力
だとすると、
(SCL,SDA)=(0,0)
→両方を出力にして0を出力
(SCL,SDA)=(1,0)
→SCLを入力(解放)
→SDAを出力0
(SCL,SDA)=(0,1)
→SCLを出力0
→SDAを入力(解放)
(SCL,SDA)=(1,1)
→両方入力(解放)
となり、I2Cとして理想的です。
入力
ここは少し修正した方がよいです。
pioset(3); // 両方入力
w = pioget();
として、
(w & 0x03)==0 // (0,0)
(w & 0x03)==1 // (1,0)
(w & 0x03)==2 // (0,1)
(w & 0x03)==3 // (1,1)
と判定するのが自然です。
質問の
(w & 0x02)==1
は、
w & 0x02
の結果が取り得る値は
0
2
なので、
(w & 0x02)==1
は常に偽になります。
したがって
(0,1):(w & 0x03)==2
または
(w & 0x02)!=0
とする必要があります。
ACK受信
例えば、
// SDA解放
(5/16追記 下からここも意味がわかったので修正できる - ↑上から、解放は入力モードにする事)
pioset(1); // S
pioput(1);
// SCL解放
pioset(3);
// クロックストレッチ待ち
do{
w = pioget();
(5/16追記 下からここも意味がわかったので修正できる)
}while((w & 0x0
// SDA読む
if((w & 0x0
ACK;
else
NAK;
のようにすると、クロックストレッチ対応のI2Cになります。
この pioset() と pioput() の仕様が、
bit0 = 4ピン(SCL)←(5/16追記 残念。ここ以降ChatGPTの誤回答がわからなくなるので残す)
bit1 = 5ピン(SDA)
pioset():1=入力、0=出力
pioput():出力時の値
であるなら、PC-G850VのソフトウェアI2Cとしてかなり美しい実装になっていると思います。特に (1,1)=pioset(3) だけで両線を解放できるので、START、STOP、ACK、クロックストレッチの処理が非常に書きやすそうです。

