PICO I2C FW

Dependencies:   USBDevice

Committer:
cyberjoey
Date:
Fri Feb 08 16:59:34 2019 +0000
Revision:
22:ee0d36d534cd
Parent:
21:0f358a702561
Child:
23:9bcf097cbfc2
Working I2C bridge

Who changed what in which revision?

UserRevisionLine numberNew contents of line
switches 0:60a522ae2e35 1 #include "mbed.h"
cyberjoey 9:36ba3626aab7 2 #include "USBSerial.h"
cyberjoey 9:36ba3626aab7 3
cyberjoey 9:36ba3626aab7 4 #define BS 8 // ASCII Back Space
cyberjoey 9:36ba3626aab7 5 #define CR 13 // ASCII Carriage Return
cyberjoey 9:36ba3626aab7 6
cyberjoey 22:ee0d36d534cd 7 #define SLAVE_ADDRESS 0x50
cyberjoey 10:148da21c297e 8
cyberjoey 9:36ba3626aab7 9 //global variable
cyberjoey 9:36ba3626aab7 10
cyberjoey 9:36ba3626aab7 11 // Virtual serial port over USB
cyberjoey 15:61dce4bef44f 12 USBSerial pc(0x0B6A, 0x0042, 0x0001, false);
cyberjoey 9:36ba3626aab7 13
cyberjoey 9:36ba3626aab7 14 // I2C setup
cyberjoey 22:ee0d36d534cd 15 I2C i2c(P1_6,P1_7); // P3_4 -> I2C1_SDA, P3_5-> I2C1_SCL
cyberjoey 9:36ba3626aab7 16
cyberjoey 9:36ba3626aab7 17 //Timer setup
cyberjoey 9:36ba3626aab7 18 Ticker timer_1; // timer for blinking led heartbeat
cyberjoey 9:36ba3626aab7 19
cyberjoey 9:36ba3626aab7 20 bool tick_flag; // used for counting seconds
cyberjoey 9:36ba3626aab7 21 bool log_flag = false;
cyberjoey 9:36ba3626aab7 22 bool led_toggle_flag = false;
cyberjoey 9:36ba3626aab7 23 bool button_flag = false;
cyberjoey 11:94a7379c0db8 24 bool sd_insert_flag = false;
cyberjoey 9:36ba3626aab7 25 bool error_flag;
cyberjoey 9:36ba3626aab7 26 int error_ticks;
cyberjoey 9:36ba3626aab7 27
cyberjoey 9:36ba3626aab7 28 //LED blink setup
switches 1:90313362ec11 29 DigitalOut rLED(LED1);
switches 1:90313362ec11 30 DigitalOut gLED(LED2);
cyberjoey 9:36ba3626aab7 31 DigitalOut bLED(LED3);
switches 0:60a522ae2e35 32
cyberjoey 9:36ba3626aab7 33 InterruptIn button(SW1);
cyberjoey 9:36ba3626aab7 34
cyberjoey 9:36ba3626aab7 35 void LED_blink_callback(){ // LED Heart beat
cyberjoey 9:36ba3626aab7 36
cyberjoey 9:36ba3626aab7 37 led_toggle_flag = !led_toggle_flag;
cyberjoey 9:36ba3626aab7 38
cyberjoey 9:36ba3626aab7 39 if(log_flag) //if logging
cyberjoey 9:36ba3626aab7 40 {
cyberjoey 9:36ba3626aab7 41
cyberjoey 9:36ba3626aab7 42 if(led_toggle_flag)
cyberjoey 9:36ba3626aab7 43 {
cyberjoey 9:36ba3626aab7 44 //toggle red led
cyberjoey 9:36ba3626aab7 45 rLED = LED_ON;
cyberjoey 9:36ba3626aab7 46 }
cyberjoey 9:36ba3626aab7 47 else
cyberjoey 9:36ba3626aab7 48 {
cyberjoey 9:36ba3626aab7 49 rLED = LED_OFF;
cyberjoey 9:36ba3626aab7 50 gLED = LED_OFF;
cyberjoey 9:36ba3626aab7 51 bLED = LED_OFF;
cyberjoey 9:36ba3626aab7 52 }
cyberjoey 9:36ba3626aab7 53 }
cyberjoey 9:36ba3626aab7 54 else if(error_flag) //if error (no sd card)
cyberjoey 9:36ba3626aab7 55 {
cyberjoey 9:36ba3626aab7 56 if(led_toggle_flag)
cyberjoey 9:36ba3626aab7 57 {
cyberjoey 9:36ba3626aab7 58 //toggle red led
cyberjoey 9:36ba3626aab7 59 rLED = LED_ON;
cyberjoey 9:36ba3626aab7 60 gLED = LED_ON;
cyberjoey 9:36ba3626aab7 61 }
cyberjoey 9:36ba3626aab7 62 else
cyberjoey 9:36ba3626aab7 63 {
cyberjoey 9:36ba3626aab7 64 rLED = LED_OFF;
cyberjoey 9:36ba3626aab7 65 gLED = LED_OFF;
cyberjoey 9:36ba3626aab7 66 bLED = LED_OFF;
cyberjoey 9:36ba3626aab7 67 }
cyberjoey 9:36ba3626aab7 68 error_ticks--;
cyberjoey 9:36ba3626aab7 69 if(error_ticks <= 0)
cyberjoey 9:36ba3626aab7 70 error_flag = false;
cyberjoey 9:36ba3626aab7 71 }
cyberjoey 9:36ba3626aab7 72 else
cyberjoey 9:36ba3626aab7 73 {
cyberjoey 9:36ba3626aab7 74 if(led_toggle_flag)
cyberjoey 9:36ba3626aab7 75 {
cyberjoey 9:36ba3626aab7 76 //toggle teal leds
cyberjoey 9:36ba3626aab7 77 gLED = LED_ON;
cyberjoey 9:36ba3626aab7 78 bLED = LED_ON;
cyberjoey 9:36ba3626aab7 79 }
cyberjoey 9:36ba3626aab7 80 else
cyberjoey 9:36ba3626aab7 81 {
cyberjoey 9:36ba3626aab7 82 rLED = LED_OFF;
cyberjoey 9:36ba3626aab7 83 gLED = LED_OFF;
cyberjoey 9:36ba3626aab7 84 bLED = LED_OFF;
cyberjoey 9:36ba3626aab7 85 }
cyberjoey 9:36ba3626aab7 86 }
cyberjoey 9:36ba3626aab7 87
cyberjoey 9:36ba3626aab7 88 tick_flag = true;
cyberjoey 9:36ba3626aab7 89 }
cyberjoey 9:36ba3626aab7 90
cyberjoey 9:36ba3626aab7 91 // *****************************************************************************
cyberjoey 22:ee0d36d534cd 92 // I2C_write_register(char, char, char) writes single byte to OT07
cyberjoey 17:401a5bb8d403 93 // char I2C address
cyberjoey 17:401a5bb8d403 94 // char OT07 register address
cyberjoey 17:401a5bb8d403 95 // char data byte to be writen
cyberjoey 17:401a5bb8d403 96 // returns 0 on success ACK, 1 on NACK
cyberjoey 17:401a5bb8d403 97 // *****************************************************************************
cyberjoey 17:401a5bb8d403 98
cyberjoey 22:ee0d36d534cd 99 int I2C_write_register(char I2C_add, char reg_add, char byte){
cyberjoey 17:401a5bb8d403 100 char data[2];
cyberjoey 17:401a5bb8d403 101 int error;
cyberjoey 17:401a5bb8d403 102 data[0] = reg_add;
cyberjoey 17:401a5bb8d403 103 data[1] = byte;
cyberjoey 17:401a5bb8d403 104 error = i2c.write(I2C_add,data,2);
cyberjoey 17:401a5bb8d403 105 return error;
cyberjoey 17:401a5bb8d403 106
cyberjoey 17:401a5bb8d403 107 }
cyberjoey 17:401a5bb8d403 108
cyberjoey 17:401a5bb8d403 109 /// ****************************************************************************
cyberjoey 22:ee0d36d534cd 110 // I2C_write_register(char, char, char *, int) writes multiple bytes to OT07
cyberjoey 17:401a5bb8d403 111 // char I2C address
cyberjoey 17:401a5bb8d403 112 // char OT07 register address
cyberjoey 17:401a5bb8d403 113 // char * data vector of bytes to be written
cyberjoey 17:401a5bb8d403 114 // int number of bytes to write
cyberjoey 17:401a5bb8d403 115 // returns 0 on success ACK, 1 on NACK
cyberjoey 17:401a5bb8d403 116 // *****************************************************************************
cyberjoey 17:401a5bb8d403 117
cyberjoey 22:ee0d36d534cd 118 int I2C_write_register(char I2C_add, char reg_add, char *bytes, int n){
cyberjoey 17:401a5bb8d403 119 int i;
cyberjoey 17:401a5bb8d403 120 //set start address
cyberjoey 17:401a5bb8d403 121 char data[16];
cyberjoey 17:401a5bb8d403 122 int error;
cyberjoey 17:401a5bb8d403 123 data[0] = reg_add;
cyberjoey 17:401a5bb8d403 124 for(i=1;i<=n;i++){
cyberjoey 17:401a5bb8d403 125 data[i] = bytes[i-1];
cyberjoey 17:401a5bb8d403 126 }
cyberjoey 17:401a5bb8d403 127 error = i2c.write(I2C_add,data,n+1); // send n bytes of data
cyberjoey 17:401a5bb8d403 128
cyberjoey 17:401a5bb8d403 129 return error;
cyberjoey 17:401a5bb8d403 130 }
cyberjoey 17:401a5bb8d403 131
cyberjoey 17:401a5bb8d403 132 // *****************************************************************************
cyberjoey 22:ee0d36d534cd 133 // I2C_read_register(char, char, char *, int) writes single byte to OT07
cyberjoey 17:401a5bb8d403 134 // char I2C address
cyberjoey 17:401a5bb8d403 135 // char OT07 register address
cyberjoey 17:401a5bb8d403 136 // char * data vector for read bytes to be stored in
cyberjoey 17:401a5bb8d403 137 // int number of bytes to read
cyberjoey 17:401a5bb8d403 138 // returns 0 on success, 1 on fail
cyberjoey 17:401a5bb8d403 139 // *****************************************************************************
cyberjoey 17:401a5bb8d403 140
cyberjoey 22:ee0d36d534cd 141 int I2C_read_register(char I2C_add, char reg_add, char *bytes, int n){
cyberjoey 17:401a5bb8d403 142 int error;
cyberjoey 17:401a5bb8d403 143 error = i2c.write(I2C_add,&reg_add,1,1);
cyberjoey 17:401a5bb8d403 144 if(error)return error;
cyberjoey 17:401a5bb8d403 145 error = i2c.read(I2C_add,bytes,n);
cyberjoey 17:401a5bb8d403 146 //if(DEBUG)db.printf("rr e[%d]\r\n",error);
cyberjoey 17:401a5bb8d403 147 return error;
cyberjoey 17:401a5bb8d403 148 }
cyberjoey 17:401a5bb8d403 149
cyberjoey 9:36ba3626aab7 150 //******************************************************************************
cyberjoey 9:36ba3626aab7 151 // main()
cyberjoey 9:36ba3626aab7 152 //******************************************************************************
cyberjoey 9:36ba3626aab7 153
cyberjoey 9:36ba3626aab7 154
switches 0:60a522ae2e35 155 int main()
switches 0:60a522ae2e35 156 {
cyberjoey 9:36ba3626aab7 157 char data[130];
cyberjoey 9:36ba3626aab7 158 int i;
cyberjoey 9:36ba3626aab7 159
cyberjoey 10:148da21c297e 160
cyberjoey 9:36ba3626aab7 161 // i/o variables
cyberjoey 9:36ba3626aab7 162 char rx_buff[128]; // comport input buffer
cyberjoey 9:36ba3626aab7 163 int rx_index; // rx_buffer pointer
cyberjoey 9:36ba3626aab7 164 char c; // command type character
cyberjoey 9:36ba3626aab7 165 int n; // argument count
cyberjoey 9:36ba3626aab7 166 int arg1; // argumnet 1
cyberjoey 9:36ba3626aab7 167 int arg2; // argument 2
cyberjoey 22:ee0d36d534cd 168 int arg3; // argument 3
cyberjoey 9:36ba3626aab7 169 int num_bytes;
cyberjoey 22:ee0d36d534cd 170
cyberjoey 22:ee0d36d534cd 171
cyberjoey 9:36ba3626aab7 172 //************* init ticker timer callbacks ****************
cyberjoey 12:aa9fff0aec91 173 timer_1.attach(&LED_blink_callback,0.5); //start ticker, once per sec.
cyberjoey 9:36ba3626aab7 174
cyberjoey 12:aa9fff0aec91 175 i2c.frequency(400000); //set I2C clock to 400kHz
cyberjoey 9:36ba3626aab7 176
cyberjoey 9:36ba3626aab7 177 rLED = LED_OFF;
switches 6:96d8d823e292 178 gLED = LED_ON;
cyberjoey 9:36ba3626aab7 179 bLED = LED_ON;
cyberjoey 9:36ba3626aab7 180
cyberjoey 9:36ba3626aab7 181 rx_index = 0; //character buffer index for input from PC
cyberjoey 22:ee0d36d534cd 182
cyberjoey 9:36ba3626aab7 183 while(1) { // start main loop, take data if logging, check for input, repeat
cyberjoey 9:36ba3626aab7 184
cyberjoey 9:36ba3626aab7 185 // ----------------------------------------------------------------------------
cyberjoey 9:36ba3626aab7 186 // test for charater input for USB com port
cyberjoey 9:36ba3626aab7 187 // ----------------------------------------------------------------------------
cyberjoey 9:36ba3626aab7 188
cyberjoey 9:36ba3626aab7 189 //test if PC sent some charaters
cyberjoey 9:36ba3626aab7 190 while(pc.readable()){ //characters in buffer, get them
cyberjoey 9:36ba3626aab7 191 rx_buff[rx_index] = pc.getc();
cyberjoey 9:36ba3626aab7 192
cyberjoey 9:36ba3626aab7 193 if(rx_buff[rx_index] == CR){
cyberjoey 9:36ba3626aab7 194 rx_buff[++rx_index] = 0;
cyberjoey 9:36ba3626aab7 195 rx_index = -1; // because i++ at end of while give i=0 on next loop
cyberjoey 22:ee0d36d534cd 196 //device = 0;
cyberjoey 9:36ba3626aab7 197 arg1 = 0;
cyberjoey 9:36ba3626aab7 198 arg2 = 0;
cyberjoey 22:ee0d36d534cd 199 arg3 = 0;
cyberjoey 9:36ba3626aab7 200
cyberjoey 22:ee0d36d534cd 201 n = sscanf(rx_buff, " %c %x %x %x", &c, &arg1, &arg2, &arg3);
cyberjoey 9:36ba3626aab7 202 //process input
cyberjoey 9:36ba3626aab7 203 if(n > 0){//got input so process it
cyberjoey 9:36ba3626aab7 204 switch(c){
cyberjoey 9:36ba3626aab7 205 case 'r':
cyberjoey 17:401a5bb8d403 206 case 'R':
cyberjoey 22:ee0d36d534cd 207 //read register "r slave.add radd.start radd.end"
cyberjoey 9:36ba3626aab7 208 if(n==3){ //read single register from selected device
cyberjoey 22:ee0d36d534cd 209 int error = I2C_read_register(arg1,arg2,data,1);
cyberjoey 22:ee0d36d534cd 210 if(error)
cyberjoey 22:ee0d36d534cd 211 pc.printf("nack\r\n");
cyberjoey 22:ee0d36d534cd 212 else
cyberjoey 22:ee0d36d534cd 213 pc.printf("%02X\r\n",data[0]);
cyberjoey 9:36ba3626aab7 214 }
cyberjoey 9:36ba3626aab7 215 if(n==4){ //read a range of regesters from selected device
cyberjoey 22:ee0d36d534cd 216 num_bytes = arg3-arg2 + 1; // calculate number of bytes to read
cyberjoey 9:36ba3626aab7 217 if (num_bytes < 1) num_bytes = 1; // if arg2 <= arg 1 just read arg1 address.
cyberjoey 22:ee0d36d534cd 218 I2C_read_register(arg1,arg2,data,num_bytes);
cyberjoey 9:36ba3626aab7 219 for(i=0;i<num_bytes;i++){
cyberjoey 22:ee0d36d534cd 220 pc.printf("%02X\r\n",data[i]);
cyberjoey 17:401a5bb8d403 221 }
cyberjoey 9:36ba3626aab7 222 }
cyberjoey 9:36ba3626aab7 223 break;
cyberjoey 9:36ba3626aab7 224 case 'w':
cyberjoey 17:401a5bb8d403 225 case 'W': //write register "w device w.addr data"
cyberjoey 22:ee0d36d534cd 226 int error = I2C_write_register(arg1,arg2, arg3);
cyberjoey 22:ee0d36d534cd 227 if(error)
cyberjoey 22:ee0d36d534cd 228 pc.printf("nack\r\n");
cyberjoey 22:ee0d36d534cd 229 else
cyberjoey 22:ee0d36d534cd 230 pc.printf("ack\r\n");
cyberjoey 22:ee0d36d534cd 231 break;
cyberjoey 9:36ba3626aab7 232 }//end switch(c)
cyberjoey 9:36ba3626aab7 233 }//if(n>0)
cyberjoey 9:36ba3626aab7 234 }//end if(CR)
cyberjoey 9:36ba3626aab7 235 if(rx_buff[rx_index] == BS){//backspace received, back up buffer pointer
cyberjoey 9:36ba3626aab7 236 if(rx_index>0)rx_index--;//remove last char from buffer if not at start.
cyberjoey 9:36ba3626aab7 237 }else rx_index++;
cyberjoey 9:36ba3626aab7 238 }//end while(pc.redable())
switches 0:60a522ae2e35 239
cyberjoey 9:36ba3626aab7 240
cyberjoey 9:36ba3626aab7 241
cyberjoey 9:36ba3626aab7 242 }//end while(1)
switches 0:60a522ae2e35 243 }