Sho Yama
/
DelphiToI2c
Delphi I2c
Fork of Delphi2I2c by
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 } }