Delphi I2c

Dependencies:   mbed

Fork of Delphi2I2c by Sho Yama

Committer:
yamasho
Date:
Mon Feb 29 13:59:52 2016 +0000
Revision:
2:343a0a1ea2fd
Parent:
1:dcd9840bdd66
Version 1.00 Comment modify

Who changed what in which revision?

UserRevisionLine numberNew contents of line
yamasho 0:daee39a441b0 1 #include "mbed.h"
yamasho 0:daee39a441b0 2
yamasho 1:dcd9840bdd66 3 #define PCBAUD 115200
yamasho 0:daee39a441b0 4 #define I2CSPEED 10000 /* 10 KBPS */
yamasho 0:daee39a441b0 5
yamasho 0:daee39a441b0 6 #define HI ( true )
yamasho 0:daee39a441b0 7 #define LOW ( false )
yamasho 0:daee39a441b0 8
yamasho 0:daee39a441b0 9 //////////////////// ポート定義 //////////////////////
yamasho 0:daee39a441b0 10 Serial PC(USBTX, USBRX); /* PC UART */
yamasho 0:daee39a441b0 11 I2C I2CS(p9, p10); /* I2C (SDA ,SCL) */
yamasho 0:daee39a441b0 12 uint8_t I2cDataBuffer[256]; /* I2C DATA BUFFER */
yamasho 0:daee39a441b0 13 uint8_t I2cAddr; /* I2C Addr */
yamasho 0:daee39a441b0 14 uint32_t I2cSpeed; /* I2C Addr */
yamasho 0:daee39a441b0 15 uint8_t Code; /* Check Buffer */
yamasho 0:daee39a441b0 16
yamasho 0:daee39a441b0 17
yamasho 0:daee39a441b0 18 /* //////////////////////////////////////////////////////////////////////// */
yamasho 0:daee39a441b0 19 /* // I2Cシリアル出力書込み処理 /////////////////////////////////////// */
yamasho 0:daee39a441b0 20 /* //////////////////////////////////////////////////////////////////////// */
yamasho 0:daee39a441b0 21 int I2cWrite(uint8_t I2cAddr, uint8_t len )
yamasho 0:daee39a441b0 22 {
yamasho 2:343a0a1ea2fd 23 I2CS.frequency(I2cSpeed);
yamasho 2:343a0a1ea2fd 24 return I2CS.write(I2cAddr,(char *)I2cDataBuffer, len ); /* I2C シリアル書込み */
yamasho 0:daee39a441b0 25 }
yamasho 0:daee39a441b0 26 /* //////////////////////////////////////////////////////////////////////// */
yamasho 0:daee39a441b0 27 /* // I2Cシリアル読み込み処理 ///////////////////////////////////////// */
yamasho 0:daee39a441b0 28 /* //////////////////////////////////////////////////////////////////////// */
yamasho 2:343a0a1ea2fd 29 int I2cRead(uint8_t I2cAddr, uint8_t len )
yamasho 0:daee39a441b0 30 {
yamasho 2:343a0a1ea2fd 31 I2CS.frequency(I2cSpeed);
yamasho 2:343a0a1ea2fd 32 return I2CS.read(I2cAddr,(char *)I2cDataBuffer , len ); /* I2C シリアル読込み */
yamasho 0:daee39a441b0 33 }
yamasho 0:daee39a441b0 34 /* //////////////////////////////////////////////////////////////////////// */
yamasho 0:daee39a441b0 35 /* // PCへの送信バッファ設定処理 //////////////////////////////////////// */
yamasho 0:daee39a441b0 36 /* //////////////////////////////////////////////////////////////////////// */
yamasho 0:daee39a441b0 37 void PcReturn(uint8_t RetCode)
yamasho 0:daee39a441b0 38 {
yamasho 0:daee39a441b0 39 PC.putc(RetCode);
yamasho 0:daee39a441b0 40 }
yamasho 0:daee39a441b0 41 /* //////////////////////////////////////////////////////////////////////// */
yamasho 0:daee39a441b0 42 /* // コマンド処理 //////////////////////////////////////////////////////// */
yamasho 0:daee39a441b0 43 /* //////////////////////////////////////////////////////////////////////// */
yamasho 0:daee39a441b0 44 void Command(void)
yamasho 0:daee39a441b0 45 {
yamasho 0:daee39a441b0 46 uint8_t i;
yamasho 0:daee39a441b0 47 uint8_t Count;
yamasho 0:daee39a441b0 48 if( !PC.readable() ) return; /* PCからの要求がなければ抜け */
yamasho 2:343a0a1ea2fd 49 Code = PC.getc();
yamasho 0:daee39a441b0 50
yamasho 2:343a0a1ea2fd 51 switch(Code) {
yamasho 0:daee39a441b0 52 /*********** I2C 送信 ************/
yamasho 2:343a0a1ea2fd 53 case 'O':
yamasho 2:343a0a1ea2fd 54 wait_us(200); //100ms 以内
yamasho 2:343a0a1ea2fd 55 if( !PC.readable() ) {
yamasho 2:343a0a1ea2fd 56 PcReturn('T'); // Error;
yamasho 2:343a0a1ea2fd 57 return;
yamasho 2:343a0a1ea2fd 58 }
yamasho 2:343a0a1ea2fd 59 Count = PC.getc();
yamasho 0:daee39a441b0 60
yamasho 2:343a0a1ea2fd 61 // PC.printf("size: %2d \n",Count);
yamasho 2:343a0a1ea2fd 62 wait_us(200); //100ms 以内
yamasho 2:343a0a1ea2fd 63 if( !PC.readable() ) {
yamasho 2:343a0a1ea2fd 64 PcReturn('T'); // Error;
yamasho 2:343a0a1ea2fd 65 return;
yamasho 2:343a0a1ea2fd 66 }
yamasho 2:343a0a1ea2fd 67 I2cAddr = PC.getc();
yamasho 2:343a0a1ea2fd 68
yamasho 2:343a0a1ea2fd 69 if(Count != 0) Count--;
yamasho 2:343a0a1ea2fd 70 for( i = 0 ; i < Count ; i++) {
yamasho 2:343a0a1ea2fd 71 wait_us(300);
yamasho 2:343a0a1ea2fd 72 if( !PC.readable() ) {
yamasho 2:343a0a1ea2fd 73 PcReturn('T'); // Error;
yamasho 2:343a0a1ea2fd 74 return;
yamasho 2:343a0a1ea2fd 75 }
yamasho 2:343a0a1ea2fd 76 I2cDataBuffer[i] = PC.getc();
yamasho 2:343a0a1ea2fd 77 }
yamasho 2:343a0a1ea2fd 78 {
yamasho 2:343a0a1ea2fd 79 if(!I2cWrite( I2cAddr, Count )) {
yamasho 2:343a0a1ea2fd 80 PcReturn('S'); // Success
yamasho 2:343a0a1ea2fd 81 } else {
yamasho 2:343a0a1ea2fd 82 PcReturn('E'); // Error
yamasho 2:343a0a1ea2fd 83 }
yamasho 2:343a0a1ea2fd 84 }
yamasho 2:343a0a1ea2fd 85 break;
yamasho 0:daee39a441b0 86 /*********** I2CI BUS ************/
yamasho 2:343a0a1ea2fd 87 case 'I':
yamasho 2:343a0a1ea2fd 88 wait_us(200);
yamasho 2:343a0a1ea2fd 89 if( !PC.readable() ) {
yamasho 2:343a0a1ea2fd 90 PcReturn('T'); // Error;
yamasho 2:343a0a1ea2fd 91 return; /* PCからの要求がなければ抜け */
yamasho 2:343a0a1ea2fd 92 }
yamasho 2:343a0a1ea2fd 93 Count = PC.getc();
yamasho 2:343a0a1ea2fd 94
yamasho 2:343a0a1ea2fd 95 // PC.printf("size: %2d \n",Count);
yamasho 2:343a0a1ea2fd 96
yamasho 2:343a0a1ea2fd 97 wait_us(200);
yamasho 2:343a0a1ea2fd 98 if( !PC.readable() ) {
yamasho 2:343a0a1ea2fd 99 PcReturn('T'); // Error;
yamasho 2:343a0a1ea2fd 100 return; /* PCからの要求がなければ抜け */
yamasho 2:343a0a1ea2fd 101 }
yamasho 2:343a0a1ea2fd 102 I2cAddr = PC.getc();
yamasho 2:343a0a1ea2fd 103
yamasho 2:343a0a1ea2fd 104 if( Count == 0) {
yamasho 2:343a0a1ea2fd 105 PcReturn('T'); // Error;
yamasho 2:343a0a1ea2fd 106 return;
yamasho 2:343a0a1ea2fd 107 }
yamasho 0:daee39a441b0 108
yamasho 2:343a0a1ea2fd 109 if(!I2cRead(I2cAddr, Count )) {
yamasho 2:343a0a1ea2fd 110 // success //
yamasho 2:343a0a1ea2fd 111 PcReturn('I'); // Success;
yamasho 2:343a0a1ea2fd 112 PcReturn(Count);
yamasho 2:343a0a1ea2fd 113 for( uint8_t i = 0 ; i < Count ; i ++ ) {
yamasho 2:343a0a1ea2fd 114 PcReturn(I2cDataBuffer[i]);
yamasho 2:343a0a1ea2fd 115 }
yamasho 2:343a0a1ea2fd 116 } else {
yamasho 2:343a0a1ea2fd 117 // ng //
yamasho 2:343a0a1ea2fd 118 PcReturn('E'); // Error;
yamasho 2:343a0a1ea2fd 119 }
yamasho 2:343a0a1ea2fd 120 break;
yamasho 0:daee39a441b0 121 /*********** SPI1O BUS ************/
yamasho 2:343a0a1ea2fd 122 case 'S':
yamasho 2:343a0a1ea2fd 123 wait_us(200); //100ms 以内
yamasho 2:343a0a1ea2fd 124 if( !PC.readable() ) {
yamasho 2:343a0a1ea2fd 125 PcReturn('T'); // Error;
yamasho 2:343a0a1ea2fd 126 return;
yamasho 2:343a0a1ea2fd 127 }
yamasho 2:343a0a1ea2fd 128 Code = PC.getc();
yamasho 2:343a0a1ea2fd 129 wait_us(200); //100ms 以内
yamasho 2:343a0a1ea2fd 130 if( !PC.readable() ) {
yamasho 2:343a0a1ea2fd 131 PcReturn('T'); // Error;
yamasho 2:343a0a1ea2fd 132 return;
yamasho 2:343a0a1ea2fd 133 }
yamasho 2:343a0a1ea2fd 134 I2cSpeed = ((uint16_t)Code << 8) | PC.getc();
yamasho 0:daee39a441b0 135
yamasho 2:343a0a1ea2fd 136 PcReturn('S'); // Success;
yamasho 2:343a0a1ea2fd 137 break;
yamasho 0:daee39a441b0 138 }
yamasho 2:343a0a1ea2fd 139
yamasho 0:daee39a441b0 140 }
yamasho 0:daee39a441b0 141 /* //////////////////////////////////////////////////////////////////////// */
yamasho 0:daee39a441b0 142 /* // メイン処理 ////////////////////////////////////////////////////////// */
yamasho 0:daee39a441b0 143 /* //////////////////////////////////////////////////////////////////////// */
yamasho 2:343a0a1ea2fd 144 int main(void)
yamasho 0:daee39a441b0 145 {
yamasho 2:343a0a1ea2fd 146 //// PC 通信設定 ////////////
yamasho 2:343a0a1ea2fd 147 PC.baud(PCBAUD); /* PC間フォーマット設定 ボ-レート */
yamasho 2:343a0a1ea2fd 148 I2cSpeed = I2CSPEED;
yamasho 2:343a0a1ea2fd 149 PC.printf("Progam Start!\n");
yamasho 2:343a0a1ea2fd 150 while( true ) {
yamasho 0:daee39a441b0 151 Command(); //PC =>PCB Command
yamasho 2:343a0a1ea2fd 152 }
yamasho 0:daee39a441b0 153 }
yamasho 2:343a0a1ea2fd 154