PICO I2C FW
Dependencies: USBDevice
Diff: main.cpp
- Revision:
- 23:9bcf097cbfc2
- Parent:
- 22:ee0d36d534cd
- Child:
- 24:5ee9d36089f3
--- a/main.cpp Fri Feb 08 16:59:34 2019 +0000 +++ b/main.cpp Fri Feb 08 21:18:10 2019 +0000 @@ -4,88 +4,40 @@ #define BS 8 // ASCII Back Space #define CR 13 // ASCII Carriage Return -#define SLAVE_ADDRESS 0x50 - -//global variable - -// Virtual serial port over USB +// Virtual serial port over USB TODO NEW VID PID NEEDED!! USBSerial pc(0x0B6A, 0x0042, 0x0001, false); // I2C setup -I2C i2c(P1_6,P1_7); // P3_4 -> I2C1_SDA, P3_5-> I2C1_SCL +I2C i2c(P1_6, P1_7); // P1_6 -> I2C1_SDA, P1_7-> I2C1_SCL //Timer setup Ticker timer_1; // timer for blinking led heartbeat - -bool tick_flag; // used for counting seconds -bool log_flag = false; bool led_toggle_flag = false; -bool button_flag = false; -bool sd_insert_flag = false; -bool error_flag; -int error_ticks; //LED blink setup DigitalOut rLED(LED1); DigitalOut gLED(LED2); DigitalOut bLED(LED3); -InterruptIn button(SW1); +//InterruptIn button(SW1); + +void LED_blink_callback() { // LED Heart beat -void LED_blink_callback(){ // LED Heart beat - led_toggle_flag = !led_toggle_flag; - - if(log_flag) //if logging + + if (led_toggle_flag) { - - if(led_toggle_flag) - { - //toggle red led - rLED = LED_ON; - } - else - { - rLED = LED_OFF; - gLED = LED_OFF; - bLED = LED_OFF; - } - } - else if(error_flag) //if error (no sd card) - { - if(led_toggle_flag) - { - //toggle red led - rLED = LED_ON; + //toggle teal leds gLED = LED_ON; - } - else - { - rLED = LED_OFF; - gLED = LED_OFF; - bLED = LED_OFF; - } - error_ticks--; - if(error_ticks <= 0) - error_flag = false; + bLED = LED_ON; } else { - if(led_toggle_flag) - { - //toggle teal leds - gLED = LED_ON; - bLED = LED_ON; - } - else - { - rLED = LED_OFF; - gLED = LED_OFF; - bLED = LED_OFF; - } + rLED = LED_OFF; + gLED = LED_OFF; + bLED = LED_OFF; } - - tick_flag = true; + } // ***************************************************************************** @@ -96,14 +48,14 @@ // returns 0 on success ACK, 1 on NACK // ***************************************************************************** -int I2C_write_register(char I2C_add, char reg_add, char byte){ +int I2C_write_register(char I2C_add, char reg_add, char byte) { char data[2]; int error; data[0] = reg_add; data[1] = byte; - error = i2c.write(I2C_add,data,2); - return error; - + error = i2c.write(I2C_add, data, 2); + return error; + } /// **************************************************************************** @@ -115,18 +67,18 @@ // returns 0 on success ACK, 1 on NACK // ***************************************************************************** -int I2C_write_register(char I2C_add, char reg_add, char *bytes, int n){ - int i; +int I2C_write_register(char I2C_add, char reg_add, char *bytes, int n) { + int i; //set start address char data[16]; - int error; - data[0] = reg_add; - for(i=1;i<=n;i++){ - data[i] = bytes[i-1]; + int error; + data[0] = reg_add; + for (i = 1; i <= n; i++) { + data[i] = bytes[i - 1]; } - error = i2c.write(I2C_add,data,n+1); // send n bytes of data - - return error; + error = i2c.write(I2C_add, data, n + 1); // send n bytes of data + + return error; } // ***************************************************************************** @@ -138,106 +90,107 @@ // returns 0 on success, 1 on fail // ***************************************************************************** -int I2C_read_register(char I2C_add, char reg_add, char *bytes, int n){ +int I2C_read_register(char I2C_add, char reg_add, char *bytes, int n) { int error; - error = i2c.write(I2C_add,®_add,1,1); - if(error)return error; - error = i2c.read(I2C_add,bytes,n); + error = i2c.write(I2C_add, ®_add, 1, 1); + if (error)return error; + error = i2c.read(I2C_add, bytes, n); //if(DEBUG)db.printf("rr e[%d]\r\n",error); - return error; + return error; +} + + +/// **************************************************************************** +// process_command(char *) writes multiple bytes to OT07 +// char * receive buffer from virtual serial port +// returns 0 on processed command, 1 on invalid command +// ***************************************************************************** +int process_command(char rx_buff[128]) +{ + char data[130]; + int i; + int num_bytes; + char c; + int arg1 = 0; + int arg2 = 0; + int arg3 = 0; + int n = sscanf(rx_buff, " %c %x %x %x", &c, &arg1, &arg2, &arg3); + //process input + if (n > 0) {//got input so process it + switch (c) { + case 'r': + case 'R': + //read register "r slave.add radd.start radd.end" + if (n == 3) { //read single register from selected device + int error = I2C_read_register(arg1, arg2, data, 1); + if (error) + pc.printf("nack\r\n"); + else + pc.printf("%02X\r\n", data[0]); + } + if (n == 4) { //read a range of regesters from selected device + num_bytes = arg3 - arg2 + 1;// calculate number of bytes to read + if (num_bytes < 1) num_bytes = 1;// if arg2 <= arg 1 just read arg1 address. + I2C_read_register(arg1, arg2, data, num_bytes); + for (i = 0; i<num_bytes; i++) { + pc.printf("%02X\r\n", data[i]); + } + } + break; + case 'w': + case 'W': //write register "w device w.addr data" + int error = I2C_write_register(arg1, arg2, arg3); + if (error) + pc.printf("nack\r\n"); + else + pc.printf("ack\r\n"); + break; + default: + return 1; + }//end switch(c) + } + return 0; } //****************************************************************************** // main() //****************************************************************************** - int main() { - char data[130]; - int i; - // i/o variables char rx_buff[128]; // comport input buffer int rx_index; // rx_buffer pointer - char c; // command type character - int n; // argument count - int arg1; // argumnet 1 - int arg2; // argument 2 - int arg3; // argument 3 - int num_bytes; - //************* init ticker timer callbacks **************** - timer_1.attach(&LED_blink_callback,0.5); //start ticker, once per sec. - + timer_1.attach(&LED_blink_callback, 0.5); //start ticker, once per sec. + i2c.frequency(400000); //set I2C clock to 400kHz - + rLED = LED_OFF; gLED = LED_ON; bLED = LED_ON; - + rx_index = 0; //character buffer index for input from PC - - while(1) { // start main loop, take data if logging, check for input, repeat - - // ---------------------------------------------------------------------------- - // test for charater input for USB com port - // ---------------------------------------------------------------------------- - - //test if PC sent some charaters - while(pc.readable()){ //characters in buffer, get them + + while (1) { // start main loop, check for input, process command repeat + + //test if PC sent some charaters + while (pc.readable()) { //characters in buffer, get them rx_buff[rx_index] = pc.getc(); - - if(rx_buff[rx_index] == CR){ + + if (rx_buff[rx_index] == CR) { rx_buff[++rx_index] = 0; rx_index = -1; // because i++ at end of while give i=0 on next loop - //device = 0; - arg1 = 0; - arg2 = 0; - arg3 = 0; - n = sscanf(rx_buff, " %c %x %x %x", &c, &arg1, &arg2, &arg3); - //process input - if(n > 0){//got input so process it - switch(c){ - case 'r': - case 'R': - //read register "r slave.add radd.start radd.end" - if(n==3){ //read single register from selected device - int error = I2C_read_register(arg1,arg2,data,1); - if(error) - pc.printf("nack\r\n"); - else - pc.printf("%02X\r\n",data[0]); - } - if(n==4){ //read a range of regesters from selected device - num_bytes = arg3-arg2 + 1; // calculate number of bytes to read - if (num_bytes < 1) num_bytes = 1; // if arg2 <= arg 1 just read arg1 address. - I2C_read_register(arg1,arg2,data,num_bytes); - for(i=0;i<num_bytes;i++){ - pc.printf("%02X\r\n",data[i]); - } - } - break; - case 'w': - case 'W': //write register "w device w.addr data" - int error = I2C_write_register(arg1,arg2, arg3); - if(error) - pc.printf("nack\r\n"); - else - pc.printf("ack\r\n"); - break; - }//end switch(c) - }//if(n>0) + process_command(rx_buff);//if carriage return received, process command + }//end if(CR) - if(rx_buff[rx_index] == BS){//backspace received, back up buffer pointer - if(rx_index>0)rx_index--;//remove last char from buffer if not at start. - }else rx_index++; + if (rx_buff[rx_index] == BS) {//backspace received, back up buffer pointer + if (rx_index>0)rx_index--;//remove last char from buffer if not at start. + } + else rx_index++; }//end while(pc.redable()) - - - }//end while(1) }