Kazuki Yamamoto
/
uart_i2c_conv_824
only for LPC824 chip to match hardware I2C channels(2->4)
main.cpp@17:12c1791e18b5, 2015-11-10 (annotated)
- Committer:
- k4zuki
- Date:
- Tue Nov 10 01:38:21 2015 +0900
- Revision:
- 17:12c1791e18b5
- Parent:
- 16:dc75cd5b6f8c
remove serial2i2c.py.txt
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
k4zuki | 13:3a32c5aa6f74 | 1 | /** uart_i2c_conv for LPC824 |
k4zuki | 13:3a32c5aa6f74 | 2 | */ |
k4zuki | 13:3a32c5aa6f74 | 3 | |
k4zuki | 0:9d12c615c8ea | 4 | #include "mbed.h" |
k4zuki | 13:3a32c5aa6f74 | 5 | #define QUAD_I2C |
k4zuki | 14:1d3d43c0e6b4 | 6 | #define TINYI2C |
k4zuki | 13:3a32c5aa6f74 | 7 | |
k4zuki | 13:3a32c5aa6f74 | 8 | #ifdef TINYI2C |
k4zuki | 14:1d3d43c0e6b4 | 9 | #warning "TINYI2C" |
k4zuki | 13:3a32c5aa6f74 | 10 | Serial pc(P0_4, P0_0); |
k4zuki | 13:3a32c5aa6f74 | 11 | #else //TINY_I2C |
k4zuki | 14:1d3d43c0e6b4 | 12 | #warning "NOT TINYI2C" |
k4zuki | 14:1d3d43c0e6b4 | 13 | //Serial pc(P0_4, P0_0); |
k4zuki | 14:1d3d43c0e6b4 | 14 | Serial pc(USBTX,USBRX); // P0_7, P0_18 |
k4zuki | 13:3a32c5aa6f74 | 15 | #endif //TINYI2C |
k4zuki | 13:3a32c5aa6f74 | 16 | //P0_13, P0_1 |
k4zuki | 13:3a32c5aa6f74 | 17 | |
k4zuki | 15:5c004316adab | 18 | #warning "I2C1 = I2C_SDA, I2C_SCL" |
k4zuki | 13:3a32c5aa6f74 | 19 | I2C dev1(I2C_SDA, I2C_SCL);//11,10 hard coded, 220 ohm pull-up |
k4zuki | 13:3a32c5aa6f74 | 20 | |
k4zuki | 13:3a32c5aa6f74 | 21 | #ifdef QUAD_I2C |
k4zuki | 14:1d3d43c0e6b4 | 22 | #warning "QUAD_I2C" |
k4zuki | 13:3a32c5aa6f74 | 23 | |
k4zuki | 13:3a32c5aa6f74 | 24 | #ifdef TINYI2C |
k4zuki | 14:1d3d43c0e6b4 | 25 | #warning "TINYI2C" |
k4zuki | 15:5c004316adab | 26 | #warning "I2C2 = P0_16, P0_27" |
k4zuki | 15:5c004316adab | 27 | #warning "I2C3 = P0_26, P0_25" |
k4zuki | 15:5c004316adab | 28 | #warning "I2C4 = P0_24, P0_15" |
k4zuki | 15:5c004316adab | 29 | |
k4zuki | 13:3a32c5aa6f74 | 30 | I2C dev2(P0_16, P0_27); |
k4zuki | 13:3a32c5aa6f74 | 31 | I2C dev3(P0_26, P0_25); |
k4zuki | 13:3a32c5aa6f74 | 32 | I2C dev4(P0_24, P0_15); |
k4zuki | 15:5c004316adab | 33 | |
k4zuki | 13:3a32c5aa6f74 | 34 | #else //TINYI2C |
k4zuki | 14:1d3d43c0e6b4 | 35 | #warning "NOT TINYI2C" |
k4zuki | 15:5c004316adab | 36 | #warning "I2C2 = A0, A1" |
k4zuki | 15:5c004316adab | 37 | #warning "I2C3 = A2, A3" |
k4zuki | 15:5c004316adab | 38 | #warning "I2C4 = A4, A5" |
k4zuki | 15:5c004316adab | 39 | |
k4zuki | 13:3a32c5aa6f74 | 40 | I2C dev2(P0_6, P0_14); // 6,14 | A0, A1 |
k4zuki | 13:3a32c5aa6f74 | 41 | I2C dev3(P0_23, P0_22); // 23,22 | A2, A3 |
k4zuki | 13:3a32c5aa6f74 | 42 | I2C dev4(P0_21, P0_20); // 21,20 | A4, A5 |
k4zuki | 13:3a32c5aa6f74 | 43 | #endif //TINYI2C |
k4zuki | 0:9d12c615c8ea | 44 | |
k4zuki | 13:3a32c5aa6f74 | 45 | #else //QUAD_I2C |
k4zuki | 14:1d3d43c0e6b4 | 46 | #warning "NOT QUAD_I2C" |
k4zuki | 15:5c004316adab | 47 | #warning "GPIO10 = P0_15" |
k4zuki | 15:5c004316adab | 48 | #warning "GPIO11 = P0_24" |
k4zuki | 15:5c004316adab | 49 | #warning "GPIO12 = P0_25" |
k4zuki | 15:5c004316adab | 50 | #warning "GPIO13 = P0_26" |
k4zuki | 15:5c004316adab | 51 | #warning "GPIO14 = P0_27" |
k4zuki | 15:5c004316adab | 52 | #warning "GPIO15 = P0_16" |
k4zuki | 15:5c004316adab | 53 | #warning "GPIO16 = P0_28" |
k4zuki | 15:5c004316adab | 54 | #warning "GPIO17 = P0_12" |
k4zuki | 15:5c004316adab | 55 | |
k4zuki | 13:3a32c5aa6f74 | 56 | DigitalInOut _GPIO10(P0_15); |
k4zuki | 13:3a32c5aa6f74 | 57 | DigitalInOut _GPIO11(P0_24); |
k4zuki | 13:3a32c5aa6f74 | 58 | DigitalInOut _GPIO12(P0_25); |
k4zuki | 13:3a32c5aa6f74 | 59 | DigitalInOut _GPIO13(P0_26); |
k4zuki | 13:3a32c5aa6f74 | 60 | DigitalInOut _GPIO14(P0_27); |
k4zuki | 13:3a32c5aa6f74 | 61 | DigitalInOut _GPIO15(P0_16); |
k4zuki | 13:3a32c5aa6f74 | 62 | DigitalInOut _GPIO16(P0_28); |
k4zuki | 13:3a32c5aa6f74 | 63 | DigitalInOut _GPIO17(P0_12); |
k4zuki | 13:3a32c5aa6f74 | 64 | #endif //QUAD_I2C |
k4zuki | 13:3a32c5aa6f74 | 65 | |
k4zuki | 13:3a32c5aa6f74 | 66 | #ifdef TINYI2C |
k4zuki | 14:1d3d43c0e6b4 | 67 | #warning "TINYI2C" |
k4zuki | 15:5c004316adab | 68 | #warning "GPIO00 = P0_17" |
k4zuki | 15:5c004316adab | 69 | #warning "GPIO01 = P0_18" |
k4zuki | 15:5c004316adab | 70 | #warning "GPIO02 = P0_19" |
k4zuki | 15:5c004316adab | 71 | #warning "GPIO03 = P0_20" |
k4zuki | 15:5c004316adab | 72 | #warning "GPIO04 = P0_21" |
k4zuki | 15:5c004316adab | 73 | #warning "GPIO05 = P0_22" |
k4zuki | 15:5c004316adab | 74 | #warning "GPIO06 = P0_23" |
k4zuki | 15:5c004316adab | 75 | #warning "GPIO07 = P0_14" |
k4zuki | 13:3a32c5aa6f74 | 76 | DigitalInOut _GPIO00(P0_17); |
k4zuki | 13:3a32c5aa6f74 | 77 | DigitalInOut _GPIO01(P0_18); |
k4zuki | 13:3a32c5aa6f74 | 78 | DigitalInOut _GPIO02(P0_19); |
k4zuki | 13:3a32c5aa6f74 | 79 | DigitalInOut _GPIO03(P0_20); |
k4zuki | 13:3a32c5aa6f74 | 80 | DigitalInOut _GPIO04(P0_21); |
k4zuki | 13:3a32c5aa6f74 | 81 | DigitalInOut _GPIO05(P0_22); |
k4zuki | 13:3a32c5aa6f74 | 82 | DigitalInOut _GPIO06(P0_23); |
k4zuki | 13:3a32c5aa6f74 | 83 | DigitalInOut _GPIO07(P0_14); |
k4zuki | 13:3a32c5aa6f74 | 84 | #else |
k4zuki | 14:1d3d43c0e6b4 | 85 | #warning "NOT TINYI2C" |
k4zuki | 15:5c004316adab | 86 | #warning "GPIO00 = P0_19 = D2" |
k4zuki | 15:5c004316adab | 87 | #warning "GPIO01 = P0_12 = D3" |
k4zuki | 15:5c004316adab | 88 | #warning "GPIO02 = P0_18 = D4" |
k4zuki | 15:5c004316adab | 89 | #warning "GPIO03 = P0_28 = D5" |
k4zuki | 15:5c004316adab | 90 | #warning "GPIO04 = P0_16 = D6" |
k4zuki | 15:5c004316adab | 91 | #warning "GPIO05 = P0_17 = D7" |
k4zuki | 15:5c004316adab | 92 | #warning "GPIO06 = P0_13 = D8" |
k4zuki | 15:5c004316adab | 93 | #warning "GPIO07 = P0_27 = D9" |
k4zuki | 14:1d3d43c0e6b4 | 94 | DigitalInOut _GPIO00(P0_19); // D2 |
k4zuki | 14:1d3d43c0e6b4 | 95 | DigitalInOut _GPIO01(P0_12); // D3 |
k4zuki | 14:1d3d43c0e6b4 | 96 | DigitalInOut _GPIO02(P0_18); // D4 |
k4zuki | 14:1d3d43c0e6b4 | 97 | DigitalInOut _GPIO03(P0_28); // D5 |
k4zuki | 14:1d3d43c0e6b4 | 98 | DigitalInOut _GPIO04(P0_16); // D6 |
k4zuki | 14:1d3d43c0e6b4 | 99 | DigitalInOut _GPIO05(P0_17); // D7 |
k4zuki | 14:1d3d43c0e6b4 | 100 | DigitalInOut _GPIO06(P0_13); // D8 |
k4zuki | 14:1d3d43c0e6b4 | 101 | DigitalInOut _GPIO07(P0_27); // D9 |
k4zuki | 13:3a32c5aa6f74 | 102 | #endif //TINYI2C |
k4zuki | 13:3a32c5aa6f74 | 103 | |
k4zuki | 13:3a32c5aa6f74 | 104 | #ifdef TINYI2C |
k4zuki | 14:1d3d43c0e6b4 | 105 | #warning "TINYI2C" |
k4zuki | 15:5c004316adab | 106 | #warning "SPI(mosi, miso, sclk) = P0_6, P0_7, P0_13" |
k4zuki | 15:5c004316adab | 107 | #warning "CS = P0_1" |
k4zuki | 14:1d3d43c0e6b4 | 108 | SPI _spi(P0_6, P0_7, P0_13); // mosi, miso, sclk |
k4zuki | 14:1d3d43c0e6b4 | 109 | DigitalOut _cs(P0_1); // CS |
k4zuki | 13:3a32c5aa6f74 | 110 | #else |
k4zuki | 14:1d3d43c0e6b4 | 111 | #warning "NOT TINYI2C" |
k4zuki | 15:5c004316adab | 112 | #warning "SPI(mosi, miso, sclk) = D11, D12, D13" |
k4zuki | 15:5c004316adab | 113 | #warning "CS = D10" |
k4zuki | 14:1d3d43c0e6b4 | 114 | SPI _spi(P0_26,P0_25,P0_24); // mosi, miso, sclk, D11, D12, D13 |
k4zuki | 14:1d3d43c0e6b4 | 115 | DigitalOut _cs(P0_15); // CS, D10 |
k4zuki | 13:3a32c5aa6f74 | 116 | #endif //TINYI2C |
k4zuki | 0:9d12c615c8ea | 117 | |
k4zuki | 0:9d12c615c8ea | 118 | //Table 3. ASCII commands supported by SC18IM700 |
k4zuki | 0:9d12c615c8ea | 119 | //ASCII command Hex value Command function |
k4zuki | 1:5817c3e6ce1e | 120 | //[X] S 0x53 I2C-bus START |
k4zuki | 13:3a32c5aa6f74 | 121 | //[X] P 0x50 I2C/SPI-bus STOP |
k4zuki | 13:3a32c5aa6f74 | 122 | //[X] R 0x52 read SC18IM700 internal register |
k4zuki | 13:3a32c5aa6f74 | 123 | //[X] W 0x57 write to SC18IM700 internal register |
k4zuki | 13:3a32c5aa6f74 | 124 | //[?] I 0x49 read GPIO port |
k4zuki | 13:3a32c5aa6f74 | 125 | //[?] O 0x4F write to GPIO port |
k4zuki | 1:5817c3e6ce1e | 126 | //[_] Z 0x5A power down |
k4zuki | 9:78c43e2448d6 | 127 | //[X] C 0x43 change channel |
k4zuki | 13:3a32c5aa6f74 | 128 | //[_] E 0x45 SPI transfer start |
k4zuki | 13:3a32c5aa6f74 | 129 | //[_] V 0x__ enable VDDIO output to chip |
k4zuki | 0:9d12c615c8ea | 130 | |
k4zuki | 13:3a32c5aa6f74 | 131 | /** |
k4zuki | 13:3a32c5aa6f74 | 132 | "C| '0'| P" |
k4zuki | 13:3a32c5aa6f74 | 133 | "C| '1'| P" |
k4zuki | 13:3a32c5aa6f74 | 134 | "C| '2'| P" |
k4zuki | 13:3a32c5aa6f74 | 135 | "C| '3'| P" |
k4zuki | 13:3a32c5aa6f74 | 136 | "S| 0x_8 _0| 0x_0 _4| 0x_D _E _A _D _B _E _A _F| P" |
k4zuki | 13:3a32c5aa6f74 | 137 | "S| 0x_8 _0| 0x_0 _4| 0x_D _E _A _D _B _E _A _F| S| 0x_8 _1| 0x_0 _4| P" |
k4zuki | 13:3a32c5aa6f74 | 138 | "S| 0x_8 _1| 0x_0 _4| P" |
k4zuki | 13:3a32c5aa6f74 | 139 | "R| '0'| P" |
k4zuki | 13:3a32c5aa6f74 | 140 | "R| '0'| '1'| ...| P" |
k4zuki | 13:3a32c5aa6f74 | 141 | "W| '0' 0x_a _a| P" |
k4zuki | 13:3a32c5aa6f74 | 142 | "W| '0' 0x_a _a| '1' 0x_b _b| ...| P" |
k4zuki | 13:3a32c5aa6f74 | 143 | "I| '0'| P" |
k4zuki | 13:3a32c5aa6f74 | 144 | "O| '0'| 0x_a _a| P" |
k4zuki | 13:3a32c5aa6f74 | 145 | "E| 0x_0 _4| 0x_0 _0| 0x_D _E _A _D _B _E _A _F| P" //write |
k4zuki | 13:3a32c5aa6f74 | 146 | "E| 0x_0 _4| 0x_0 _4| 0x_D _E _A _D _B _E _A _F| P" //write and read |
k4zuki | 13:3a32c5aa6f74 | 147 | */ |
k4zuki | 0:9d12c615c8ea | 148 | int main() |
k4zuki | 0:9d12c615c8ea | 149 | { |
k4zuki | 2:096289a04a1f | 150 | I2C* dev=&dev1; |
k4zuki | 10:5406bc1bb50b | 151 | pc.baud(115200); |
k4zuki | 13:3a32c5aa6f74 | 152 | _spi.frequency(8000000); |
k4zuki | 0:9d12c615c8ea | 153 | |
k4zuki | 13:3a32c5aa6f74 | 154 | bool s = false; |
k4zuki | 16:dc75cd5b6f8c | 155 | dev1.frequency(800000);//800k; works around 940kHz with 200ohm pullups/ not work at 1M? |
k4zuki | 13:3a32c5aa6f74 | 156 | LPC_IOCON->PIO0_11 &= ~(0x03<<8); |
k4zuki | 13:3a32c5aa6f74 | 157 | LPC_IOCON->PIO0_11 |= (0x02<<8); |
k4zuki | 13:3a32c5aa6f74 | 158 | LPC_IOCON->PIO0_10 &= ~(0x03<<8); |
k4zuki | 13:3a32c5aa6f74 | 159 | LPC_IOCON->PIO0_10 |= (0x02<<8); |
k4zuki | 13:3a32c5aa6f74 | 160 | // LPC_I2C0->CLKDIV &= 0xFFFFFF00; |
k4zuki | 13:3a32c5aa6f74 | 161 | // LPC_I2C0->CLKDIV |= 0x05; |
k4zuki | 13:3a32c5aa6f74 | 162 | // LPC_I2C0->MSTTIME &= 0xFFFFFF00; |
k4zuki | 13:3a32c5aa6f74 | 163 | // LPC_I2C0->MSTTIME |= 0x00; |
k4zuki | 13:3a32c5aa6f74 | 164 | #ifdef QUAD_I2C |
k4zuki | 14:1d3d43c0e6b4 | 165 | #warning "QUAD_I2C" |
k4zuki | 13:3a32c5aa6f74 | 166 | dev2.frequency(400000);//400k |
k4zuki | 13:3a32c5aa6f74 | 167 | dev3.frequency(400000);//400k |
k4zuki | 13:3a32c5aa6f74 | 168 | dev4.frequency(400000);//400k |
k4zuki | 13:3a32c5aa6f74 | 169 | #else |
k4zuki | 14:1d3d43c0e6b4 | 170 | #warning "NOT QUAD_I2C" |
k4zuki | 13:3a32c5aa6f74 | 171 | DigitalInOut* gpio1[]={ |
k4zuki | 13:3a32c5aa6f74 | 172 | &_GPIO10, |
k4zuki | 13:3a32c5aa6f74 | 173 | &_GPIO11, |
k4zuki | 13:3a32c5aa6f74 | 174 | &_GPIO12, |
k4zuki | 13:3a32c5aa6f74 | 175 | &_GPIO13, |
k4zuki | 13:3a32c5aa6f74 | 176 | &_GPIO14, |
k4zuki | 13:3a32c5aa6f74 | 177 | &_GPIO15, |
k4zuki | 13:3a32c5aa6f74 | 178 | &_GPIO16, |
k4zuki | 13:3a32c5aa6f74 | 179 | &_GPIO17, |
k4zuki | 13:3a32c5aa6f74 | 180 | }; |
k4zuki | 13:3a32c5aa6f74 | 181 | for(int k=0; k<8; k++){ |
k4zuki | 13:3a32c5aa6f74 | 182 | gpio1[k]->input(); |
k4zuki | 13:3a32c5aa6f74 | 183 | gpio1[k]->mode(PullUp); |
k4zuki | 13:3a32c5aa6f74 | 184 | } |
k4zuki | 13:3a32c5aa6f74 | 185 | #endif |
k4zuki | 13:3a32c5aa6f74 | 186 | DigitalInOut* gpio0[]={ |
k4zuki | 13:3a32c5aa6f74 | 187 | &_GPIO00, |
k4zuki | 13:3a32c5aa6f74 | 188 | &_GPIO01, |
k4zuki | 13:3a32c5aa6f74 | 189 | &_GPIO02, |
k4zuki | 13:3a32c5aa6f74 | 190 | &_GPIO03, |
k4zuki | 13:3a32c5aa6f74 | 191 | &_GPIO04, |
k4zuki | 13:3a32c5aa6f74 | 192 | &_GPIO05, |
k4zuki | 13:3a32c5aa6f74 | 193 | &_GPIO06, |
k4zuki | 13:3a32c5aa6f74 | 194 | &_GPIO07, |
k4zuki | 13:3a32c5aa6f74 | 195 | }; |
k4zuki | 13:3a32c5aa6f74 | 196 | for(int k=0; k<8; k++){ |
k4zuki | 13:3a32c5aa6f74 | 197 | gpio0[k]->input(); |
k4zuki | 13:3a32c5aa6f74 | 198 | gpio0[k]->mode(PullUp); |
k4zuki | 13:3a32c5aa6f74 | 199 | } |
k4zuki | 13:3a32c5aa6f74 | 200 | |
k4zuki | 13:3a32c5aa6f74 | 201 | int ack = 0; |
k4zuki | 13:3a32c5aa6f74 | 202 | int plength = 0; |
k4zuki | 14:1d3d43c0e6b4 | 203 | int recieve[256]; |
k4zuki | 13:3a32c5aa6f74 | 204 | char send[256]; |
k4zuki | 13:3a32c5aa6f74 | 205 | for(int k = 0; k < 256; k+=4){ |
k4zuki | 13:3a32c5aa6f74 | 206 | // cafe moca |
k4zuki | 13:3a32c5aa6f74 | 207 | recieve[k+0] = send[k+0] = 0xC4; |
k4zuki | 13:3a32c5aa6f74 | 208 | recieve[k+1] = send[k+1] = 0xFE; |
k4zuki | 13:3a32c5aa6f74 | 209 | recieve[k+2] = send[k+2] = 0xE0; |
k4zuki | 13:3a32c5aa6f74 | 210 | recieve[k+3] = send[k+3] = 0xCA; |
k4zuki | 13:3a32c5aa6f74 | 211 | } |
k4zuki | 13:3a32c5aa6f74 | 212 | |
k4zuki | 14:1d3d43c0e6b4 | 213 | int read = 0; |
k4zuki | 13:3a32c5aa6f74 | 214 | int address = 0; |
k4zuki | 13:3a32c5aa6f74 | 215 | int data = 0; |
k4zuki | 13:3a32c5aa6f74 | 216 | int _data = 0; |
k4zuki | 13:3a32c5aa6f74 | 217 | int length = 0; |
k4zuki | 13:3a32c5aa6f74 | 218 | int channel = 0; |
k4zuki | 13:3a32c5aa6f74 | 219 | int format = 8; |
k4zuki | 13:3a32c5aa6f74 | 220 | int enabled = 0; |
k4zuki | 14:1d3d43c0e6b4 | 221 | int disabled = 0; |
k4zuki | 13:3a32c5aa6f74 | 222 | enum command_e { |
k4zuki | 13:3a32c5aa6f74 | 223 | CMD_S='S', |
k4zuki | 13:3a32c5aa6f74 | 224 | CMD_P='P', |
k4zuki | 13:3a32c5aa6f74 | 225 | CMD_C='C', |
k4zuki | 13:3a32c5aa6f74 | 226 | CMD_R='R', |
k4zuki | 13:3a32c5aa6f74 | 227 | CMD_W='W', |
k4zuki | 13:3a32c5aa6f74 | 228 | CMD_I='I', |
k4zuki | 13:3a32c5aa6f74 | 229 | CMD_O='O', |
k4zuki | 13:3a32c5aa6f74 | 230 | CMD_E='E', |
k4zuki | 0:9d12c615c8ea | 231 | }; |
k4zuki | 13:3a32c5aa6f74 | 232 | enum channel_e { |
k4zuki | 13:3a32c5aa6f74 | 233 | CH0 = '0', |
k4zuki | 13:3a32c5aa6f74 | 234 | CH1 = '1', |
k4zuki | 13:3a32c5aa6f74 | 235 | CH2 = '2', |
k4zuki | 13:3a32c5aa6f74 | 236 | CH3 = '3', |
k4zuki | 13:3a32c5aa6f74 | 237 | }; |
k4zuki | 13:3a32c5aa6f74 | 238 | enum register_e { |
k4zuki | 13:3a32c5aa6f74 | 239 | CHIP_ID = '0', |
k4zuki | 13:3a32c5aa6f74 | 240 | GPIO0_STAT = '1', |
k4zuki | 13:3a32c5aa6f74 | 241 | GPIO1_STAT = '2', |
k4zuki | 13:3a32c5aa6f74 | 242 | GPIO0_CONF = '3', |
k4zuki | 13:3a32c5aa6f74 | 243 | GPIO1_CONF = '4', |
k4zuki | 13:3a32c5aa6f74 | 244 | I2C_CONF = '5', |
k4zuki | 13:3a32c5aa6f74 | 245 | SPI_CONF = '6', |
k4zuki | 13:3a32c5aa6f74 | 246 | REG7, |
k4zuki | 13:3a32c5aa6f74 | 247 | REG8, |
k4zuki | 13:3a32c5aa6f74 | 248 | REG9, |
k4zuki | 13:3a32c5aa6f74 | 249 | }; |
k4zuki | 13:3a32c5aa6f74 | 250 | enum chipID_e { |
k4zuki | 13:3a32c5aa6f74 | 251 | ID_LPC824 = '0', |
k4zuki | 13:3a32c5aa6f74 | 252 | ID_LPC1768 = '1', |
k4zuki | 13:3a32c5aa6f74 | 253 | ID_LPC11UXX = '2', |
k4zuki | 13:3a32c5aa6f74 | 254 | }; |
k4zuki | 13:3a32c5aa6f74 | 255 | static const uint8_t chip_id=ID_LPC824; |
k4zuki | 13:3a32c5aa6f74 | 256 | static uint8_t registers[]={ |
k4zuki | 13:3a32c5aa6f74 | 257 | chip_id, |
k4zuki | 13:3a32c5aa6f74 | 258 | 0x00, |
k4zuki | 13:3a32c5aa6f74 | 259 | 0x00, |
k4zuki | 13:3a32c5aa6f74 | 260 | 0x00, |
k4zuki | 13:3a32c5aa6f74 | 261 | 0x00, |
k4zuki | 13:3a32c5aa6f74 | 262 | 0xFF, |
k4zuki | 13:3a32c5aa6f74 | 263 | 0x70, |
k4zuki | 13:3a32c5aa6f74 | 264 | REG7, |
k4zuki | 13:3a32c5aa6f74 | 265 | REG8, |
k4zuki | 13:3a32c5aa6f74 | 266 | REG9, |
k4zuki | 13:3a32c5aa6f74 | 267 | }; |
k4zuki | 0:9d12c615c8ea | 268 | |
k4zuki | 0:9d12c615c8ea | 269 | int i=0; |
k4zuki | 0:9d12c615c8ea | 270 | while(1) { |
k4zuki | 13:3a32c5aa6f74 | 271 | i=0; |
k4zuki | 13:3a32c5aa6f74 | 272 | length=0; |
k4zuki | 0:9d12c615c8ea | 273 | while(true) { |
k4zuki | 13:3a32c5aa6f74 | 274 | read = pc.getc(); |
k4zuki | 13:3a32c5aa6f74 | 275 | recieve[i] = read; |
k4zuki | 0:9d12c615c8ea | 276 | i++; |
k4zuki | 0:9d12c615c8ea | 277 | if(read == 'P') { |
k4zuki | 13:3a32c5aa6f74 | 278 | plength = i; |
k4zuki | 0:9d12c615c8ea | 279 | break; |
k4zuki | 0:9d12c615c8ea | 280 | } |
k4zuki | 0:9d12c615c8ea | 281 | } |
k4zuki | 0:9d12c615c8ea | 282 | i=0; |
k4zuki | 13:3a32c5aa6f74 | 283 | while(i < plength) { |
k4zuki | 0:9d12c615c8ea | 284 | switch(recieve[i]) { |
k4zuki | 13:3a32c5aa6f74 | 285 | case CMD_C: |
k4zuki | 13:3a32c5aa6f74 | 286 | { |
k4zuki | 14:1d3d43c0e6b4 | 287 | s = false; |
k4zuki | 0:9d12c615c8ea | 288 | channel=recieve[i+1]; |
k4zuki | 0:9d12c615c8ea | 289 | switch(channel) { |
k4zuki | 13:3a32c5aa6f74 | 290 | case CH0: |
k4zuki | 13:3a32c5aa6f74 | 291 | { |
k4zuki | 13:3a32c5aa6f74 | 292 | channel = CH0; |
k4zuki | 13:3a32c5aa6f74 | 293 | dev = &dev1; |
k4zuki | 0:9d12c615c8ea | 294 | break; |
k4zuki | 13:3a32c5aa6f74 | 295 | } |
k4zuki | 13:3a32c5aa6f74 | 296 | #ifdef QUAD_I2C |
k4zuki | 14:1d3d43c0e6b4 | 297 | #warning "QUAD_I2C" |
k4zuki | 13:3a32c5aa6f74 | 298 | case CH1: |
k4zuki | 13:3a32c5aa6f74 | 299 | { |
k4zuki | 13:3a32c5aa6f74 | 300 | channel = CH1; |
k4zuki | 13:3a32c5aa6f74 | 301 | dev = &dev2; |
k4zuki | 0:9d12c615c8ea | 302 | break; |
k4zuki | 13:3a32c5aa6f74 | 303 | } |
k4zuki | 13:3a32c5aa6f74 | 304 | case CH2: |
k4zuki | 13:3a32c5aa6f74 | 305 | { |
k4zuki | 13:3a32c5aa6f74 | 306 | channel = CH2; |
k4zuki | 13:3a32c5aa6f74 | 307 | dev = &dev3; |
k4zuki | 0:9d12c615c8ea | 308 | break; |
k4zuki | 13:3a32c5aa6f74 | 309 | } |
k4zuki | 13:3a32c5aa6f74 | 310 | case CH3: |
k4zuki | 13:3a32c5aa6f74 | 311 | { |
k4zuki | 13:3a32c5aa6f74 | 312 | channel = CH3; |
k4zuki | 13:3a32c5aa6f74 | 313 | dev = &dev4; |
k4zuki | 0:9d12c615c8ea | 314 | break; |
k4zuki | 13:3a32c5aa6f74 | 315 | } |
k4zuki | 13:3a32c5aa6f74 | 316 | #endif |
k4zuki | 0:9d12c615c8ea | 317 | default: |
k4zuki | 13:3a32c5aa6f74 | 318 | { |
k4zuki | 13:3a32c5aa6f74 | 319 | channel = CH0; |
k4zuki | 13:3a32c5aa6f74 | 320 | dev = &dev1; |
k4zuki | 0:9d12c615c8ea | 321 | break; |
k4zuki | 13:3a32c5aa6f74 | 322 | } |
k4zuki | 0:9d12c615c8ea | 323 | } |
k4zuki | 13:3a32c5aa6f74 | 324 | i += 2; |
k4zuki | 0:9d12c615c8ea | 325 | break; |
k4zuki | 13:3a32c5aa6f74 | 326 | } |
k4zuki | 13:3a32c5aa6f74 | 327 | case CMD_S: |
k4zuki | 13:3a32c5aa6f74 | 328 | { |
k4zuki | 13:3a32c5aa6f74 | 329 | s = true; |
k4zuki | 13:3a32c5aa6f74 | 330 | ack = plength - 2 - (i+1) + (recieve[i+2] & 0x01); |
k4zuki | 13:3a32c5aa6f74 | 331 | if(ack >= 4){ //valid packet |
k4zuki | 13:3a32c5aa6f74 | 332 | address = 0xff & (recieve[i+1] << 4 | (recieve[i+2] & 0x0F)); |
k4zuki | 13:3a32c5aa6f74 | 333 | length = 0xff & (recieve[i+3] << 4 | (recieve[i+4] & 0x0F)); |
k4zuki | 13:3a32c5aa6f74 | 334 | |
k4zuki | 13:3a32c5aa6f74 | 335 | if(address & 0x01) { //read |
k4zuki | 13:3a32c5aa6f74 | 336 | ack = dev->read(address, send, length, false); //added |
k4zuki | 13:3a32c5aa6f74 | 337 | send[length] = ack; |
k4zuki | 13:3a32c5aa6f74 | 338 | length += 1; |
k4zuki | 13:3a32c5aa6f74 | 339 | i += 5; |
k4zuki | 13:3a32c5aa6f74 | 340 | } else { // write |
k4zuki | 13:3a32c5aa6f74 | 341 | for(int j = 0; j < (length * 2); j+=2) { |
k4zuki | 13:3a32c5aa6f74 | 342 | ack = 0xff&((recieve[5+j] << 4) | (recieve[6+j] & 0x0F)); |
k4zuki | 13:3a32c5aa6f74 | 343 | *(send+(j/2)) = ack; //added |
k4zuki | 13:3a32c5aa6f74 | 344 | } |
k4zuki | 13:3a32c5aa6f74 | 345 | ack = dev->write(address, send, length, true); //added |
k4zuki | 13:3a32c5aa6f74 | 346 | i += (5 + length * 2); |
k4zuki | 13:3a32c5aa6f74 | 347 | send[0] = ack; |
k4zuki | 13:3a32c5aa6f74 | 348 | length = 1; |
k4zuki | 0:9d12c615c8ea | 349 | } |
k4zuki | 13:3a32c5aa6f74 | 350 | }else{ |
k4zuki | 13:3a32c5aa6f74 | 351 | pc.printf("bad packet! %d, %d, %02X, %d\n\r",plength,i,recieve[(i+2)]&0x0F,ack); |
k4zuki | 13:3a32c5aa6f74 | 352 | s = false; |
k4zuki | 13:3a32c5aa6f74 | 353 | i = plength; |
k4zuki | 0:9d12c615c8ea | 354 | } |
k4zuki | 0:9d12c615c8ea | 355 | break; |
k4zuki | 13:3a32c5aa6f74 | 356 | } |
k4zuki | 13:3a32c5aa6f74 | 357 | case CMD_P: |
k4zuki | 13:3a32c5aa6f74 | 358 | { |
k4zuki | 13:3a32c5aa6f74 | 359 | if(s){ |
k4zuki | 13:3a32c5aa6f74 | 360 | dev->stop(); |
k4zuki | 13:3a32c5aa6f74 | 361 | s = false; |
k4zuki | 13:3a32c5aa6f74 | 362 | if(send[length-1] == 0){ |
k4zuki | 13:3a32c5aa6f74 | 363 | pc.printf("ACK,"); |
k4zuki | 13:3a32c5aa6f74 | 364 | }else{ |
k4zuki | 13:3a32c5aa6f74 | 365 | pc.printf("NAK,"); |
k4zuki | 13:3a32c5aa6f74 | 366 | } |
k4zuki | 13:3a32c5aa6f74 | 367 | length--; |
k4zuki | 13:3a32c5aa6f74 | 368 | } |
k4zuki | 13:3a32c5aa6f74 | 369 | i = plength; |
k4zuki | 12:dfd52d475cf8 | 370 | for(int j=0; j<length; j++) { |
k4zuki | 12:dfd52d475cf8 | 371 | pc.printf("%02X,",send[j]); |
k4zuki | 12:dfd52d475cf8 | 372 | } |
k4zuki | 0:9d12c615c8ea | 373 | pc.printf("ok\n\r"); |
k4zuki | 0:9d12c615c8ea | 374 | break; |
k4zuki | 13:3a32c5aa6f74 | 375 | } |
k4zuki | 13:3a32c5aa6f74 | 376 | case CMD_R: |
k4zuki | 13:3a32c5aa6f74 | 377 | { |
k4zuki | 14:1d3d43c0e6b4 | 378 | s = false; |
k4zuki | 13:3a32c5aa6f74 | 379 | length = plength - 2; |
k4zuki | 13:3a32c5aa6f74 | 380 | if(length < 1){ |
k4zuki | 13:3a32c5aa6f74 | 381 | pc.printf("bad packet! %d\n\r",length); |
k4zuki | 13:3a32c5aa6f74 | 382 | i = plength + 1; |
k4zuki | 13:3a32c5aa6f74 | 383 | length = 0; |
k4zuki | 13:3a32c5aa6f74 | 384 | }else{ |
k4zuki | 13:3a32c5aa6f74 | 385 | for(int j = 0; j < length; j++){ |
k4zuki | 13:3a32c5aa6f74 | 386 | address = recieve[i+1+j]; |
k4zuki | 13:3a32c5aa6f74 | 387 | switch(address){ |
k4zuki | 13:3a32c5aa6f74 | 388 | case CHIP_ID: |
k4zuki | 13:3a32c5aa6f74 | 389 | { |
k4zuki | 13:3a32c5aa6f74 | 390 | data = chip_id; |
k4zuki | 13:3a32c5aa6f74 | 391 | break; |
k4zuki | 13:3a32c5aa6f74 | 392 | } |
k4zuki | 13:3a32c5aa6f74 | 393 | case GPIO0_STAT: |
k4zuki | 13:3a32c5aa6f74 | 394 | { |
k4zuki | 13:3a32c5aa6f74 | 395 | for(int k = 0; k < 8; k++){ |
k4zuki | 13:3a32c5aa6f74 | 396 | _data = gpio0[k]->read(); |
k4zuki | 13:3a32c5aa6f74 | 397 | data |= (_data << k); |
k4zuki | 13:3a32c5aa6f74 | 398 | } |
k4zuki | 13:3a32c5aa6f74 | 399 | registers[GPIO0_STAT-'0'] = data; |
k4zuki | 13:3a32c5aa6f74 | 400 | break; |
k4zuki | 13:3a32c5aa6f74 | 401 | } |
k4zuki | 13:3a32c5aa6f74 | 402 | case GPIO0_CONF: |
k4zuki | 13:3a32c5aa6f74 | 403 | { |
k4zuki | 13:3a32c5aa6f74 | 404 | data = registers[GPIO0_CONF-'0']; |
k4zuki | 13:3a32c5aa6f74 | 405 | break; |
k4zuki | 13:3a32c5aa6f74 | 406 | } |
k4zuki | 13:3a32c5aa6f74 | 407 | #ifndef QUAD_I2C |
k4zuki | 14:1d3d43c0e6b4 | 408 | #warning "NOT QUAD_I2C" |
k4zuki | 13:3a32c5aa6f74 | 409 | case GPIO1_STAT: |
k4zuki | 13:3a32c5aa6f74 | 410 | { |
k4zuki | 13:3a32c5aa6f74 | 411 | for(int k = 0; k < 8; k++){ |
k4zuki | 13:3a32c5aa6f74 | 412 | _data = gpio1[k]->read(); |
k4zuki | 13:3a32c5aa6f74 | 413 | data |= (_data << k); |
k4zuki | 13:3a32c5aa6f74 | 414 | } |
k4zuki | 13:3a32c5aa6f74 | 415 | registers[GPIO1_STAT-'0'] = data; |
k4zuki | 13:3a32c5aa6f74 | 416 | break; |
k4zuki | 13:3a32c5aa6f74 | 417 | } |
k4zuki | 13:3a32c5aa6f74 | 418 | case GPIO1_CONF: |
k4zuki | 13:3a32c5aa6f74 | 419 | { |
k4zuki | 13:3a32c5aa6f74 | 420 | data = registers[GPIO1_CONF-'0']; |
k4zuki | 13:3a32c5aa6f74 | 421 | break; |
k4zuki | 13:3a32c5aa6f74 | 422 | } |
k4zuki | 13:3a32c5aa6f74 | 423 | #endif |
k4zuki | 13:3a32c5aa6f74 | 424 | case I2C_CONF: |
k4zuki | 13:3a32c5aa6f74 | 425 | { |
k4zuki | 13:3a32c5aa6f74 | 426 | data = registers[I2C_CONF-'0']; |
k4zuki | 13:3a32c5aa6f74 | 427 | break; |
k4zuki | 13:3a32c5aa6f74 | 428 | } |
k4zuki | 13:3a32c5aa6f74 | 429 | case SPI_CONF: |
k4zuki | 13:3a32c5aa6f74 | 430 | { |
k4zuki | 13:3a32c5aa6f74 | 431 | data = registers[SPI_CONF-'0']; |
k4zuki | 13:3a32c5aa6f74 | 432 | break; |
k4zuki | 13:3a32c5aa6f74 | 433 | } |
k4zuki | 13:3a32c5aa6f74 | 434 | default: |
k4zuki | 13:3a32c5aa6f74 | 435 | { |
k4zuki | 13:3a32c5aa6f74 | 436 | data = 0xAA; |
k4zuki | 13:3a32c5aa6f74 | 437 | break; |
k4zuki | 13:3a32c5aa6f74 | 438 | } |
k4zuki | 13:3a32c5aa6f74 | 439 | } |
k4zuki | 13:3a32c5aa6f74 | 440 | send[j] = (char)data; |
k4zuki | 13:3a32c5aa6f74 | 441 | data = 0; |
k4zuki | 13:3a32c5aa6f74 | 442 | } |
k4zuki | 13:3a32c5aa6f74 | 443 | i += (length+1); |
k4zuki | 13:3a32c5aa6f74 | 444 | } |
k4zuki | 0:9d12c615c8ea | 445 | break; |
k4zuki | 13:3a32c5aa6f74 | 446 | } |
k4zuki | 13:3a32c5aa6f74 | 447 | case CMD_W: |
k4zuki | 13:3a32c5aa6f74 | 448 | { |
k4zuki | 14:1d3d43c0e6b4 | 449 | s = false; |
k4zuki | 13:3a32c5aa6f74 | 450 | length = plength - 2; |
k4zuki | 13:3a32c5aa6f74 | 451 | if(length < 3){ |
k4zuki | 13:3a32c5aa6f74 | 452 | pc.printf("bad packet! %d\n\r",length); |
k4zuki | 13:3a32c5aa6f74 | 453 | i = plength + 1; |
k4zuki | 13:3a32c5aa6f74 | 454 | length = 0; |
k4zuki | 13:3a32c5aa6f74 | 455 | }else{ |
k4zuki | 13:3a32c5aa6f74 | 456 | for(int j = 0; j < length; j +=3){ |
k4zuki | 13:3a32c5aa6f74 | 457 | address = recieve[i+1+j]; |
k4zuki | 13:3a32c5aa6f74 | 458 | data = 0xff & (recieve[i+2+j] << 4 | (recieve[i+3+j] & 0x0F)); |
k4zuki | 13:3a32c5aa6f74 | 459 | _data = 0; |
k4zuki | 13:3a32c5aa6f74 | 460 | switch(address){ |
k4zuki | 13:3a32c5aa6f74 | 461 | case CHIP_ID: |
k4zuki | 13:3a32c5aa6f74 | 462 | { |
k4zuki | 13:3a32c5aa6f74 | 463 | //READ ONLY: do nothing |
k4zuki | 13:3a32c5aa6f74 | 464 | data = registers[CHIP_ID-'0']; |
k4zuki | 13:3a32c5aa6f74 | 465 | break; |
k4zuki | 13:3a32c5aa6f74 | 466 | } |
k4zuki | 13:3a32c5aa6f74 | 467 | case GPIO0_STAT: |
k4zuki | 13:3a32c5aa6f74 | 468 | { |
k4zuki | 13:3a32c5aa6f74 | 469 | _data = registers[GPIO0_CONF-'0']; |
k4zuki | 13:3a32c5aa6f74 | 470 | for(int k=0; k<8; k++){ |
k4zuki | 13:3a32c5aa6f74 | 471 | if(_data&0x01){ // output |
k4zuki | 13:3a32c5aa6f74 | 472 | gpio0[k]->write((data>>k)&0x01); |
k4zuki | 13:3a32c5aa6f74 | 473 | }else{ // input |
k4zuki | 13:3a32c5aa6f74 | 474 | ; // do nothing |
k4zuki | 13:3a32c5aa6f74 | 475 | } |
k4zuki | 13:3a32c5aa6f74 | 476 | _data >>= 1; |
k4zuki | 13:3a32c5aa6f74 | 477 | } |
k4zuki | 13:3a32c5aa6f74 | 478 | break; |
k4zuki | 13:3a32c5aa6f74 | 479 | } |
k4zuki | 13:3a32c5aa6f74 | 480 | case GPIO0_CONF: |
k4zuki | 13:3a32c5aa6f74 | 481 | { |
k4zuki | 13:3a32c5aa6f74 | 482 | registers[GPIO0_CONF-'0'] = data; |
k4zuki | 13:3a32c5aa6f74 | 483 | for(int k = 0; k < 8; k++){ |
k4zuki | 13:3a32c5aa6f74 | 484 | if(data & 0x01){//output |
k4zuki | 13:3a32c5aa6f74 | 485 | gpio0[k]->output(); |
k4zuki | 13:3a32c5aa6f74 | 486 | }else{//input |
k4zuki | 13:3a32c5aa6f74 | 487 | gpio0[k]->input(); |
k4zuki | 13:3a32c5aa6f74 | 488 | gpio0[k]->mode(PullUp); |
k4zuki | 13:3a32c5aa6f74 | 489 | } |
k4zuki | 13:3a32c5aa6f74 | 490 | data >>= 1; |
k4zuki | 13:3a32c5aa6f74 | 491 | } |
k4zuki | 13:3a32c5aa6f74 | 492 | data = registers[GPIO0_CONF-'0']; |
k4zuki | 13:3a32c5aa6f74 | 493 | break; |
k4zuki | 13:3a32c5aa6f74 | 494 | } |
k4zuki | 13:3a32c5aa6f74 | 495 | #ifndef QUAD_I2C |
k4zuki | 14:1d3d43c0e6b4 | 496 | #warning "NOT QUAD_I2C" |
k4zuki | 13:3a32c5aa6f74 | 497 | case GPIO1_STAT: |
k4zuki | 13:3a32c5aa6f74 | 498 | { |
k4zuki | 13:3a32c5aa6f74 | 499 | _data = registers[GPIO1_CONF-'0']; |
k4zuki | 13:3a32c5aa6f74 | 500 | for(int k = 0; k < 8; k++){ |
k4zuki | 13:3a32c5aa6f74 | 501 | if(_data & 0x01){ // output |
k4zuki | 13:3a32c5aa6f74 | 502 | gpio1[k]->write((data>>k)&0x01); |
k4zuki | 13:3a32c5aa6f74 | 503 | }else{ // input |
k4zuki | 13:3a32c5aa6f74 | 504 | ; // do nothing |
k4zuki | 13:3a32c5aa6f74 | 505 | } |
k4zuki | 13:3a32c5aa6f74 | 506 | _data >>= 1; |
k4zuki | 13:3a32c5aa6f74 | 507 | } |
k4zuki | 13:3a32c5aa6f74 | 508 | break; |
k4zuki | 13:3a32c5aa6f74 | 509 | } |
k4zuki | 13:3a32c5aa6f74 | 510 | case GPIO1_CONF: |
k4zuki | 13:3a32c5aa6f74 | 511 | { |
k4zuki | 13:3a32c5aa6f74 | 512 | registers[GPIO1_CONF-'0'] = data; |
k4zuki | 13:3a32c5aa6f74 | 513 | for(int k = 0; k < 6; k++){ |
k4zuki | 13:3a32c5aa6f74 | 514 | if(data & 0x01){//output |
k4zuki | 13:3a32c5aa6f74 | 515 | gpio1[k]->output(); |
k4zuki | 13:3a32c5aa6f74 | 516 | }else{//input |
k4zuki | 13:3a32c5aa6f74 | 517 | gpio1[k]->input(); |
k4zuki | 13:3a32c5aa6f74 | 518 | gpio1[k]->mode(PullUp); |
k4zuki | 13:3a32c5aa6f74 | 519 | } |
k4zuki | 13:3a32c5aa6f74 | 520 | data >>= 1; |
k4zuki | 13:3a32c5aa6f74 | 521 | } |
k4zuki | 13:3a32c5aa6f74 | 522 | data = registers[GPIO1_CONF-'0']; |
k4zuki | 13:3a32c5aa6f74 | 523 | break; |
k4zuki | 13:3a32c5aa6f74 | 524 | } |
k4zuki | 13:3a32c5aa6f74 | 525 | #endif |
k4zuki | 13:3a32c5aa6f74 | 526 | case I2C_CONF: |
k4zuki | 13:3a32c5aa6f74 | 527 | { |
k4zuki | 13:3a32c5aa6f74 | 528 | registers[I2C_CONF-'0'] = data; |
k4zuki | 13:3a32c5aa6f74 | 529 | dev1.frequency(200000 * ((0x03 & (data >> 6)) + 1)); |
k4zuki | 14:1d3d43c0e6b4 | 530 | #ifdef QUAD_I2C |
k4zuki | 14:1d3d43c0e6b4 | 531 | #warning "QUAD_I2C" |
k4zuki | 13:3a32c5aa6f74 | 532 | dev2.frequency(100000 * ((0x03 & (data >> 4)) + 1)); |
k4zuki | 13:3a32c5aa6f74 | 533 | dev3.frequency(100000 * ((0x03 & (data >> 2)) + 1)); |
k4zuki | 13:3a32c5aa6f74 | 534 | dev4.frequency(100000 * ((0x03 & (data >> 0)) + 1)); |
k4zuki | 14:1d3d43c0e6b4 | 535 | #endif |
k4zuki | 13:3a32c5aa6f74 | 536 | break; |
k4zuki | 13:3a32c5aa6f74 | 537 | } |
k4zuki | 13:3a32c5aa6f74 | 538 | case SPI_CONF: |
k4zuki | 13:3a32c5aa6f74 | 539 | { |
k4zuki | 13:3a32c5aa6f74 | 540 | registers[SPI_CONF-'0'] = data; |
k4zuki | 13:3a32c5aa6f74 | 541 | format = ((data & 0x04) + 4) << 1; |
k4zuki | 13:3a32c5aa6f74 | 542 | _spi.format(format, 0x03 & (data)); |
k4zuki | 13:3a32c5aa6f74 | 543 | _spi.frequency(1000000 * ((0x07 & (data >> 4)) + 1)); |
k4zuki | 13:3a32c5aa6f74 | 544 | enabled = (data & 0x08) >> 3; |
k4zuki | 16:dc75cd5b6f8c | 545 | /* |
k4zuki | 16:dc75cd5b6f8c | 546 | 7 not used |
k4zuki | 16:dc75cd5b6f8c | 547 | 6:4 frequency |
k4zuki | 16:dc75cd5b6f8c | 548 | 3 CE pol |
k4zuki | 16:dc75cd5b6f8c | 549 | 2 word size(0=8bit,1=16bit) |
k4zuki | 16:dc75cd5b6f8c | 550 | 1:0 pol(corresponds to spi.format()) |
k4zuki | 16:dc75cd5b6f8c | 551 | */ |
k4zuki | 14:1d3d43c0e6b4 | 552 | disabled = ~enabled; |
k4zuki | 13:3a32c5aa6f74 | 553 | break; |
k4zuki | 13:3a32c5aa6f74 | 554 | } |
k4zuki | 13:3a32c5aa6f74 | 555 | default: |
k4zuki | 13:3a32c5aa6f74 | 556 | { |
k4zuki | 13:3a32c5aa6f74 | 557 | break; |
k4zuki | 13:3a32c5aa6f74 | 558 | } |
k4zuki | 13:3a32c5aa6f74 | 559 | } |
k4zuki | 13:3a32c5aa6f74 | 560 | send[j/3] = data; |
k4zuki | 13:3a32c5aa6f74 | 561 | } |
k4zuki | 13:3a32c5aa6f74 | 562 | i += (length + 1); |
k4zuki | 13:3a32c5aa6f74 | 563 | length /= 3; |
k4zuki | 13:3a32c5aa6f74 | 564 | } |
k4zuki | 0:9d12c615c8ea | 565 | break; |
k4zuki | 13:3a32c5aa6f74 | 566 | } |
k4zuki | 13:3a32c5aa6f74 | 567 | case CMD_I: |
k4zuki | 13:3a32c5aa6f74 | 568 | { |
k4zuki | 14:1d3d43c0e6b4 | 569 | s = false; |
k4zuki | 13:3a32c5aa6f74 | 570 | length = plength - 2; |
k4zuki | 13:3a32c5aa6f74 | 571 | if(length < 1){ |
k4zuki | 13:3a32c5aa6f74 | 572 | pc.printf("bad packet! %d\n\r",length); |
k4zuki | 13:3a32c5aa6f74 | 573 | i = plength + 1; |
k4zuki | 13:3a32c5aa6f74 | 574 | length = 0; |
k4zuki | 13:3a32c5aa6f74 | 575 | }else{ |
k4zuki | 13:3a32c5aa6f74 | 576 | for(int j=0; j<length; j++){ |
k4zuki | 13:3a32c5aa6f74 | 577 | address = recieve[i+1+j]; |
k4zuki | 13:3a32c5aa6f74 | 578 | _data=0; |
k4zuki | 13:3a32c5aa6f74 | 579 | switch(address){ |
k4zuki | 13:3a32c5aa6f74 | 580 | case GPIO0_STAT: |
k4zuki | 13:3a32c5aa6f74 | 581 | { |
k4zuki | 13:3a32c5aa6f74 | 582 | for(int k=0; k<8; k++){ |
k4zuki | 13:3a32c5aa6f74 | 583 | _data = gpio0[k]->read(); |
k4zuki | 13:3a32c5aa6f74 | 584 | data |= (_data << k); |
k4zuki | 13:3a32c5aa6f74 | 585 | } |
k4zuki | 13:3a32c5aa6f74 | 586 | registers[GPIO0_STAT-'0'] = data; |
k4zuki | 13:3a32c5aa6f74 | 587 | break; |
k4zuki | 13:3a32c5aa6f74 | 588 | } |
k4zuki | 13:3a32c5aa6f74 | 589 | #ifndef QUAD_I2C |
k4zuki | 14:1d3d43c0e6b4 | 590 | #warning "NOT QUAD_I2C" |
k4zuki | 13:3a32c5aa6f74 | 591 | case GPIO1_STAT: |
k4zuki | 13:3a32c5aa6f74 | 592 | { |
k4zuki | 13:3a32c5aa6f74 | 593 | for(int k=0; k<8; k++){ |
k4zuki | 13:3a32c5aa6f74 | 594 | _data = gpio1[k]->read(); |
k4zuki | 13:3a32c5aa6f74 | 595 | data |= (_data << k); |
k4zuki | 13:3a32c5aa6f74 | 596 | } |
k4zuki | 13:3a32c5aa6f74 | 597 | registers[GPIO1_STAT-'0'] = data; |
k4zuki | 13:3a32c5aa6f74 | 598 | break; |
k4zuki | 13:3a32c5aa6f74 | 599 | } |
k4zuki | 13:3a32c5aa6f74 | 600 | #endif |
k4zuki | 13:3a32c5aa6f74 | 601 | default: |
k4zuki | 13:3a32c5aa6f74 | 602 | { |
k4zuki | 13:3a32c5aa6f74 | 603 | data = 0xAA; |
k4zuki | 13:3a32c5aa6f74 | 604 | break; |
k4zuki | 13:3a32c5aa6f74 | 605 | } |
k4zuki | 13:3a32c5aa6f74 | 606 | } |
k4zuki | 13:3a32c5aa6f74 | 607 | send[j] = (char)data; |
k4zuki | 13:3a32c5aa6f74 | 608 | data = 0; |
k4zuki | 13:3a32c5aa6f74 | 609 | } |
k4zuki | 13:3a32c5aa6f74 | 610 | i += (length+1); |
k4zuki | 13:3a32c5aa6f74 | 611 | } |
k4zuki | 0:9d12c615c8ea | 612 | break; |
k4zuki | 13:3a32c5aa6f74 | 613 | } |
k4zuki | 13:3a32c5aa6f74 | 614 | case CMD_O: |
k4zuki | 13:3a32c5aa6f74 | 615 | { |
k4zuki | 14:1d3d43c0e6b4 | 616 | s = false; |
k4zuki | 13:3a32c5aa6f74 | 617 | length = plength - 2; |
k4zuki | 13:3a32c5aa6f74 | 618 | if(length < 3){ |
k4zuki | 13:3a32c5aa6f74 | 619 | pc.printf("bad packet! %d\n\r",length); |
k4zuki | 13:3a32c5aa6f74 | 620 | i = plength + 1; |
k4zuki | 13:3a32c5aa6f74 | 621 | length = 0; |
k4zuki | 13:3a32c5aa6f74 | 622 | }else{ |
k4zuki | 13:3a32c5aa6f74 | 623 | for(int j=0; j<length; j+=3){ |
k4zuki | 13:3a32c5aa6f74 | 624 | address = recieve[i+1+j]; |
k4zuki | 13:3a32c5aa6f74 | 625 | data = 0xff & (recieve[i+2+j] << 4 | (recieve[i+3+j] & 0x0F)); |
k4zuki | 13:3a32c5aa6f74 | 626 | switch(address){ |
k4zuki | 13:3a32c5aa6f74 | 627 | case GPIO0_STAT: |
k4zuki | 13:3a32c5aa6f74 | 628 | { |
k4zuki | 13:3a32c5aa6f74 | 629 | _data = registers[GPIO0_CONF-'0']; |
k4zuki | 13:3a32c5aa6f74 | 630 | for(int k=0; k<8; k++){ |
k4zuki | 13:3a32c5aa6f74 | 631 | if(_data&0x01){ // output |
k4zuki | 13:3a32c5aa6f74 | 632 | gpio0[k]->write(data&0x01); |
k4zuki | 13:3a32c5aa6f74 | 633 | }else{ // input |
k4zuki | 13:3a32c5aa6f74 | 634 | ; // do nothing |
k4zuki | 13:3a32c5aa6f74 | 635 | } |
k4zuki | 13:3a32c5aa6f74 | 636 | data >>= 1; |
k4zuki | 13:3a32c5aa6f74 | 637 | _data >>= 1; |
k4zuki | 13:3a32c5aa6f74 | 638 | } |
k4zuki | 13:3a32c5aa6f74 | 639 | break; |
k4zuki | 13:3a32c5aa6f74 | 640 | } |
k4zuki | 13:3a32c5aa6f74 | 641 | #ifndef QUAD_I2C |
k4zuki | 14:1d3d43c0e6b4 | 642 | #warning "NOT QUAD_I2C" |
k4zuki | 13:3a32c5aa6f74 | 643 | case GPIO1_STAT: |
k4zuki | 13:3a32c5aa6f74 | 644 | { |
k4zuki | 13:3a32c5aa6f74 | 645 | _data = registers[GPIO1_CONF-'0']; |
k4zuki | 13:3a32c5aa6f74 | 646 | for(int k=0; k<8; k++){ |
k4zuki | 13:3a32c5aa6f74 | 647 | if(_data&0x01){ // output |
k4zuki | 13:3a32c5aa6f74 | 648 | gpio1[k]->write(data&0x01); |
k4zuki | 13:3a32c5aa6f74 | 649 | }else{ // input |
k4zuki | 13:3a32c5aa6f74 | 650 | ; // do nothing |
k4zuki | 13:3a32c5aa6f74 | 651 | } |
k4zuki | 13:3a32c5aa6f74 | 652 | data >>= 1; |
k4zuki | 13:3a32c5aa6f74 | 653 | _data >>= 1; |
k4zuki | 13:3a32c5aa6f74 | 654 | } |
k4zuki | 13:3a32c5aa6f74 | 655 | break; |
k4zuki | 13:3a32c5aa6f74 | 656 | } |
k4zuki | 13:3a32c5aa6f74 | 657 | #endif |
k4zuki | 13:3a32c5aa6f74 | 658 | default: |
k4zuki | 13:3a32c5aa6f74 | 659 | { |
k4zuki | 13:3a32c5aa6f74 | 660 | break; |
k4zuki | 13:3a32c5aa6f74 | 661 | } |
k4zuki | 13:3a32c5aa6f74 | 662 | } |
k4zuki | 13:3a32c5aa6f74 | 663 | send[j/3] = data; |
k4zuki | 13:3a32c5aa6f74 | 664 | } |
k4zuki | 13:3a32c5aa6f74 | 665 | } |
k4zuki | 13:3a32c5aa6f74 | 666 | i += (length+1); |
k4zuki | 13:3a32c5aa6f74 | 667 | length /= 3; |
k4zuki | 13:3a32c5aa6f74 | 668 | // pc.printf("command O is not implemented, "); |
k4zuki | 13:3a32c5aa6f74 | 669 | break; |
k4zuki | 13:3a32c5aa6f74 | 670 | } |
k4zuki | 13:3a32c5aa6f74 | 671 | case CMD_E: |
k4zuki | 13:3a32c5aa6f74 | 672 | { |
k4zuki | 14:1d3d43c0e6b4 | 673 | s = false; |
k4zuki | 13:3a32c5aa6f74 | 674 | /* |
k4zuki | 14:1d3d43c0e6b4 | 675 | "0| 1 2| 3 4| 5 6 7 8 9 10 11 12|13" //plength=14 |
k4zuki | 14:1d3d43c0e6b4 | 676 | "E| 0x_0 _1| 0x_0 _0| 0x_D _E| P" //minimum plength=8 |
k4zuki | 14:1d3d43c0e6b4 | 677 | "E| 0x_0 _1| 0x_0 _0| 0x_D _E|_A _D| P" //minimum plength=10(16bit) |
k4zuki | 13:3a32c5aa6f74 | 678 | "E| 0x_0 _4| 0x_0 _0| 0x_D _E _A _D _B _E _A _F| P" //write |
k4zuki | 13:3a32c5aa6f74 | 679 | "E| 0x_0 _4| 0x_0 _4| 0x_D _E _A _D _B _E _A _F| P" //write and read |
k4zuki | 13:3a32c5aa6f74 | 680 | */ |
k4zuki | 14:1d3d43c0e6b4 | 681 | length = plength - 2; //6 |
k4zuki | 14:1d3d43c0e6b4 | 682 | if(length < 6){ |
k4zuki | 13:3a32c5aa6f74 | 683 | pc.printf("bad packet! %d\n\r",length); |
k4zuki | 13:3a32c5aa6f74 | 684 | i = plength + 1; |
k4zuki | 13:3a32c5aa6f74 | 685 | length = 0; |
k4zuki | 13:3a32c5aa6f74 | 686 | }else{ |
k4zuki | 14:1d3d43c0e6b4 | 687 | length = length-4; //actual data in packet |
k4zuki | 13:3a32c5aa6f74 | 688 | data = 0xff & ((recieve[i+1]<<4) | (recieve[i+2]&0x0F)); // write length |
k4zuki | 14:1d3d43c0e6b4 | 689 | read = 0xff & ((recieve[i+3]<<4) | (recieve[i+4]&0x0F)); // read length |
k4zuki | 14:1d3d43c0e6b4 | 690 | switch(format){ |
k4zuki | 13:3a32c5aa6f74 | 691 | case 8: |
k4zuki | 13:3a32c5aa6f74 | 692 | { |
k4zuki | 13:3a32c5aa6f74 | 693 | _cs.write(enabled); |
k4zuki | 14:1d3d43c0e6b4 | 694 | for(int j = 0; j < length; j += 2){ |
k4zuki | 14:1d3d43c0e6b4 | 695 | _data = 0xff & ((recieve[i+5+j+0]<<4) | (recieve[i+5+j+1]&0x0F)); |
k4zuki | 13:3a32c5aa6f74 | 696 | ack = _spi.write(_data); |
k4zuki | 14:1d3d43c0e6b4 | 697 | // pc.printf("s%02X,",_data); |
k4zuki | 13:3a32c5aa6f74 | 698 | send[j/2] = ack; |
k4zuki | 13:3a32c5aa6f74 | 699 | } |
k4zuki | 14:1d3d43c0e6b4 | 700 | for(int j = length; j < (length+2*read); j+=2){ |
k4zuki | 14:1d3d43c0e6b4 | 701 | ack = _spi.write(0xAA); //dummy data to write |
k4zuki | 14:1d3d43c0e6b4 | 702 | // pc.printf("a%02X,",ack); |
k4zuki | 13:3a32c5aa6f74 | 703 | send[j/2] = ack; |
k4zuki | 13:3a32c5aa6f74 | 704 | } |
k4zuki | 14:1d3d43c0e6b4 | 705 | _cs.write(disabled); |
k4zuki | 13:3a32c5aa6f74 | 706 | break; |
k4zuki | 13:3a32c5aa6f74 | 707 | } |
k4zuki | 13:3a32c5aa6f74 | 708 | case 16: |
k4zuki | 13:3a32c5aa6f74 | 709 | { |
k4zuki | 14:1d3d43c0e6b4 | 710 | if((data%2) || (read%2)){ //invalid |
k4zuki | 14:1d3d43c0e6b4 | 711 | pc.printf("bad packet! %d, %d\n\r",data,read); |
k4zuki | 13:3a32c5aa6f74 | 712 | i = plength + 1; |
k4zuki | 13:3a32c5aa6f74 | 713 | length = 0; |
k4zuki | 13:3a32c5aa6f74 | 714 | }else{ |
k4zuki | 13:3a32c5aa6f74 | 715 | _cs.write(enabled); |
k4zuki | 14:1d3d43c0e6b4 | 716 | for(int j = 0; j < length; j += 4){ |
k4zuki | 14:1d3d43c0e6b4 | 717 | _data = 0xffff & (((recieve[i+5+j+0] & 0x0F)<<12)| |
k4zuki | 14:1d3d43c0e6b4 | 718 | ((recieve[i+5+j+1] & 0x0F)<<8 )| |
k4zuki | 14:1d3d43c0e6b4 | 719 | ((recieve[i+5+j+2] & 0x0F)<<4 )| |
k4zuki | 14:1d3d43c0e6b4 | 720 | ((recieve[i+5+j+3] & 0x0F)<<0 ) |
k4zuki | 14:1d3d43c0e6b4 | 721 | ); |
k4zuki | 13:3a32c5aa6f74 | 722 | ack = _spi.write(_data); |
k4zuki | 14:1d3d43c0e6b4 | 723 | // pc.printf("s%04X,",_data); |
k4zuki | 13:3a32c5aa6f74 | 724 | send[(j/2)+0] = 0xFF & (ack>>8); |
k4zuki | 13:3a32c5aa6f74 | 725 | send[(j/2)+1] = 0xFF & (ack>>0); |
k4zuki | 13:3a32c5aa6f74 | 726 | } |
k4zuki | 14:1d3d43c0e6b4 | 727 | for(int j = length; j < (length+2*read); j += 4){ |
k4zuki | 13:3a32c5aa6f74 | 728 | ack = _spi.write(0xAAAA); //dummy data to write |
k4zuki | 14:1d3d43c0e6b4 | 729 | // pc.printf("a%04X,",ack); |
k4zuki | 13:3a32c5aa6f74 | 730 | send[(j/2)+0] = 0xFF & (ack>>8); |
k4zuki | 13:3a32c5aa6f74 | 731 | send[(j/2)+1] = 0xFF & (ack>>0); |
k4zuki | 13:3a32c5aa6f74 | 732 | } |
k4zuki | 14:1d3d43c0e6b4 | 733 | _cs.write(disabled); |
k4zuki | 13:3a32c5aa6f74 | 734 | } |
k4zuki | 13:3a32c5aa6f74 | 735 | break; |
k4zuki | 13:3a32c5aa6f74 | 736 | } |
k4zuki | 14:1d3d43c0e6b4 | 737 | default: |
k4zuki | 14:1d3d43c0e6b4 | 738 | { |
k4zuki | 14:1d3d43c0e6b4 | 739 | pc.printf("this shold not happen %d\n\r",format); |
k4zuki | 14:1d3d43c0e6b4 | 740 | break; |
k4zuki | 14:1d3d43c0e6b4 | 741 | } |
k4zuki | 16:dc75cd5b6f8c | 742 | |
k4zuki | 13:3a32c5aa6f74 | 743 | } |
k4zuki | 14:1d3d43c0e6b4 | 744 | // pc.printf("command E is for SPI transmission\n\r"); |
k4zuki | 14:1d3d43c0e6b4 | 745 | length = read + data; |
k4zuki | 14:1d3d43c0e6b4 | 746 | i = (plength-1); |
k4zuki | 13:3a32c5aa6f74 | 747 | } |
k4zuki | 13:3a32c5aa6f74 | 748 | break; |
k4zuki | 13:3a32c5aa6f74 | 749 | } |
k4zuki | 0:9d12c615c8ea | 750 | case 'Z': |
k4zuki | 13:3a32c5aa6f74 | 751 | { |
k4zuki | 14:1d3d43c0e6b4 | 752 | s = false; |
k4zuki | 0:9d12c615c8ea | 753 | pc.printf("command Z is not implemented\n\r"); |
k4zuki | 0:9d12c615c8ea | 754 | i=plength; |
k4zuki | 0:9d12c615c8ea | 755 | break; |
k4zuki | 13:3a32c5aa6f74 | 756 | } |
k4zuki | 13:3a32c5aa6f74 | 757 | case 'V': |
k4zuki | 13:3a32c5aa6f74 | 758 | { |
k4zuki | 14:1d3d43c0e6b4 | 759 | s = false; |
k4zuki | 13:3a32c5aa6f74 | 760 | pc.printf("command V is not implemented\n\r"); |
k4zuki | 0:9d12c615c8ea | 761 | i=plength; |
k4zuki | 0:9d12c615c8ea | 762 | break; |
k4zuki | 13:3a32c5aa6f74 | 763 | } |
k4zuki | 13:3a32c5aa6f74 | 764 | default: |
k4zuki | 13:3a32c5aa6f74 | 765 | { |
k4zuki | 14:1d3d43c0e6b4 | 766 | s = false; |
k4zuki | 13:3a32c5aa6f74 | 767 | pc.printf("command %c is not implemented\n\r", recieve[i]); |
k4zuki | 13:3a32c5aa6f74 | 768 | i=plength; |
k4zuki | 13:3a32c5aa6f74 | 769 | break; |
k4zuki | 13:3a32c5aa6f74 | 770 | } |
k4zuki | 0:9d12c615c8ea | 771 | } |
k4zuki | 0:9d12c615c8ea | 772 | } |
k4zuki | 0:9d12c615c8ea | 773 | i=0; |
k4zuki | 12:dfd52d475cf8 | 774 | length=0; |
k4zuki | 0:9d12c615c8ea | 775 | } |
k4zuki | 0:9d12c615c8ea | 776 | } |