Delphi I2c

Dependencies:   mbed

Fork of Delphi2I2c by Sho Yama

main.cpp

Committer:
yamasho
Date:
2016-02-29
Revision:
2:343a0a1ea2fd
Parent:
1:dcd9840bdd66

File content as of revision 2:343a0a1ea2fd:

#include    "mbed.h"

#define PCBAUD          115200
#define I2CSPEED        10000         /* 10 KBPS       */

#define     HI      ( true  )
#define     LOW     ( false )

//////////////////// ポート定義  //////////////////////
Serial      PC(USBTX,   USBRX);                 /* PC UART         */
I2C         I2CS(p9, p10);                     /* I2C (SDA ,SCL)        */
uint8_t     I2cDataBuffer[256];                 /* I2C DATA BUFFER       */
uint8_t     I2cAddr;                            /* I2C Addr              */
uint32_t    I2cSpeed;                           /* I2C Addr              */
uint8_t     Code;                               /* Check Buffer          */


/* //////////////////////////////////////////////////////////////////////// */
/* //  I2Cシリアル出力書込み処理 /////////////////////////////////////// */
/* //////////////////////////////////////////////////////////////////////// */
int I2cWrite(uint8_t I2cAddr, uint8_t len )
{
    I2CS.frequency(I2cSpeed);
    return I2CS.write(I2cAddr,(char *)I2cDataBuffer, len );           /* I2C シリアル書込み */
}
/* //////////////////////////////////////////////////////////////////////// */
/* //  I2Cシリアル読み込み処理 ///////////////////////////////////////// */
/* //////////////////////////////////////////////////////////////////////// */
int I2cRead(uint8_t I2cAddr, uint8_t len )
{
    I2CS.frequency(I2cSpeed);
    return I2CS.read(I2cAddr,(char *)I2cDataBuffer , len );       /* I2C シリアル読込み */
}
/* //////////////////////////////////////////////////////////////////////// */
/* // PCへの送信バッファ設定処理 //////////////////////////////////////// */
/* //////////////////////////////////////////////////////////////////////// */
void PcReturn(uint8_t RetCode)
{
    PC.putc(RetCode);
}
/* //////////////////////////////////////////////////////////////////////// */
/* // コマンド処理 //////////////////////////////////////////////////////// */
/* //////////////////////////////////////////////////////////////////////// */
void Command(void)
{
    uint8_t     i;
    uint8_t     Count;
    if( !PC.readable() )  return;          /* PCからの要求がなければ抜け */
    Code = PC.getc();

    switch(Code) {
            /***********   I2C 送信 ************/
        case  'O':
            wait_us(200); //100ms 以内
            if( !PC.readable() ) {
                PcReturn('T');         // Error;
                return;
            }
            Count = PC.getc();

            //                  PC.printf("size: %2d \n",Count);
            wait_us(200); //100ms 以内
            if( !PC.readable() ) {
                PcReturn('T');         // Error;
                return;
            }
            I2cAddr = PC.getc();

            if(Count != 0) Count--;
            for( i = 0 ; i < Count ; i++) {
                wait_us(300);
                if( !PC.readable() ) {
                    PcReturn('T');         // Error;
                    return;
                }
                I2cDataBuffer[i] = PC.getc();
            }
            {
                if(!I2cWrite( I2cAddr, Count )) {
                    PcReturn('S');     // Success
                } else {
                    PcReturn('E');     // Error
                }
            }
            break;
            /***********   I2CI BUS ************/
        case 'I':
            wait_us(200);
            if( !PC.readable() ) {
                PcReturn('T');         // Error;
                return;          /* PCからの要求がなければ抜け */
            }
            Count = PC.getc();

//                   PC.printf("size: %2d \n",Count);

            wait_us(200);
            if( !PC.readable() ) {
                PcReturn('T');         // Error;
                return;          /* PCからの要求がなければ抜け */
            }
            I2cAddr = PC.getc();

            if( Count == 0) {
                PcReturn('T');         // Error;
                return;
            }

            if(!I2cRead(I2cAddr, Count )) {
                // success //
                PcReturn('I');         // Success;
                PcReturn(Count);
                for( uint8_t i = 0 ; i < Count ; i ++ ) {
                    PcReturn(I2cDataBuffer[i]);
                }
            } else {
                // ng //
                PcReturn('E');         // Error;
            }
            break;
            /***********   SPI1O BUS ************/
        case 'S':
            wait_us(200); //100ms 以内
            if( !PC.readable() ) {
                PcReturn('T');         // Error;
                return;
            }
            Code = PC.getc();
            wait_us(200); //100ms 以内
            if( !PC.readable() ) {
                PcReturn('T');         // Error;
                return;
            }
            I2cSpeed = ((uint16_t)Code << 8) | PC.getc();

            PcReturn('S');         // Success;
            break;
    }

}
/* //////////////////////////////////////////////////////////////////////// */
/* // メイン処理 ////////////////////////////////////////////////////////// */
/* //////////////////////////////////////////////////////////////////////// */
int main(void)
{
    //// PC 通信設定  ////////////
    PC.baud(PCBAUD);                             /* PC間フォーマット設定 ボ-レート */
    I2cSpeed = I2CSPEED;
    PC.printf("Progam Start!\n");
    while( true ) {
        Command();              //PC   =>PCB Command
    }
}