UART to I2C master(s) converter, targetting to emulate SC18IM700(NXP) chip
UART to I2C master(s) converter, targetting to emulate SC18IM700(NXP) chip
Features
up to 4x I2C master
- for LPC824 implement, we can use up to 4 channels of I2C masters
- 1x Fm+ and 3x Fm I2C channels
- for LPC1768 implement, we can use up to 2 channels of I2C masters
- 2x Fm I2C channels
- for LPC11U35 implement, only one channel for I2C master,
but program uses USB CDC class for UART communication (means no external USB-Serial converter chip)
- 1x Fm+ I2C channels
1x SPI master
up to 2x 8bit GPIO
Tested Platforms
LPC824
- https://developer.mbed.org/platforms/Switch-Science-mbed-LPC824/
- https://developer.mbed.org/platforms/LPCXpresso824-MAX/
LPC1768
LPC11U35
Quote:
LPC11U35 implement requires importing USBDevice library to use USBSerial class
visit https://github.com/K4zuki/tinyI2C for more information
main.cpp@0:b597ed665b76, 2016-08-30 (annotated)
- Committer:
- k4zuki
- Date:
- Tue Aug 30 18:31:12 2016 +0000
- Revision:
- 0:b597ed665b76
- Child:
- 2:feca9fa9a018
restart from empty
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
k4zuki | 0:b597ed665b76 | 1 | /** uart_i2c_conv for LPC824 |
k4zuki | 0:b597ed665b76 | 2 | */ |
k4zuki | 0:b597ed665b76 | 3 | |
k4zuki | 0:b597ed665b76 | 4 | #include "mbed.h" |
k4zuki | 0:b597ed665b76 | 5 | #include "settings.h" |
k4zuki | 0:b597ed665b76 | 6 | //Table 3. ASCII commands supported by SC18IM700 |
k4zuki | 0:b597ed665b76 | 7 | //ASCII command Hex value Command function |
k4zuki | 0:b597ed665b76 | 8 | //[X] S 0x53 I2C-bus START |
k4zuki | 0:b597ed665b76 | 9 | //[X] P 0x50 I2C/SPI-bus STOP |
k4zuki | 0:b597ed665b76 | 10 | //[X] R 0x52 read SC18IM700 internal register |
k4zuki | 0:b597ed665b76 | 11 | //[X] W 0x57 write to SC18IM700 internal register |
k4zuki | 0:b597ed665b76 | 12 | //[?] I 0x49 read GPIO port |
k4zuki | 0:b597ed665b76 | 13 | //[?] O 0x4F write to GPIO port |
k4zuki | 0:b597ed665b76 | 14 | //[_] Z 0x5A power down |
k4zuki | 0:b597ed665b76 | 15 | //[X] C 0x43 change channel |
k4zuki | 0:b597ed665b76 | 16 | //[_] E 0x45 SPI transfer start |
k4zuki | 0:b597ed665b76 | 17 | //[_] V 0x__ enable VDDIO output to chip |
k4zuki | 0:b597ed665b76 | 18 | |
k4zuki | 0:b597ed665b76 | 19 | /** |
k4zuki | 0:b597ed665b76 | 20 | "C| '0'| P" |
k4zuki | 0:b597ed665b76 | 21 | "C| '1'| P" |
k4zuki | 0:b597ed665b76 | 22 | "C| '2'| P" |
k4zuki | 0:b597ed665b76 | 23 | "C| '3'| P" |
k4zuki | 0:b597ed665b76 | 24 | "S| 0x_8 _0| 0x_0 _4| 0x_D _E _A _D _B _E _A _F| P" |
k4zuki | 0:b597ed665b76 | 25 | "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 | 0:b597ed665b76 | 26 | "S| 0x_8 _1| 0x_0 _4| P" |
k4zuki | 0:b597ed665b76 | 27 | "R| '0'| P" |
k4zuki | 0:b597ed665b76 | 28 | "R| '0'| '1'| ...| P" |
k4zuki | 0:b597ed665b76 | 29 | "W| '0' 0x_a _a| P" |
k4zuki | 0:b597ed665b76 | 30 | "W| '0' 0x_a _a| '1' 0x_b _b| ...| P" |
k4zuki | 0:b597ed665b76 | 31 | "I| '0'| P" |
k4zuki | 0:b597ed665b76 | 32 | "O| '0'| 0x_a _a| P" |
k4zuki | 0:b597ed665b76 | 33 | "E| 0x_0 _4| 0x_0 _0| 0x_D _E _A _D _B _E _A _F| P" //write |
k4zuki | 0:b597ed665b76 | 34 | "E| 0x_0 _4| 0x_0 _4| 0x_D _E _A _D _B _E _A _F| P" //write and read |
k4zuki | 0:b597ed665b76 | 35 | */ |
k4zuki | 0:b597ed665b76 | 36 | int main() |
k4zuki | 0:b597ed665b76 | 37 | { |
k4zuki | 0:b597ed665b76 | 38 | I2C* dev = &dev1; |
k4zuki | 0:b597ed665b76 | 39 | |
k4zuki | 0:b597ed665b76 | 40 | #ifdef isUART |
k4zuki | 0:b597ed665b76 | 41 | pc.baud(115200); |
k4zuki | 0:b597ed665b76 | 42 | #endif |
k4zuki | 0:b597ed665b76 | 43 | _spi.frequency(8000000); |
k4zuki | 0:b597ed665b76 | 44 | |
k4zuki | 0:b597ed665b76 | 45 | bool s = false; |
k4zuki | 0:b597ed665b76 | 46 | dev1.frequency(400000);//800k; works around 940kHz with 200ohm pullups/ not work at 1M? |
k4zuki | 0:b597ed665b76 | 47 | #if defined(TARGET_SSCI824) || defined(TARGET_LP824MAX) |
k4zuki | 0:b597ed665b76 | 48 | dev1.frequency(800000);//800k; works around 940kHz with 200ohm pullups/ not work at 1M? |
k4zuki | 0:b597ed665b76 | 49 | LPC_IOCON->PIO0_11 &= ~(0x03<<8); |
k4zuki | 0:b597ed665b76 | 50 | LPC_IOCON->PIO0_11 |= (0x02<<8); |
k4zuki | 0:b597ed665b76 | 51 | LPC_IOCON->PIO0_10 &= ~(0x03<<8); |
k4zuki | 0:b597ed665b76 | 52 | LPC_IOCON->PIO0_10 |= (0x02<<8); |
k4zuki | 0:b597ed665b76 | 53 | #elif defined(TARGET_MCU_LPC11U35_501) || defined(TARGET_LPC11U35_401) |
k4zuki | 0:b597ed665b76 | 54 | dev1.frequency(800000);//800k; works around 940kHz with 200ohm pullups/ not work at 1M? |
k4zuki | 0:b597ed665b76 | 55 | LPC_IOCON->PIO0_4 &= ~(0x03<<8); |
k4zuki | 0:b597ed665b76 | 56 | LPC_IOCON->PIO0_4 |= (0x02<<8); |
k4zuki | 0:b597ed665b76 | 57 | LPC_IOCON->PIO0_5 &= ~(0x03<<8); |
k4zuki | 0:b597ed665b76 | 58 | LPC_IOCON->PIO0_5 |= (0x02<<8); |
k4zuki | 0:b597ed665b76 | 59 | #endif |
k4zuki | 0:b597ed665b76 | 60 | |
k4zuki | 0:b597ed665b76 | 61 | #ifdef isI2C2 |
k4zuki | 0:b597ed665b76 | 62 | dev2.frequency(400000);//400k |
k4zuki | 0:b597ed665b76 | 63 | #endif |
k4zuki | 0:b597ed665b76 | 64 | #ifdef isI2C3 |
k4zuki | 0:b597ed665b76 | 65 | dev3.frequency(400000);//400k |
k4zuki | 0:b597ed665b76 | 66 | #endif |
k4zuki | 0:b597ed665b76 | 67 | #ifdef isI2C4 |
k4zuki | 0:b597ed665b76 | 68 | dev4.frequency(400000);//400k |
k4zuki | 0:b597ed665b76 | 69 | #endif |
k4zuki | 0:b597ed665b76 | 70 | #ifdef isGPIO1 |
k4zuki | 0:b597ed665b76 | 71 | DigitalInOut* gpio1[] = { |
k4zuki | 0:b597ed665b76 | 72 | &_GPIO10, |
k4zuki | 0:b597ed665b76 | 73 | &_GPIO11, |
k4zuki | 0:b597ed665b76 | 74 | &_GPIO12, |
k4zuki | 0:b597ed665b76 | 75 | &_GPIO13, |
k4zuki | 0:b597ed665b76 | 76 | &_GPIO14, |
k4zuki | 0:b597ed665b76 | 77 | &_GPIO15, |
k4zuki | 0:b597ed665b76 | 78 | &_GPIO16, |
k4zuki | 0:b597ed665b76 | 79 | &_GPIO17, |
k4zuki | 0:b597ed665b76 | 80 | }; |
k4zuki | 0:b597ed665b76 | 81 | for(int k = 0; k < 8; k++){ |
k4zuki | 0:b597ed665b76 | 82 | gpio1[k]->input(); |
k4zuki | 0:b597ed665b76 | 83 | gpio1[k]->mode( PullUp ); |
k4zuki | 0:b597ed665b76 | 84 | } |
k4zuki | 0:b597ed665b76 | 85 | #endif |
k4zuki | 0:b597ed665b76 | 86 | |
k4zuki | 0:b597ed665b76 | 87 | DigitalInOut* gpio0[] = { |
k4zuki | 0:b597ed665b76 | 88 | &_GPIO00, |
k4zuki | 0:b597ed665b76 | 89 | &_GPIO01, |
k4zuki | 0:b597ed665b76 | 90 | &_GPIO02, |
k4zuki | 0:b597ed665b76 | 91 | &_GPIO03, |
k4zuki | 0:b597ed665b76 | 92 | &_GPIO04, |
k4zuki | 0:b597ed665b76 | 93 | &_GPIO05, |
k4zuki | 0:b597ed665b76 | 94 | &_GPIO06, |
k4zuki | 0:b597ed665b76 | 95 | &_GPIO07, |
k4zuki | 0:b597ed665b76 | 96 | }; |
k4zuki | 0:b597ed665b76 | 97 | for(int k = 0; k < 8; k++){ |
k4zuki | 0:b597ed665b76 | 98 | gpio0[k]->input(); |
k4zuki | 0:b597ed665b76 | 99 | gpio0[k]->mode( PullUp ); |
k4zuki | 0:b597ed665b76 | 100 | } |
k4zuki | 0:b597ed665b76 | 101 | |
k4zuki | 0:b597ed665b76 | 102 | int ack = 0; |
k4zuki | 0:b597ed665b76 | 103 | int plength = 0; |
k4zuki | 0:b597ed665b76 | 104 | int recieve[256]; |
k4zuki | 0:b597ed665b76 | 105 | char send[256]; |
k4zuki | 0:b597ed665b76 | 106 | for(int k = 0; k < 256; k+=4){ |
k4zuki | 0:b597ed665b76 | 107 | // cafe moca |
k4zuki | 0:b597ed665b76 | 108 | recieve[k+0] = send[k+0] = 0xC4; |
k4zuki | 0:b597ed665b76 | 109 | recieve[k+1] = send[k+1] = 0xFE; |
k4zuki | 0:b597ed665b76 | 110 | recieve[k+2] = send[k+2] = 0xE0; |
k4zuki | 0:b597ed665b76 | 111 | recieve[k+3] = send[k+3] = 0xCA; |
k4zuki | 0:b597ed665b76 | 112 | } |
k4zuki | 0:b597ed665b76 | 113 | |
k4zuki | 0:b597ed665b76 | 114 | int read = 0; |
k4zuki | 0:b597ed665b76 | 115 | int address = 0; |
k4zuki | 0:b597ed665b76 | 116 | int data = 0; |
k4zuki | 0:b597ed665b76 | 117 | int _data = 0; |
k4zuki | 0:b597ed665b76 | 118 | int length = 0; |
k4zuki | 0:b597ed665b76 | 119 | int channel = 0; |
k4zuki | 0:b597ed665b76 | 120 | int format = 8; |
k4zuki | 0:b597ed665b76 | 121 | int enabled = 0; |
k4zuki | 0:b597ed665b76 | 122 | int disabled = 0; |
k4zuki | 0:b597ed665b76 | 123 | enum command_e { |
k4zuki | 0:b597ed665b76 | 124 | CMD_S='S', |
k4zuki | 0:b597ed665b76 | 125 | CMD_P='P', |
k4zuki | 0:b597ed665b76 | 126 | CMD_C='C', |
k4zuki | 0:b597ed665b76 | 127 | CMD_R='R', |
k4zuki | 0:b597ed665b76 | 128 | CMD_W='W', |
k4zuki | 0:b597ed665b76 | 129 | CMD_I='I', |
k4zuki | 0:b597ed665b76 | 130 | CMD_O='O', |
k4zuki | 0:b597ed665b76 | 131 | CMD_E='E', |
k4zuki | 0:b597ed665b76 | 132 | }; |
k4zuki | 0:b597ed665b76 | 133 | enum channel_e { |
k4zuki | 0:b597ed665b76 | 134 | CH0 = '0', |
k4zuki | 0:b597ed665b76 | 135 | CH1 = '1', |
k4zuki | 0:b597ed665b76 | 136 | CH2 = '2', |
k4zuki | 0:b597ed665b76 | 137 | CH3 = '3', |
k4zuki | 0:b597ed665b76 | 138 | }; |
k4zuki | 0:b597ed665b76 | 139 | enum register_e { |
k4zuki | 0:b597ed665b76 | 140 | CHIP_ID = '0', |
k4zuki | 0:b597ed665b76 | 141 | GPIO0_STAT = '1', |
k4zuki | 0:b597ed665b76 | 142 | GPIO1_STAT = '2', |
k4zuki | 0:b597ed665b76 | 143 | GPIO0_CONF = '3', |
k4zuki | 0:b597ed665b76 | 144 | GPIO1_CONF = '4', |
k4zuki | 0:b597ed665b76 | 145 | I2C_CONF = '5', |
k4zuki | 0:b597ed665b76 | 146 | SPI_CONF = '6', |
k4zuki | 0:b597ed665b76 | 147 | REG7, |
k4zuki | 0:b597ed665b76 | 148 | REG8, |
k4zuki | 0:b597ed665b76 | 149 | REG9, |
k4zuki | 0:b597ed665b76 | 150 | }; |
k4zuki | 0:b597ed665b76 | 151 | // enum chipID_e { |
k4zuki | 0:b597ed665b76 | 152 | // ID_LPC824 = '0', |
k4zuki | 0:b597ed665b76 | 153 | // ID_LPC1768 = '1', |
k4zuki | 0:b597ed665b76 | 154 | // ID_LPC11UXX = '2', |
k4zuki | 0:b597ed665b76 | 155 | // }; |
k4zuki | 0:b597ed665b76 | 156 | // static const uint8_t chip_id=ID_LPC824; |
k4zuki | 0:b597ed665b76 | 157 | static uint8_t registers[]={ |
k4zuki | 0:b597ed665b76 | 158 | chip_id, |
k4zuki | 0:b597ed665b76 | 159 | 0x00, |
k4zuki | 0:b597ed665b76 | 160 | 0x00, |
k4zuki | 0:b597ed665b76 | 161 | 0x00, |
k4zuki | 0:b597ed665b76 | 162 | 0x00, |
k4zuki | 0:b597ed665b76 | 163 | 0xFF, |
k4zuki | 0:b597ed665b76 | 164 | 0x70, |
k4zuki | 0:b597ed665b76 | 165 | REG7, |
k4zuki | 0:b597ed665b76 | 166 | REG8, |
k4zuki | 0:b597ed665b76 | 167 | REG9, |
k4zuki | 0:b597ed665b76 | 168 | }; |
k4zuki | 0:b597ed665b76 | 169 | |
k4zuki | 0:b597ed665b76 | 170 | int i=0; |
k4zuki | 0:b597ed665b76 | 171 | while(1) { |
k4zuki | 0:b597ed665b76 | 172 | i=0; |
k4zuki | 0:b597ed665b76 | 173 | length=0; |
k4zuki | 0:b597ed665b76 | 174 | while(true) { |
k4zuki | 0:b597ed665b76 | 175 | read = pc.getc(); |
k4zuki | 0:b597ed665b76 | 176 | recieve[i] = read; |
k4zuki | 0:b597ed665b76 | 177 | i++; |
k4zuki | 0:b597ed665b76 | 178 | if(read == 'P') { |
k4zuki | 0:b597ed665b76 | 179 | plength = i; |
k4zuki | 0:b597ed665b76 | 180 | break; |
k4zuki | 0:b597ed665b76 | 181 | } |
k4zuki | 0:b597ed665b76 | 182 | } |
k4zuki | 0:b597ed665b76 | 183 | i=0; |
k4zuki | 0:b597ed665b76 | 184 | while(i < plength) { |
k4zuki | 0:b597ed665b76 | 185 | switch(recieve[i]) { |
k4zuki | 0:b597ed665b76 | 186 | case CMD_C: |
k4zuki | 0:b597ed665b76 | 187 | { |
k4zuki | 0:b597ed665b76 | 188 | s = false; |
k4zuki | 0:b597ed665b76 | 189 | channel=recieve[i+1]; |
k4zuki | 0:b597ed665b76 | 190 | switch(channel) { |
k4zuki | 0:b597ed665b76 | 191 | case CH0: |
k4zuki | 0:b597ed665b76 | 192 | { |
k4zuki | 0:b597ed665b76 | 193 | channel = CH0; |
k4zuki | 0:b597ed665b76 | 194 | dev = &dev1; |
k4zuki | 0:b597ed665b76 | 195 | break; |
k4zuki | 0:b597ed665b76 | 196 | } |
k4zuki | 0:b597ed665b76 | 197 | #ifdef isI2C2 |
k4zuki | 0:b597ed665b76 | 198 | case CH1: |
k4zuki | 0:b597ed665b76 | 199 | { |
k4zuki | 0:b597ed665b76 | 200 | channel = CH1; |
k4zuki | 0:b597ed665b76 | 201 | dev = &dev2; |
k4zuki | 0:b597ed665b76 | 202 | break; |
k4zuki | 0:b597ed665b76 | 203 | } |
k4zuki | 0:b597ed665b76 | 204 | #endif |
k4zuki | 0:b597ed665b76 | 205 | #ifdef isI2C3 |
k4zuki | 0:b597ed665b76 | 206 | case CH2: |
k4zuki | 0:b597ed665b76 | 207 | { |
k4zuki | 0:b597ed665b76 | 208 | channel = CH2; |
k4zuki | 0:b597ed665b76 | 209 | dev = &dev3; |
k4zuki | 0:b597ed665b76 | 210 | break; |
k4zuki | 0:b597ed665b76 | 211 | } |
k4zuki | 0:b597ed665b76 | 212 | #endif |
k4zuki | 0:b597ed665b76 | 213 | #ifdef isI2C4 |
k4zuki | 0:b597ed665b76 | 214 | case CH3: |
k4zuki | 0:b597ed665b76 | 215 | { |
k4zuki | 0:b597ed665b76 | 216 | channel = CH3; |
k4zuki | 0:b597ed665b76 | 217 | dev = &dev4; |
k4zuki | 0:b597ed665b76 | 218 | break; |
k4zuki | 0:b597ed665b76 | 219 | } |
k4zuki | 0:b597ed665b76 | 220 | #endif |
k4zuki | 0:b597ed665b76 | 221 | default: |
k4zuki | 0:b597ed665b76 | 222 | { |
k4zuki | 0:b597ed665b76 | 223 | channel = CH0; |
k4zuki | 0:b597ed665b76 | 224 | dev = &dev1; |
k4zuki | 0:b597ed665b76 | 225 | break; |
k4zuki | 0:b597ed665b76 | 226 | } |
k4zuki | 0:b597ed665b76 | 227 | } |
k4zuki | 0:b597ed665b76 | 228 | i += 2; |
k4zuki | 0:b597ed665b76 | 229 | break; |
k4zuki | 0:b597ed665b76 | 230 | } |
k4zuki | 0:b597ed665b76 | 231 | case CMD_S: |
k4zuki | 0:b597ed665b76 | 232 | { |
k4zuki | 0:b597ed665b76 | 233 | s = true; |
k4zuki | 0:b597ed665b76 | 234 | ack = plength - 2 - (i+1) + (recieve[i+2] & 0x01); |
k4zuki | 0:b597ed665b76 | 235 | if(ack >= 4){ //valid packet |
k4zuki | 0:b597ed665b76 | 236 | address = 0xff & (recieve[i+1] << 4 | (recieve[i+2] & 0x0F)); |
k4zuki | 0:b597ed665b76 | 237 | length = 0xff & (recieve[i+3] << 4 | (recieve[i+4] & 0x0F)); |
k4zuki | 0:b597ed665b76 | 238 | |
k4zuki | 0:b597ed665b76 | 239 | if(address & 0x01) { //read |
k4zuki | 0:b597ed665b76 | 240 | ack = dev->read(address, send, length, false); //added |
k4zuki | 0:b597ed665b76 | 241 | send[length] = ack; |
k4zuki | 0:b597ed665b76 | 242 | length += 1; |
k4zuki | 0:b597ed665b76 | 243 | i += 5; |
k4zuki | 0:b597ed665b76 | 244 | } else { // write |
k4zuki | 0:b597ed665b76 | 245 | for(int j = 0; j < (length * 2); j+=2) { |
k4zuki | 0:b597ed665b76 | 246 | ack = 0xff&((recieve[5+j] << 4) | (recieve[6+j] & 0x0F)); |
k4zuki | 0:b597ed665b76 | 247 | *(send+(j/2)) = ack; //added |
k4zuki | 0:b597ed665b76 | 248 | } |
k4zuki | 0:b597ed665b76 | 249 | ack = dev->write(address, send, length, true); //added |
k4zuki | 0:b597ed665b76 | 250 | i += (5 + length * 2); |
k4zuki | 0:b597ed665b76 | 251 | send[0] = ack; |
k4zuki | 0:b597ed665b76 | 252 | length = 1; |
k4zuki | 0:b597ed665b76 | 253 | } |
k4zuki | 0:b597ed665b76 | 254 | }else{ |
k4zuki | 0:b597ed665b76 | 255 | pc.printf("bad packet! %d, %d, %02X, %d\n\r",plength,i,recieve[(i+2)]&0x0F,ack); |
k4zuki | 0:b597ed665b76 | 256 | s = false; |
k4zuki | 0:b597ed665b76 | 257 | i = plength; |
k4zuki | 0:b597ed665b76 | 258 | } |
k4zuki | 0:b597ed665b76 | 259 | break; |
k4zuki | 0:b597ed665b76 | 260 | } |
k4zuki | 0:b597ed665b76 | 261 | case CMD_P: |
k4zuki | 0:b597ed665b76 | 262 | { |
k4zuki | 0:b597ed665b76 | 263 | if(s){ |
k4zuki | 0:b597ed665b76 | 264 | dev->stop(); |
k4zuki | 0:b597ed665b76 | 265 | s = false; |
k4zuki | 0:b597ed665b76 | 266 | if(send[length-1] == 0){ |
k4zuki | 0:b597ed665b76 | 267 | pc.printf("ACK,"); |
k4zuki | 0:b597ed665b76 | 268 | }else{ |
k4zuki | 0:b597ed665b76 | 269 | pc.printf("NAK,"); |
k4zuki | 0:b597ed665b76 | 270 | } |
k4zuki | 0:b597ed665b76 | 271 | length--; |
k4zuki | 0:b597ed665b76 | 272 | } |
k4zuki | 0:b597ed665b76 | 273 | i = plength; |
k4zuki | 0:b597ed665b76 | 274 | for(int j=0; j<length; j++) { |
k4zuki | 0:b597ed665b76 | 275 | pc.printf("%02X,",send[j]); |
k4zuki | 0:b597ed665b76 | 276 | } |
k4zuki | 0:b597ed665b76 | 277 | pc.printf("ok\n\r"); |
k4zuki | 0:b597ed665b76 | 278 | break; |
k4zuki | 0:b597ed665b76 | 279 | } |
k4zuki | 0:b597ed665b76 | 280 | case CMD_R: |
k4zuki | 0:b597ed665b76 | 281 | { |
k4zuki | 0:b597ed665b76 | 282 | s = false; |
k4zuki | 0:b597ed665b76 | 283 | length = plength - 2; |
k4zuki | 0:b597ed665b76 | 284 | if(length < 1){ |
k4zuki | 0:b597ed665b76 | 285 | pc.printf("bad packet! %d\n\r",length); |
k4zuki | 0:b597ed665b76 | 286 | i = plength + 1; |
k4zuki | 0:b597ed665b76 | 287 | length = 0; |
k4zuki | 0:b597ed665b76 | 288 | }else{ |
k4zuki | 0:b597ed665b76 | 289 | for(int j = 0; j < length; j++){ |
k4zuki | 0:b597ed665b76 | 290 | address = recieve[i+1+j]; |
k4zuki | 0:b597ed665b76 | 291 | switch(address){ |
k4zuki | 0:b597ed665b76 | 292 | case CHIP_ID: |
k4zuki | 0:b597ed665b76 | 293 | { |
k4zuki | 0:b597ed665b76 | 294 | data = chip_id; |
k4zuki | 0:b597ed665b76 | 295 | break; |
k4zuki | 0:b597ed665b76 | 296 | } |
k4zuki | 0:b597ed665b76 | 297 | case GPIO0_STAT: |
k4zuki | 0:b597ed665b76 | 298 | { |
k4zuki | 0:b597ed665b76 | 299 | for(int k = 0; k < 8; k++){ |
k4zuki | 0:b597ed665b76 | 300 | _data = gpio0[k]->read(); |
k4zuki | 0:b597ed665b76 | 301 | data |= (_data << k); |
k4zuki | 0:b597ed665b76 | 302 | } |
k4zuki | 0:b597ed665b76 | 303 | registers[GPIO0_STAT-'0'] = data; |
k4zuki | 0:b597ed665b76 | 304 | break; |
k4zuki | 0:b597ed665b76 | 305 | } |
k4zuki | 0:b597ed665b76 | 306 | case GPIO0_CONF: |
k4zuki | 0:b597ed665b76 | 307 | { |
k4zuki | 0:b597ed665b76 | 308 | data = registers[GPIO0_CONF-'0']; |
k4zuki | 0:b597ed665b76 | 309 | break; |
k4zuki | 0:b597ed665b76 | 310 | } |
k4zuki | 0:b597ed665b76 | 311 | #ifdef isGPIO1 |
k4zuki | 0:b597ed665b76 | 312 | case GPIO1_STAT: |
k4zuki | 0:b597ed665b76 | 313 | { |
k4zuki | 0:b597ed665b76 | 314 | for(int k = 0; k < 8; k++){ |
k4zuki | 0:b597ed665b76 | 315 | _data = gpio1[k]->read(); |
k4zuki | 0:b597ed665b76 | 316 | data |= (_data << k); |
k4zuki | 0:b597ed665b76 | 317 | } |
k4zuki | 0:b597ed665b76 | 318 | registers[GPIO1_STAT-'0'] = data; |
k4zuki | 0:b597ed665b76 | 319 | break; |
k4zuki | 0:b597ed665b76 | 320 | } |
k4zuki | 0:b597ed665b76 | 321 | case GPIO1_CONF: |
k4zuki | 0:b597ed665b76 | 322 | { |
k4zuki | 0:b597ed665b76 | 323 | data = registers[GPIO1_CONF-'0']; |
k4zuki | 0:b597ed665b76 | 324 | break; |
k4zuki | 0:b597ed665b76 | 325 | } |
k4zuki | 0:b597ed665b76 | 326 | #endif |
k4zuki | 0:b597ed665b76 | 327 | case I2C_CONF: |
k4zuki | 0:b597ed665b76 | 328 | { |
k4zuki | 0:b597ed665b76 | 329 | data = registers[I2C_CONF-'0']; |
k4zuki | 0:b597ed665b76 | 330 | break; |
k4zuki | 0:b597ed665b76 | 331 | } |
k4zuki | 0:b597ed665b76 | 332 | case SPI_CONF: |
k4zuki | 0:b597ed665b76 | 333 | { |
k4zuki | 0:b597ed665b76 | 334 | data = registers[SPI_CONF-'0']; |
k4zuki | 0:b597ed665b76 | 335 | break; |
k4zuki | 0:b597ed665b76 | 336 | } |
k4zuki | 0:b597ed665b76 | 337 | default: |
k4zuki | 0:b597ed665b76 | 338 | { |
k4zuki | 0:b597ed665b76 | 339 | data = 0xAA; |
k4zuki | 0:b597ed665b76 | 340 | break; |
k4zuki | 0:b597ed665b76 | 341 | } |
k4zuki | 0:b597ed665b76 | 342 | } |
k4zuki | 0:b597ed665b76 | 343 | send[j] = (char)data; |
k4zuki | 0:b597ed665b76 | 344 | data = 0; |
k4zuki | 0:b597ed665b76 | 345 | } |
k4zuki | 0:b597ed665b76 | 346 | i += (length+1); |
k4zuki | 0:b597ed665b76 | 347 | } |
k4zuki | 0:b597ed665b76 | 348 | break; |
k4zuki | 0:b597ed665b76 | 349 | } |
k4zuki | 0:b597ed665b76 | 350 | case CMD_W: |
k4zuki | 0:b597ed665b76 | 351 | { |
k4zuki | 0:b597ed665b76 | 352 | s = false; |
k4zuki | 0:b597ed665b76 | 353 | length = plength - 2; |
k4zuki | 0:b597ed665b76 | 354 | if(length < 3){ |
k4zuki | 0:b597ed665b76 | 355 | pc.printf("bad packet! %d\n\r",length); |
k4zuki | 0:b597ed665b76 | 356 | i = plength + 1; |
k4zuki | 0:b597ed665b76 | 357 | length = 0; |
k4zuki | 0:b597ed665b76 | 358 | }else{ |
k4zuki | 0:b597ed665b76 | 359 | for(int j = 0; j < length; j +=3){ |
k4zuki | 0:b597ed665b76 | 360 | address = recieve[i+1+j]; |
k4zuki | 0:b597ed665b76 | 361 | data = 0xff & (recieve[i+2+j] << 4 | (recieve[i+3+j] & 0x0F)); |
k4zuki | 0:b597ed665b76 | 362 | _data = 0; |
k4zuki | 0:b597ed665b76 | 363 | switch(address){ |
k4zuki | 0:b597ed665b76 | 364 | case CHIP_ID: |
k4zuki | 0:b597ed665b76 | 365 | { |
k4zuki | 0:b597ed665b76 | 366 | //READ ONLY: do nothing |
k4zuki | 0:b597ed665b76 | 367 | data = registers[CHIP_ID-'0']; |
k4zuki | 0:b597ed665b76 | 368 | break; |
k4zuki | 0:b597ed665b76 | 369 | } |
k4zuki | 0:b597ed665b76 | 370 | case GPIO0_STAT: |
k4zuki | 0:b597ed665b76 | 371 | { |
k4zuki | 0:b597ed665b76 | 372 | _data = registers[GPIO0_CONF-'0']; |
k4zuki | 0:b597ed665b76 | 373 | for(int k=0; k<8; k++){ |
k4zuki | 0:b597ed665b76 | 374 | if(_data&0x01){ // output |
k4zuki | 0:b597ed665b76 | 375 | gpio0[k]->write((data>>k)&0x01); |
k4zuki | 0:b597ed665b76 | 376 | }else{ // input |
k4zuki | 0:b597ed665b76 | 377 | ; // do nothing |
k4zuki | 0:b597ed665b76 | 378 | } |
k4zuki | 0:b597ed665b76 | 379 | _data >>= 1; |
k4zuki | 0:b597ed665b76 | 380 | } |
k4zuki | 0:b597ed665b76 | 381 | break; |
k4zuki | 0:b597ed665b76 | 382 | } |
k4zuki | 0:b597ed665b76 | 383 | case GPIO0_CONF: |
k4zuki | 0:b597ed665b76 | 384 | { |
k4zuki | 0:b597ed665b76 | 385 | registers[GPIO0_CONF-'0'] = data; |
k4zuki | 0:b597ed665b76 | 386 | for(int k = 0; k < 8; k++){ |
k4zuki | 0:b597ed665b76 | 387 | if(data & 0x01){//output |
k4zuki | 0:b597ed665b76 | 388 | gpio0[k]->output(); |
k4zuki | 0:b597ed665b76 | 389 | }else{//input |
k4zuki | 0:b597ed665b76 | 390 | gpio0[k]->input(); |
k4zuki | 0:b597ed665b76 | 391 | gpio0[k]->mode(PullUp); |
k4zuki | 0:b597ed665b76 | 392 | } |
k4zuki | 0:b597ed665b76 | 393 | data >>= 1; |
k4zuki | 0:b597ed665b76 | 394 | } |
k4zuki | 0:b597ed665b76 | 395 | data = registers[GPIO0_CONF-'0']; |
k4zuki | 0:b597ed665b76 | 396 | break; |
k4zuki | 0:b597ed665b76 | 397 | } |
k4zuki | 0:b597ed665b76 | 398 | #ifdef isGPIO1 |
k4zuki | 0:b597ed665b76 | 399 | case GPIO1_STAT: |
k4zuki | 0:b597ed665b76 | 400 | { |
k4zuki | 0:b597ed665b76 | 401 | _data = registers[GPIO1_CONF-'0']; |
k4zuki | 0:b597ed665b76 | 402 | for(int k = 0; k < 8; k++){ |
k4zuki | 0:b597ed665b76 | 403 | if(_data & 0x01){ // output |
k4zuki | 0:b597ed665b76 | 404 | gpio1[k]->write((data>>k)&0x01); |
k4zuki | 0:b597ed665b76 | 405 | }else{ // input |
k4zuki | 0:b597ed665b76 | 406 | ; // do nothing |
k4zuki | 0:b597ed665b76 | 407 | } |
k4zuki | 0:b597ed665b76 | 408 | _data >>= 1; |
k4zuki | 0:b597ed665b76 | 409 | } |
k4zuki | 0:b597ed665b76 | 410 | break; |
k4zuki | 0:b597ed665b76 | 411 | } |
k4zuki | 0:b597ed665b76 | 412 | case GPIO1_CONF: |
k4zuki | 0:b597ed665b76 | 413 | { |
k4zuki | 0:b597ed665b76 | 414 | registers[GPIO1_CONF-'0'] = data; |
k4zuki | 0:b597ed665b76 | 415 | for(int k = 0; k < 6; k++){ |
k4zuki | 0:b597ed665b76 | 416 | if(data & 0x01){//output |
k4zuki | 0:b597ed665b76 | 417 | gpio1[k]->output(); |
k4zuki | 0:b597ed665b76 | 418 | }else{//input |
k4zuki | 0:b597ed665b76 | 419 | gpio1[k]->input(); |
k4zuki | 0:b597ed665b76 | 420 | gpio1[k]->mode(PullUp); |
k4zuki | 0:b597ed665b76 | 421 | } |
k4zuki | 0:b597ed665b76 | 422 | data >>= 1; |
k4zuki | 0:b597ed665b76 | 423 | } |
k4zuki | 0:b597ed665b76 | 424 | data = registers[GPIO1_CONF-'0']; |
k4zuki | 0:b597ed665b76 | 425 | break; |
k4zuki | 0:b597ed665b76 | 426 | } |
k4zuki | 0:b597ed665b76 | 427 | #endif |
k4zuki | 0:b597ed665b76 | 428 | case I2C_CONF: |
k4zuki | 0:b597ed665b76 | 429 | { |
k4zuki | 0:b597ed665b76 | 430 | registers[I2C_CONF-'0'] = data; |
k4zuki | 0:b597ed665b76 | 431 | #if defined(TARGET_LPC1768) |
k4zuki | 0:b597ed665b76 | 432 | dev1.frequency(100000 * ((0x03 & (data >> 6)) + 1)); |
k4zuki | 0:b597ed665b76 | 433 | #else |
k4zuki | 0:b597ed665b76 | 434 | dev1.frequency(200000 * ((0x03 & (data >> 6)) + 1)); |
k4zuki | 0:b597ed665b76 | 435 | #endif |
k4zuki | 0:b597ed665b76 | 436 | #ifdef isI2C2 |
k4zuki | 0:b597ed665b76 | 437 | dev2.frequency(100000 * ((0x03 & (data >> 4)) + 1)); |
k4zuki | 0:b597ed665b76 | 438 | #endif |
k4zuki | 0:b597ed665b76 | 439 | #ifdef isI2C3 |
k4zuki | 0:b597ed665b76 | 440 | dev3.frequency(100000 * ((0x03 & (data >> 2)) + 1)); |
k4zuki | 0:b597ed665b76 | 441 | #endif |
k4zuki | 0:b597ed665b76 | 442 | #ifdef isI2C4 |
k4zuki | 0:b597ed665b76 | 443 | dev4.frequency(100000 * ((0x03 & (data >> 0)) + 1)); |
k4zuki | 0:b597ed665b76 | 444 | #endif |
k4zuki | 0:b597ed665b76 | 445 | break; |
k4zuki | 0:b597ed665b76 | 446 | } |
k4zuki | 0:b597ed665b76 | 447 | case SPI_CONF: |
k4zuki | 0:b597ed665b76 | 448 | { |
k4zuki | 0:b597ed665b76 | 449 | registers[SPI_CONF-'0'] = data; |
k4zuki | 0:b597ed665b76 | 450 | format = ((data & 0x04) + 4) << 1; |
k4zuki | 0:b597ed665b76 | 451 | _spi.format(format, 0x03 & (data)); |
k4zuki | 0:b597ed665b76 | 452 | _spi.frequency(1000000 * ((0x07 & (data >> 4)) + 1)); |
k4zuki | 0:b597ed665b76 | 453 | enabled = (data & 0x08) >> 3; |
k4zuki | 0:b597ed665b76 | 454 | /* |
k4zuki | 0:b597ed665b76 | 455 | 7 not used |
k4zuki | 0:b597ed665b76 | 456 | 6:4 frequency |
k4zuki | 0:b597ed665b76 | 457 | 3 CE pol |
k4zuki | 0:b597ed665b76 | 458 | 2 word size(0=8bit,1=16bit) |
k4zuki | 0:b597ed665b76 | 459 | 1:0 pol(corresponds to spi.format()) |
k4zuki | 0:b597ed665b76 | 460 | */ |
k4zuki | 0:b597ed665b76 | 461 | disabled = ~enabled; |
k4zuki | 0:b597ed665b76 | 462 | break; |
k4zuki | 0:b597ed665b76 | 463 | } |
k4zuki | 0:b597ed665b76 | 464 | default: |
k4zuki | 0:b597ed665b76 | 465 | { |
k4zuki | 0:b597ed665b76 | 466 | break; |
k4zuki | 0:b597ed665b76 | 467 | } |
k4zuki | 0:b597ed665b76 | 468 | } |
k4zuki | 0:b597ed665b76 | 469 | send[j/3] = data; |
k4zuki | 0:b597ed665b76 | 470 | } |
k4zuki | 0:b597ed665b76 | 471 | i += (length + 1); |
k4zuki | 0:b597ed665b76 | 472 | length /= 3; |
k4zuki | 0:b597ed665b76 | 473 | } |
k4zuki | 0:b597ed665b76 | 474 | break; |
k4zuki | 0:b597ed665b76 | 475 | } |
k4zuki | 0:b597ed665b76 | 476 | case CMD_I: |
k4zuki | 0:b597ed665b76 | 477 | { |
k4zuki | 0:b597ed665b76 | 478 | s = false; |
k4zuki | 0:b597ed665b76 | 479 | length = plength - 2; |
k4zuki | 0:b597ed665b76 | 480 | if(length < 1){ |
k4zuki | 0:b597ed665b76 | 481 | pc.printf("bad packet! %d\n\r",length); |
k4zuki | 0:b597ed665b76 | 482 | i = plength + 1; |
k4zuki | 0:b597ed665b76 | 483 | length = 0; |
k4zuki | 0:b597ed665b76 | 484 | }else{ |
k4zuki | 0:b597ed665b76 | 485 | for(int j=0; j<length; j++){ |
k4zuki | 0:b597ed665b76 | 486 | address = recieve[i+1+j]; |
k4zuki | 0:b597ed665b76 | 487 | _data=0; |
k4zuki | 0:b597ed665b76 | 488 | switch(address){ |
k4zuki | 0:b597ed665b76 | 489 | case GPIO0_STAT: |
k4zuki | 0:b597ed665b76 | 490 | { |
k4zuki | 0:b597ed665b76 | 491 | for(int k=0; k<8; k++){ |
k4zuki | 0:b597ed665b76 | 492 | _data = gpio0[k]->read(); |
k4zuki | 0:b597ed665b76 | 493 | data |= (_data << k); |
k4zuki | 0:b597ed665b76 | 494 | } |
k4zuki | 0:b597ed665b76 | 495 | registers[GPIO0_STAT-'0'] = data; |
k4zuki | 0:b597ed665b76 | 496 | break; |
k4zuki | 0:b597ed665b76 | 497 | } |
k4zuki | 0:b597ed665b76 | 498 | #ifdef isGPIO1 |
k4zuki | 0:b597ed665b76 | 499 | case GPIO1_STAT: |
k4zuki | 0:b597ed665b76 | 500 | { |
k4zuki | 0:b597ed665b76 | 501 | for(int k=0; k<8; k++){ |
k4zuki | 0:b597ed665b76 | 502 | _data = gpio1[k]->read(); |
k4zuki | 0:b597ed665b76 | 503 | data |= (_data << k); |
k4zuki | 0:b597ed665b76 | 504 | } |
k4zuki | 0:b597ed665b76 | 505 | registers[GPIO1_STAT-'0'] = data; |
k4zuki | 0:b597ed665b76 | 506 | break; |
k4zuki | 0:b597ed665b76 | 507 | } |
k4zuki | 0:b597ed665b76 | 508 | #endif |
k4zuki | 0:b597ed665b76 | 509 | default: |
k4zuki | 0:b597ed665b76 | 510 | { |
k4zuki | 0:b597ed665b76 | 511 | data = 0xAA; |
k4zuki | 0:b597ed665b76 | 512 | break; |
k4zuki | 0:b597ed665b76 | 513 | } |
k4zuki | 0:b597ed665b76 | 514 | } |
k4zuki | 0:b597ed665b76 | 515 | send[j] = (char)data; |
k4zuki | 0:b597ed665b76 | 516 | data = 0; |
k4zuki | 0:b597ed665b76 | 517 | } |
k4zuki | 0:b597ed665b76 | 518 | i += (length+1); |
k4zuki | 0:b597ed665b76 | 519 | } |
k4zuki | 0:b597ed665b76 | 520 | break; |
k4zuki | 0:b597ed665b76 | 521 | } |
k4zuki | 0:b597ed665b76 | 522 | case CMD_O: |
k4zuki | 0:b597ed665b76 | 523 | { |
k4zuki | 0:b597ed665b76 | 524 | s = false; |
k4zuki | 0:b597ed665b76 | 525 | length = plength - 2; |
k4zuki | 0:b597ed665b76 | 526 | if(length < 3){ |
k4zuki | 0:b597ed665b76 | 527 | pc.printf("bad packet! %d\n\r",length); |
k4zuki | 0:b597ed665b76 | 528 | i = plength + 1; |
k4zuki | 0:b597ed665b76 | 529 | length = 0; |
k4zuki | 0:b597ed665b76 | 530 | }else{ |
k4zuki | 0:b597ed665b76 | 531 | for(int j=0; j<length; j+=3){ |
k4zuki | 0:b597ed665b76 | 532 | address = recieve[i+1+j]; |
k4zuki | 0:b597ed665b76 | 533 | data = 0xff & (recieve[i+2+j] << 4 | (recieve[i+3+j] & 0x0F)); |
k4zuki | 0:b597ed665b76 | 534 | switch(address){ |
k4zuki | 0:b597ed665b76 | 535 | case GPIO0_STAT: |
k4zuki | 0:b597ed665b76 | 536 | { |
k4zuki | 0:b597ed665b76 | 537 | _data = registers[GPIO0_CONF-'0']; |
k4zuki | 0:b597ed665b76 | 538 | for(int k=0; k<8; k++){ |
k4zuki | 0:b597ed665b76 | 539 | if(_data&0x01){ // output |
k4zuki | 0:b597ed665b76 | 540 | gpio0[k]->write(data&0x01); |
k4zuki | 0:b597ed665b76 | 541 | }else{ // input |
k4zuki | 0:b597ed665b76 | 542 | ; // do nothing |
k4zuki | 0:b597ed665b76 | 543 | } |
k4zuki | 0:b597ed665b76 | 544 | data >>= 1; |
k4zuki | 0:b597ed665b76 | 545 | _data >>= 1; |
k4zuki | 0:b597ed665b76 | 546 | } |
k4zuki | 0:b597ed665b76 | 547 | break; |
k4zuki | 0:b597ed665b76 | 548 | } |
k4zuki | 0:b597ed665b76 | 549 | #ifdef isGPIO1 |
k4zuki | 0:b597ed665b76 | 550 | case GPIO1_STAT: |
k4zuki | 0:b597ed665b76 | 551 | { |
k4zuki | 0:b597ed665b76 | 552 | _data = registers[GPIO1_CONF-'0']; |
k4zuki | 0:b597ed665b76 | 553 | for(int k=0; k<8; k++){ |
k4zuki | 0:b597ed665b76 | 554 | if(_data&0x01){ // output |
k4zuki | 0:b597ed665b76 | 555 | gpio1[k]->write(data&0x01); |
k4zuki | 0:b597ed665b76 | 556 | }else{ // input |
k4zuki | 0:b597ed665b76 | 557 | ; // do nothing |
k4zuki | 0:b597ed665b76 | 558 | } |
k4zuki | 0:b597ed665b76 | 559 | data >>= 1; |
k4zuki | 0:b597ed665b76 | 560 | _data >>= 1; |
k4zuki | 0:b597ed665b76 | 561 | } |
k4zuki | 0:b597ed665b76 | 562 | break; |
k4zuki | 0:b597ed665b76 | 563 | } |
k4zuki | 0:b597ed665b76 | 564 | #endif |
k4zuki | 0:b597ed665b76 | 565 | default: |
k4zuki | 0:b597ed665b76 | 566 | { |
k4zuki | 0:b597ed665b76 | 567 | break; |
k4zuki | 0:b597ed665b76 | 568 | } |
k4zuki | 0:b597ed665b76 | 569 | } |
k4zuki | 0:b597ed665b76 | 570 | send[j/3] = data; |
k4zuki | 0:b597ed665b76 | 571 | } |
k4zuki | 0:b597ed665b76 | 572 | } |
k4zuki | 0:b597ed665b76 | 573 | i += (length+1); |
k4zuki | 0:b597ed665b76 | 574 | length /= 3; |
k4zuki | 0:b597ed665b76 | 575 | // pc.printf("command O is not implemented, "); |
k4zuki | 0:b597ed665b76 | 576 | break; |
k4zuki | 0:b597ed665b76 | 577 | } |
k4zuki | 0:b597ed665b76 | 578 | case CMD_E: |
k4zuki | 0:b597ed665b76 | 579 | { |
k4zuki | 0:b597ed665b76 | 580 | s = false; |
k4zuki | 0:b597ed665b76 | 581 | /* |
k4zuki | 0:b597ed665b76 | 582 | "0| 1 2| 3 4| 5 6 7 8 9 10 11 12|13" //plength=14 |
k4zuki | 0:b597ed665b76 | 583 | "E| 0x_0 _1| 0x_0 _0| 0x_D _E| P" //minimum plength=8 |
k4zuki | 0:b597ed665b76 | 584 | "E| 0x_0 _1| 0x_0 _0| 0x_D _E|_A _D| P" //minimum plength=10(16bit) |
k4zuki | 0:b597ed665b76 | 585 | "E| 0x_0 _4| 0x_0 _0| 0x_D _E _A _D _B _E _A _F| P" //write |
k4zuki | 0:b597ed665b76 | 586 | "E| 0x_0 _4| 0x_0 _4| 0x_D _E _A _D _B _E _A _F| P" //write and read |
k4zuki | 0:b597ed665b76 | 587 | */ |
k4zuki | 0:b597ed665b76 | 588 | length = plength - 2; //6 |
k4zuki | 0:b597ed665b76 | 589 | if(length < 6){ |
k4zuki | 0:b597ed665b76 | 590 | pc.printf("bad packet! %d\n\r",length); |
k4zuki | 0:b597ed665b76 | 591 | i = plength + 1; |
k4zuki | 0:b597ed665b76 | 592 | length = 0; |
k4zuki | 0:b597ed665b76 | 593 | }else{ |
k4zuki | 0:b597ed665b76 | 594 | length = length-4; //actual data in packet |
k4zuki | 0:b597ed665b76 | 595 | data = 0xff & ((recieve[i+1]<<4) | (recieve[i+2]&0x0F)); // write length |
k4zuki | 0:b597ed665b76 | 596 | read = 0xff & ((recieve[i+3]<<4) | (recieve[i+4]&0x0F)); // read length |
k4zuki | 0:b597ed665b76 | 597 | switch(format){ |
k4zuki | 0:b597ed665b76 | 598 | case 8: |
k4zuki | 0:b597ed665b76 | 599 | { |
k4zuki | 0:b597ed665b76 | 600 | _cs.write(enabled); |
k4zuki | 0:b597ed665b76 | 601 | for(int j = 0; j < length; j += 2){ |
k4zuki | 0:b597ed665b76 | 602 | _data = 0xff & ((recieve[i+5+j+0]<<4) | (recieve[i+5+j+1]&0x0F)); |
k4zuki | 0:b597ed665b76 | 603 | ack = _spi.write(_data); |
k4zuki | 0:b597ed665b76 | 604 | // pc.printf("s%02X,",_data); |
k4zuki | 0:b597ed665b76 | 605 | send[j/2] = ack; |
k4zuki | 0:b597ed665b76 | 606 | } |
k4zuki | 0:b597ed665b76 | 607 | for(int j = length; j < (length+2*read); j+=2){ |
k4zuki | 0:b597ed665b76 | 608 | ack = _spi.write(0xAA); //dummy data to write |
k4zuki | 0:b597ed665b76 | 609 | // pc.printf("a%02X,",ack); |
k4zuki | 0:b597ed665b76 | 610 | send[j/2] = ack; |
k4zuki | 0:b597ed665b76 | 611 | } |
k4zuki | 0:b597ed665b76 | 612 | _cs.write(disabled); |
k4zuki | 0:b597ed665b76 | 613 | break; |
k4zuki | 0:b597ed665b76 | 614 | } |
k4zuki | 0:b597ed665b76 | 615 | case 16: |
k4zuki | 0:b597ed665b76 | 616 | { |
k4zuki | 0:b597ed665b76 | 617 | if((data%2) || (read%2)){ //invalid |
k4zuki | 0:b597ed665b76 | 618 | pc.printf("bad packet! %d, %d\n\r",data,read); |
k4zuki | 0:b597ed665b76 | 619 | i = plength + 1; |
k4zuki | 0:b597ed665b76 | 620 | length = 0; |
k4zuki | 0:b597ed665b76 | 621 | }else{ |
k4zuki | 0:b597ed665b76 | 622 | _cs.write(enabled); |
k4zuki | 0:b597ed665b76 | 623 | for(int j = 0; j < length; j += 4){ |
k4zuki | 0:b597ed665b76 | 624 | _data = 0xffff & (((recieve[i+5+j+0] & 0x0F)<<12)| |
k4zuki | 0:b597ed665b76 | 625 | ((recieve[i+5+j+1] & 0x0F)<<8 )| |
k4zuki | 0:b597ed665b76 | 626 | ((recieve[i+5+j+2] & 0x0F)<<4 )| |
k4zuki | 0:b597ed665b76 | 627 | ((recieve[i+5+j+3] & 0x0F)<<0 ) |
k4zuki | 0:b597ed665b76 | 628 | ); |
k4zuki | 0:b597ed665b76 | 629 | ack = _spi.write(_data); |
k4zuki | 0:b597ed665b76 | 630 | // pc.printf("s%04X,",_data); |
k4zuki | 0:b597ed665b76 | 631 | send[(j/2)+0] = 0xFF & (ack>>8); |
k4zuki | 0:b597ed665b76 | 632 | send[(j/2)+1] = 0xFF & (ack>>0); |
k4zuki | 0:b597ed665b76 | 633 | } |
k4zuki | 0:b597ed665b76 | 634 | for(int j = length; j < (length+2*read); j += 4){ |
k4zuki | 0:b597ed665b76 | 635 | ack = _spi.write(0xAAAA); //dummy data to write |
k4zuki | 0:b597ed665b76 | 636 | // pc.printf("a%04X,",ack); |
k4zuki | 0:b597ed665b76 | 637 | send[(j/2)+0] = 0xFF & (ack>>8); |
k4zuki | 0:b597ed665b76 | 638 | send[(j/2)+1] = 0xFF & (ack>>0); |
k4zuki | 0:b597ed665b76 | 639 | } |
k4zuki | 0:b597ed665b76 | 640 | _cs.write(disabled); |
k4zuki | 0:b597ed665b76 | 641 | } |
k4zuki | 0:b597ed665b76 | 642 | break; |
k4zuki | 0:b597ed665b76 | 643 | } |
k4zuki | 0:b597ed665b76 | 644 | default: |
k4zuki | 0:b597ed665b76 | 645 | { |
k4zuki | 0:b597ed665b76 | 646 | pc.printf("this shold not happen %d\n\r",format); |
k4zuki | 0:b597ed665b76 | 647 | break; |
k4zuki | 0:b597ed665b76 | 648 | } |
k4zuki | 0:b597ed665b76 | 649 | |
k4zuki | 0:b597ed665b76 | 650 | } |
k4zuki | 0:b597ed665b76 | 651 | // pc.printf("command E is for SPI transmission\n\r"); |
k4zuki | 0:b597ed665b76 | 652 | length = read + data; |
k4zuki | 0:b597ed665b76 | 653 | i = (plength-1); |
k4zuki | 0:b597ed665b76 | 654 | } |
k4zuki | 0:b597ed665b76 | 655 | break; |
k4zuki | 0:b597ed665b76 | 656 | } |
k4zuki | 0:b597ed665b76 | 657 | case 'Z': |
k4zuki | 0:b597ed665b76 | 658 | { |
k4zuki | 0:b597ed665b76 | 659 | s = false; |
k4zuki | 0:b597ed665b76 | 660 | pc.printf("command Z is not implemented\n\r"); |
k4zuki | 0:b597ed665b76 | 661 | i=plength; |
k4zuki | 0:b597ed665b76 | 662 | break; |
k4zuki | 0:b597ed665b76 | 663 | } |
k4zuki | 0:b597ed665b76 | 664 | case 'V': |
k4zuki | 0:b597ed665b76 | 665 | { |
k4zuki | 0:b597ed665b76 | 666 | s = false; |
k4zuki | 0:b597ed665b76 | 667 | pc.printf("command V is not implemented\n\r"); |
k4zuki | 0:b597ed665b76 | 668 | i=plength; |
k4zuki | 0:b597ed665b76 | 669 | break; |
k4zuki | 0:b597ed665b76 | 670 | } |
k4zuki | 0:b597ed665b76 | 671 | default: |
k4zuki | 0:b597ed665b76 | 672 | { |
k4zuki | 0:b597ed665b76 | 673 | s = false; |
k4zuki | 0:b597ed665b76 | 674 | pc.printf("command %c is not implemented\n\r", recieve[i]); |
k4zuki | 0:b597ed665b76 | 675 | i=plength; |
k4zuki | 0:b597ed665b76 | 676 | break; |
k4zuki | 0:b597ed665b76 | 677 | } |
k4zuki | 0:b597ed665b76 | 678 | } |
k4zuki | 0:b597ed665b76 | 679 | } |
k4zuki | 0:b597ed665b76 | 680 | i=0; |
k4zuki | 0:b597ed665b76 | 681 | length=0; |
k4zuki | 0:b597ed665b76 | 682 | } |
k4zuki | 0:b597ed665b76 | 683 | } |
k4zuki | 0:b597ed665b76 | 684 |