Sho Yama
/
DelphiToI2c
Delphi I2c
Fork of Delphi2I2c by
main.cpp@2:343a0a1ea2fd, 2016-02-29 (annotated)
- 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?
User | Revision | Line number | New 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 |