こんにちは 。おひさしぶりのやましょうです。
ちょっとしたことからdelphiからi2cできれば楽ですね。。という
話になり。こんな感じで出来ました。
おきまりの青mbedのコードは下記です。
https://developer.mbed.org/users/yamasho/code/DelphiToI2c/
import して使用してください。
p9,p10にsda,sclとpull-up抵抗(5kくらいかな。。)をつければ動きます。
232cからのコマンドはこんな感じです。
1.PC=>I2C
0BYTE - 'O' ($4F)
1BYTE - 総送信バイト数
2BYTE - I2C ADDRESS (R/Wは含まず )
3BYTE - データ送信値
nBYTE - データ送信値[総送信バイト数-1]
戻り値 'T' 232C通信でエラー発生
戻り値 'S' I2C送信で送信成功
戻り値 'E' I2C送信でエラー発生
2.I2C=>PC
0BYTE - 'I' ($49)
1BYTE - 総受信バイト数
2BYTE - I2C ADDRESS (R/Wは含まず )
戻り値 'T' 232C通信でエラー発生
戻り値 'I' I2C送信で送信成功 +受信データ
戻り値 'E' I2C送信でエラー発生
3.I2C BUS速度決定
0BYTE - 'S' ($53)
1BYTE - 通信速度上位8BIT
2BYTE - 通信速度下位8BIT
戻り値 'T' 232C通信でエラー発生
戻り値 'S' I2C設定成功
動作中の画面はこれ、秋月さんの有機ELを使用しています。
(なんかアドレスの設定はできるのだが読み込み用に設定できない謎がある。)
Delphi側の送信はこんな感じでOK!
232Cのコンポーネントとかはご自由でどうぞ。。
procedure TMainForm.LcdCommnad(Dt1, Dt2 : Byte);
var
DataArray : array[0..15] of Byte;
begin
DataArray[0] := byte('O');
DataArray[1] := 3;
DataArray[2] := $03c shl 1; // write
DataArray[3] := dt1;
DataArray[4] := dt2;
Uni232C.Write( 5, @DataArray);
end;
procedure TMainForm.LcdDataOut();
var
DataArray : array[0..20] of Byte;
begin
DataArray[0] := byte('O');
DataArray[1] := 18;
DataArray[2] := $03c shl 1; // write //1
DataArray[3] := $40; //2
DataArray[4] := byte('A'); //3
DataArray[5] := byte('B'); //4
DataArray[6] := byte('C'); //5
DataArray[7] := byte('D'); //6
DataArray[8] := byte('E'); //7
DataArray[9] := byte('F'); //8
DataArray[10] := byte('G'); //9
DataArray[11] := byte('H'); //10
DataArray[12] := byte('I'); //11
DataArray[13] := byte('J'); //12
DataArray[14] := byte('K'); //13
DataArray[15] := byte('L'); //14
DataArray[16] := byte('M'); //15
DataArray[17] := byte('N'); //16
DataArray[18] := byte('O'); //17
DataArray[19] := byte('P'); //18
Uni232C.Write( 21 ,@DataArray);
end;
procedure TMainForm.Button2Click(Sender: TObject);
begin
LcdCommnad( $80,$01 );
sleep(10);
LcdCommnad( $80,$02 );
sleep(10);
LcdCommnad( $8b,$0c );
sleep(100);
LcdDataOut();
end;
procedure TMainForm.Button3Click(Sender: TObject);
var
str : String;
ret : integer;
i: byte;
Buffer: array [0 .. $3F] of byte;
DataArray : array[0..15] of Byte;
begin
FillChar(Buffer,Sizeof(Buffer),0);
ret := Uni232C.Read(64, @Buffer);
DataArray[0] := byte('O');
DataArray[1] := 2;
DataArray[2] := $03c shl 1; // write
DataArray[3] := $40;
// DataArray[4] := $40;
// DataArray[4] := byte('Z');
Uni232C.Write( 4, @DataArray);
sleep(5);
FillChar(Buffer,Sizeof(Buffer),0);
ret := Uni232C.Read(64, @Buffer);
if( Ret <= 0 ) then exit;
if Buffer[0] <> byte('S')then exit;
DataArray[0] := byte('I');
DataArray[1] := $16;
DataArray[2] := $03c shl 1; // write
Uni232C.Write( 5, @DataArray);
FillChar(Buffer,Sizeof(Buffer),0);
ret := Uni232C.Read(64, @Buffer);
str := '';
if( Ret >= 0) then
Label7.Text := 'Read Length:'+IntToHex(ret,8)
else
Label7.Text := 'Read Failed:ErrorCode'+IntTostr(ret) ;
if( Ret <= 0 ) then exit;
if Buffer[0] <> byte('I') then exit;
str := 'I:'+IntToHex(Buffer[1],2)+':';
for i := 2 to ret-1 do
str := str+ Char(Buffer[i]);
memo1.Lines.add(str);
end;
以上
やましょうでした。