2016年2月29日月曜日

delphi 232c経由でi2cに送受信する。

こんにちは 。おひさしぶりのやましょうです。

ちょっとしたことから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;


以上
やましょうでした。