PICO I2C FW
Dependencies: USBDevice
main.cpp@22:ee0d36d534cd, 2019-02-08 (annotated)
- 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?
User | Revision | Line number | New 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,®_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 | } |