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