Kazuki Yamamoto / Mbed 2 deprecated uart_i2c_conv

Dependencies:   mbed

Revision:
5:07f7000ec747
Child:
9:844e301ab0fd
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/LPC824/main.cpp	Wed Dec 03 15:44:33 2014 +0900
@@ -0,0 +1,258 @@
+#include "mbed.h"
+
+Serial pc(USBTX,USBRX);
+//Serial mon(D1,NC);
+/*
+    D5 = P0_28,
+    D6 = P0_16, // LED_GREEN
+    D7 = P0_17,
+    D8 = P0_13,
+    D9 = P0_27, // LED_BLUE
+    D10 = P0_15,
+    D11 = P0_26,
+    D12 = P0_25,
+    D13 = P0_24,
+*/
+I2C dev1(I2C_SDA,I2C_SCL);//11,10 hard coded
+I2C dev2(A0,A1);//6,14
+I2C dev3(A2,A3);//23,22
+I2C dev4(A4,A5);//21,20
+BusOut bus(LED1,LED2,LED3,LED4);
+//DigitalOut led1(LED1);
+//DigitalOut led2(LED2);
+//DigitalOut led3(LED3);
+//DigitalOut led4(LED4);
+
+//Table 3. ASCII commands supported by SC18IM700
+//ASCII command Hex value Command function
+//[X] S 0x53 I2C-bus START
+//[X] P 0x50 I2C-bus STOP
+//[_] R 0x52 read SC18IM700 internal register
+//[_] W 0x57 write to SC18IM700 internal register
+//[_] I 0x49 read GPIO port
+//[_] O 0x4F write to GPIO port
+//[_] Z 0x5A power down
+//[X] C 0x43 change channel
+
+int main()
+{
+    I2C* dev=&dev1;
+    pc.baud(115200);
+//mon.baud(115200);
+//pc.printf("%08X\n\r",LPC_IOCON->PIO0_11 );
+//pc.printf("%08X\n\r",LPC_IOCON->PIO0_10 );
+LPC_IOCON->PIO0_11 &= ~(0x02<<8);
+LPC_IOCON->PIO0_11 |= (0x02<<8);
+LPC_IOCON->PIO0_10 &= ~(0x02<<8);
+LPC_IOCON->PIO0_10 |= (0x02<<8);
+//pc.printf("%08X\n\r",LPC_IOCON->PIO0_11 );
+//pc.printf("%08X\n\r",LPC_IOCON->PIO0_10 );
+
+    bool s=false;
+    dev1.frequency(800000);//100k
+    dev2.frequency(400000);//100k
+    dev3.frequency(400000);//100k
+    dev4.frequency(400000);//100k
+
+pc.printf("%08X\n\r",LPC_IOCON->PIO0_11 );
+pc.printf("%08X\n\r",LPC_IOCON->PIO0_10 );
+//LPC_I2C0->CLKDIV &= 0xFFFFFF00;
+//LPC_I2C0->CLKDIV |= 0x05;
+//LPC_I2C0->MSTTIME &= 0xFFFFFF00;
+//LPC_I2C0->MSTTIME |= 0x11;
+//pc.printf("%08X\n\r",LPC_SYSCON->SYSAHBCLKDIV );
+pc.printf("%08X\n\r",LPC_I2C0->CLKDIV );
+pc.printf("%08X\n\r",LPC_I2C0->MSTTIME );
+//    int data=0x50;
+    int ack=0;
+    int plength=0;
+    char recieve[256];
+char send[256];
+    char read=0;
+    int address=0,length=0,channel=0;
+    enum reg {
+        I2C0adr='0',
+        I2C1adr='1',
+        I2C2adr='2',
+        I2C3adr='3',
+    };
+//"C0P"
+//"S| 0x08 0x00| 0x00 0x04| 0xD0E0A0D0B0E0A0F|P"
+//"C1P"
+//"S(0x80)(4)(0xDEADBEAF)P"
+//"C2P"
+//"S(0x80)(4)(0xDEADBEAF)P"
+//"C3P"
+//"S(0x80)(4)(0xDEADBEAF)P"
+//dev1.start();
+//dev1.write(address);
+//dev1.stop();
+
+    int i=0;
+    while(1) {
+        while(true) {
+////            led1=0;
+            read=pc.getc();
+            recieve[i]=read;
+//pc.printf("%02X,",read); //debug
+            i++;
+            if(read == 'P') {
+                plength=i;
+////                led1=1;
+//pc.printf("P\n\r");
+                break;
+            }
+        }
+for(i=0;i<plength;i++){
+//mon.printf("%02X,",recieve[i]); //debug
+}
+        i=0;
+        while(i<plength) {
+//mon.printf("%c,",recieve[i]);
+            switch(recieve[i]) {
+                case 'C':
+                {
+                    channel=recieve[i+1];
+                    switch(channel) {
+                        case I2C0adr:
+                        {
+                            bus=~0x01;
+//pc.printf("ch0 is selected,");
+                            channel='0';
+                            dev=&dev1;
+                            break;
+                        }
+                        case I2C1adr:
+                        {
+                            bus=~0x02;
+//pc.printf("ch1 is selected,");
+                            channel='1';
+                            dev=&dev2;
+                            break;
+                        }
+                        case I2C2adr:
+                        {
+                            bus=~0x04;
+//pc.printf("ch2 is selected,");
+                            channel='2';
+                            dev=&dev3;
+                            break;
+                        }
+                        case I2C3adr:
+                        {
+                            bus=~0x08;
+//pc.printf("ch3 is selected,");
+                            channel='3';
+                            dev=&dev4;
+                            break;
+                        }
+                        default:
+                        {
+//pc.printf("ch? is not implemented,");
+                            channel='0';
+                            dev=&dev1;
+                            break;
+                        }
+                    }
+                    i+=(2);
+                    break;
+                }
+// S|0xD0|0x01|0xAA|S|0xD1|0x01|P
+                case 'S':
+                {
+                    s=true;
+//ack=((plength-i)>>1)+(0x01&recieve[(i+2)]);
+ack=plength-2-(i+1)+(0x01&recieve[(i+2)]);
+if( ack >=4){
+//if(plength>=4){
+                        address=0xff&(recieve[i+1]<<4|(recieve[i+2]&0x0F));
+                        length=0xff&(recieve[i+3]<<4|(recieve[i+4]&0x0F));
+}else{
+    pc.printf("bad packet! %d, %d, %02X, %d\n\r",plength,i,recieve[(i+2)]&0x0F,ack);
+//mon.printf("bad packet! %d, %d, %02X, %d\n\r",plength,i,recieve[(i+2)]&0x0F,ack);
+    i=plength+1;
+    break;
+}
+//pc.printf("addr=%02X, length=%d,",address,length);
+//dev1.start();
+//dev1.write(address);
+                    dev->start();
+ack=dev->write(address);
+//if(ack==0){
+//    dev->stop();
+//    pc.printf("0x%02X returned %d\n\r",address,ack);
+//    i=plength+1;
+//    break;
+//}
+////                    dev->write(address);
+                    if( (address&0x01)) {//read
+//pc.printf("read from ch%c,",channel);
+                        for(int j=0; j<length; j++) {
+send[j]=dev->read(1);
+////                            pc.printf("%02X,",dev->read(1));
+//pc.printf("%02X,",dev1.read(0));
+                        }
+                        i+=(5);
+                    } else {//write
+//pc.printf("write to ch%c, ",channel);
+                        for(int j=0; j<(length*2); j+=2) {
+//pc.printf("%02X,",recieve[3+j]);
+//dev1.write(recieve[3+j]);
+                            ack=dev->write( 0xff&(recieve[5+j] << 4 | (recieve[6+j] & 0x0F)) );
+//pc.printf("ack=%d\n\r",ack);
+                        }
+                        i+=(5+length*2);
+                        length=0;
+                    }
+                    break;
+                }
+                case 'P':
+//dev1.stop();
+                    if(s){
+                        dev->stop();
+                        s=false;
+                    }
+                    i=plength;
+                    for(int j=0; j<length; j++) {
+                        pc.printf("%02X,",send[j]);
+//mon.printf("%02X,",send[j]);
+                    }
+                    pc.printf("ok\n\r");
+//mon.printf("ok\n\r");
+                    break;
+                case 'R':
+                    pc.printf("command R is not implemented\n\r");
+//mon.printf("command R is not implemented\n\r");
+                    i=plength;
+                    break;
+                case 'W':
+                    pc.printf("command W is not implemented\n\r");
+//mon.printf("command W is not implemented\n\r");
+                    i=plength;
+                    break;
+                case 'I':
+                    pc.printf("command I is not implemented\n\r");
+//mon.printf("command I is not implemented\n\r");
+                    i=plength;
+                    break;
+                case 'O':
+                    pc.printf("command O is not implemented\n\r");
+//mon.printf("command O is not implemented\n\r");
+                    i=plength;
+                    break;
+                case 'Z':
+                    pc.printf("command Z is not implemented\n\r");
+//mon.printf("command Z is not implemented\n\r");
+                    i=plength;
+                    break;
+                default:
+                    pc.printf("command ? is not implemented\n\r");
+//mon.printf("command %02X is not implemented\n\r",recieve[i]);
+                    i=plength;
+                    break;
+            }
+        }
+        i=0;
+        length=0;
+    }
+}