only for LPC824 chip to match hardware I2C channels(2->4)

Dependencies:   mbed

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?

UserRevisionLine numberNew 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 }