Delphi I2c

Dependencies:   mbed

Fork of Delphi2I2c by Sho Yama

Committer:
yamasho
Date:
Mon Feb 29 13:58:55 2016 +0000
Revision:
1:dcd9840bdd66
Parent:
0:daee39a441b0
Child:
2:343a0a1ea2fd
Version 1.00;

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 0:daee39a441b0 23 I2CS.frequency(I2cSpeed);
yamasho 0:daee39a441b0 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 1:dcd9840bdd66 29 int I2cRead(uint8_t I2cAddr, uint8_t len )
yamasho 0:daee39a441b0 30 {
yamasho 1:dcd9840bdd66 31 I2CS.frequency(I2cSpeed);
yamasho 0:daee39a441b0 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 0:daee39a441b0 49 Code = PC.getc();
yamasho 0:daee39a441b0 50
yamasho 0:daee39a441b0 51 switch(Code)
yamasho 0:daee39a441b0 52 {
yamasho 0:daee39a441b0 53 /*********** I2C 送信 ************/
yamasho 0:daee39a441b0 54 case 'O':
yamasho 0:daee39a441b0 55 wait_us(200); //100ms 以内
yamasho 0:daee39a441b0 56 if( !PC.readable() )
yamasho 0:daee39a441b0 57 {
yamasho 0:daee39a441b0 58 PcReturn('T'); // Error;
yamasho 0:daee39a441b0 59 return;
yamasho 0:daee39a441b0 60 }
yamasho 0:daee39a441b0 61 Count = PC.getc();
yamasho 0:daee39a441b0 62
yamasho 0:daee39a441b0 63 // PC.printf("size: %2d \n",Count);
yamasho 0:daee39a441b0 64 wait_us(200); //100ms 以内
yamasho 0:daee39a441b0 65 if( !PC.readable() )
yamasho 0:daee39a441b0 66 {
yamasho 0:daee39a441b0 67 PcReturn('T'); // Error;
yamasho 0:daee39a441b0 68 return;
yamasho 0:daee39a441b0 69 }
yamasho 0:daee39a441b0 70 I2cAddr = PC.getc();
yamasho 0:daee39a441b0 71
yamasho 0:daee39a441b0 72 if(Count != 0) Count--;
yamasho 0:daee39a441b0 73 for( i = 0 ; i < Count ; i++)
yamasho 0:daee39a441b0 74 {
yamasho 1:dcd9840bdd66 75 wait_us(300);
yamasho 0:daee39a441b0 76 if( !PC.readable() )
yamasho 0:daee39a441b0 77 {
yamasho 0:daee39a441b0 78 PcReturn('T'); // Error;
yamasho 0:daee39a441b0 79 return;
yamasho 0:daee39a441b0 80 }
yamasho 0:daee39a441b0 81 I2cDataBuffer[i] = PC.getc();
yamasho 0:daee39a441b0 82 }
yamasho 0:daee39a441b0 83 {
yamasho 0:daee39a441b0 84 if(!I2cWrite( I2cAddr, Count ))
yamasho 0:daee39a441b0 85 {
yamasho 0:daee39a441b0 86 PcReturn('S'); // Success
yamasho 0:daee39a441b0 87 }
yamasho 0:daee39a441b0 88 else
yamasho 0:daee39a441b0 89 {
yamasho 0:daee39a441b0 90 PcReturn('E'); // Error
yamasho 0:daee39a441b0 91 }
yamasho 0:daee39a441b0 92 }
yamasho 0:daee39a441b0 93 break;
yamasho 0:daee39a441b0 94 /*********** I2CI BUS ************/
yamasho 0:daee39a441b0 95 case 'I':
yamasho 1:dcd9840bdd66 96 wait_us(200);
yamasho 0:daee39a441b0 97 if( !PC.readable() )
yamasho 0:daee39a441b0 98 {
yamasho 0:daee39a441b0 99 PcReturn('T'); // Error;
yamasho 0:daee39a441b0 100 return; /* PCからの要求がなければ抜け */
yamasho 0:daee39a441b0 101 }
yamasho 0:daee39a441b0 102 Count = PC.getc();
yamasho 0:daee39a441b0 103
yamasho 0:daee39a441b0 104 // PC.printf("size: %2d \n",Count);
yamasho 0:daee39a441b0 105
yamasho 1:dcd9840bdd66 106 wait_us(200);
yamasho 0:daee39a441b0 107 if( !PC.readable() )
yamasho 0:daee39a441b0 108 {
yamasho 0:daee39a441b0 109 PcReturn('T'); // Error;
yamasho 0:daee39a441b0 110 return; /* PCからの要求がなければ抜け */
yamasho 0:daee39a441b0 111 }
yamasho 0:daee39a441b0 112 I2cAddr = PC.getc();
yamasho 0:daee39a441b0 113
yamasho 0:daee39a441b0 114 if( Count == 0)
yamasho 0:daee39a441b0 115 {
yamasho 0:daee39a441b0 116 PcReturn('T'); // Error;
yamasho 0:daee39a441b0 117 return;
yamasho 0:daee39a441b0 118 }
yamasho 0:daee39a441b0 119
yamasho 0:daee39a441b0 120 if(!I2cRead(I2cAddr, Count ))
yamasho 0:daee39a441b0 121 { // success //
yamasho 0:daee39a441b0 122 PcReturn('I'); // Success;
yamasho 0:daee39a441b0 123 PcReturn(Count);
yamasho 0:daee39a441b0 124 for( uint8_t i = 0 ; i < Count ; i ++ )
yamasho 0:daee39a441b0 125 {
yamasho 0:daee39a441b0 126 PcReturn(I2cDataBuffer[i]);
yamasho 0:daee39a441b0 127 }
yamasho 0:daee39a441b0 128 }
yamasho 0:daee39a441b0 129 else
yamasho 0:daee39a441b0 130 { // ng //
yamasho 0:daee39a441b0 131 PcReturn('E'); // Error;
yamasho 0:daee39a441b0 132 }
yamasho 0:daee39a441b0 133 break;
yamasho 0:daee39a441b0 134 /*********** SPI1O BUS ************/
yamasho 0:daee39a441b0 135 case 'S':
yamasho 0:daee39a441b0 136 wait_us(200); //100ms 以内
yamasho 1:dcd9840bdd66 137 if( !PC.readable() )
yamasho 0:daee39a441b0 138 {
yamasho 0:daee39a441b0 139 PcReturn('T'); // Error;
yamasho 0:daee39a441b0 140 return;
yamasho 0:daee39a441b0 141 }
yamasho 0:daee39a441b0 142 Code = PC.getc();
yamasho 1:dcd9840bdd66 143 wait_us(200); //100ms 以内
yamasho 0:daee39a441b0 144 if( !PC.readable() )
yamasho 0:daee39a441b0 145 {
yamasho 0:daee39a441b0 146 PcReturn('T'); // Error;
yamasho 0:daee39a441b0 147 return;
yamasho 0:daee39a441b0 148 }
yamasho 0:daee39a441b0 149 I2cSpeed = ((uint16_t)Code << 8) | PC.getc();
yamasho 0:daee39a441b0 150
yamasho 0:daee39a441b0 151 PcReturn('S'); // Success;
yamasho 0:daee39a441b0 152 break;
yamasho 0:daee39a441b0 153 }
yamasho 0:daee39a441b0 154
yamasho 0:daee39a441b0 155 }
yamasho 0:daee39a441b0 156 /* //////////////////////////////////////////////////////////////////////// */
yamasho 0:daee39a441b0 157 /* // メイン処理 ////////////////////////////////////////////////////////// */
yamasho 0:daee39a441b0 158 /* //////////////////////////////////////////////////////////////////////// */
yamasho 0:daee39a441b0 159 int main(void)
yamasho 0:daee39a441b0 160 {
yamasho 0:daee39a441b0 161 //// PC 通信設定 ////////////
yamasho 0:daee39a441b0 162 PC.baud(PCBAUD); /* PC間フォーマット設定 ボ-レート */
yamasho 0:daee39a441b0 163 I2cSpeed = I2CSPEED;
yamasho 0:daee39a441b0 164 PC.printf("Progam Start!\n");
yamasho 0:daee39a441b0 165 while( true )
yamasho 0:daee39a441b0 166 {
yamasho 0:daee39a441b0 167 Command(); //PC =>PCB Command
yamasho 0:daee39a441b0 168 }
yamasho 0:daee39a441b0 169 }
yamasho 0:daee39a441b0 170