Sho Yama
/
DelphiToI2c
Delphi I2c
Fork of Delphi2I2c by
main.cpp@0:daee39a441b0, 2016-02-29 (annotated)
- Committer:
- yamasho
- Date:
- Mon Feb 29 10:58:00 2016 +0000
- Revision:
- 0:daee39a441b0
- Child:
- 1:dcd9840bdd66
232ctoi2c
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 | 0:daee39a441b0 | 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 | 0:daee39a441b0 | 29 | int I2cRead(uint8_t I2cAddr, uint8_t len ) |
yamasho | 0:daee39a441b0 | 30 | { |
yamasho | 0:daee39a441b0 | 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 | 0:daee39a441b0 | 75 | wait_us(300); //100ms 以内 |
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 | 0:daee39a441b0 | 96 | wait_us(200); //100ms 以内 |
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 | 0:daee39a441b0 | 106 | wait_us(200); //100ms 以内 |
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 | 0:daee39a441b0 | 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 | 0:daee39a441b0 | 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 |