UART to I2C master(s) converter, targetting to emulate SC18IM700(NXP) chip

Dependencies:   mbed

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

LPC1768

LPC11U35

Quote:

LPC11U35 implement requires importing USBDevice library to use USBSerial class

visit https://github.com/K4zuki/tinyI2C for more information

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?

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