Ashwath M Pavithran
/
csi066_rev0p3_harald_prog
Publishing for sharing with Harald
I2C_read.cpp@4:1c48c9fa44fc, 2020-05-22 (annotated)
- Committer:
- CactusSemi
- Date:
- Fri May 22 19:19:45 2020 +0000
- Revision:
- 4:1c48c9fa44fc
- Parent:
- 3:3e8c16b6620c
Publishing for sharing with Harald
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
CactusSemi | 3:3e8c16b6620c | 1 | #include "mbed.h" |
CactusSemi | 3:3e8c16b6620c | 2 | |
CactusSemi | 3:3e8c16b6620c | 3 | extern Serial pc; |
CactusSemi | 3:3e8c16b6620c | 4 | extern int frequ = 50; //unit kHz |
CactusSemi | 3:3e8c16b6620c | 5 | extern char dev_addr = 0x00; //fixed |
CactusSemi | 3:3e8c16b6620c | 6 | |
CactusSemi | 4:1c48c9fa44fc | 7 | char get_byte(int *); //defined in EasyFuse_Prog.cpp |
CactusSemi | 4:1c48c9fa44fc | 8 | |
CactusSemi | 3:3e8c16b6620c | 9 | char get_half_byte(int *flag) { |
CactusSemi | 3:3e8c16b6620c | 10 | char cur_char; |
CactusSemi | 3:3e8c16b6620c | 11 | cur_char = pc.getc(); |
CactusSemi | 3:3e8c16b6620c | 12 | if ( cur_char >= '0' && cur_char <= '9' ) { |
CactusSemi | 3:3e8c16b6620c | 13 | cur_char = cur_char - '0'; |
CactusSemi | 3:3e8c16b6620c | 14 | *flag = 1; |
CactusSemi | 3:3e8c16b6620c | 15 | } |
CactusSemi | 3:3e8c16b6620c | 16 | else if ( cur_char >= 'a' && cur_char <= 'f') { |
CactusSemi | 3:3e8c16b6620c | 17 | cur_char = cur_char - 'a'+10; |
CactusSemi | 3:3e8c16b6620c | 18 | *flag = 1; |
CactusSemi | 3:3e8c16b6620c | 19 | } |
CactusSemi | 3:3e8c16b6620c | 20 | else if( cur_char >= 'A' && cur_char <= 'F') { |
CactusSemi | 3:3e8c16b6620c | 21 | cur_char = cur_char - 'A'+10; |
CactusSemi | 3:3e8c16b6620c | 22 | *flag = 1; |
CactusSemi | 3:3e8c16b6620c | 23 | } |
CactusSemi | 3:3e8c16b6620c | 24 | else *flag = 0; |
CactusSemi | 3:3e8c16b6620c | 25 | return cur_char; |
CactusSemi | 3:3e8c16b6620c | 26 | } |
CactusSemi | 3:3e8c16b6620c | 27 | |
CactusSemi | 3:3e8c16b6620c | 28 | void i2c_read() { |
CactusSemi | 3:3e8c16b6620c | 29 | char reg_ptr = 0x55; |
CactusSemi | 3:3e8c16b6620c | 30 | char reg_data = 0x00; |
CactusSemi | 3:3e8c16b6620c | 31 | char temp; |
CactusSemi | 3:3e8c16b6620c | 32 | int flag1 = 0; |
CactusSemi | 3:3e8c16b6620c | 33 | char count = 0; |
CactusSemi | 3:3e8c16b6620c | 34 | I2C i2c(p9,p10); |
CactusSemi | 3:3e8c16b6620c | 35 | LPC_PINCON->PINMODE_OD0 = (LPC_PINCON->PINMODE_OD0 | 0x0003); // To make p9 & P10 open_drain |
CactusSemi | 3:3e8c16b6620c | 36 | pc.printf("\n\n\n \r\tYahoooo! Lets read a Register"); |
CactusSemi | 3:3e8c16b6620c | 37 | //Read the number of Registers |
CactusSemi | 3:3e8c16b6620c | 38 | while (!flag1) { |
CactusSemi | 4:1c48c9fa44fc | 39 | pc.printf("\n\n\n\r\tEnter the number of registers to read (1 - 24) and hit 'enter' key: "); |
CactusSemi | 3:3e8c16b6620c | 40 | temp = '0'; |
CactusSemi | 3:3e8c16b6620c | 41 | count = 0; |
CactusSemi | 3:3e8c16b6620c | 42 | while (temp != '\r') { //look for enter key |
CactusSemi | 3:3e8c16b6620c | 43 | count = (count * 10) + (temp - '0'); // converting to number |
CactusSemi | 3:3e8c16b6620c | 44 | temp = pc.getc(); |
CactusSemi | 3:3e8c16b6620c | 45 | if ((temp < '0' || temp > '9') && temp !='\r') { |
CactusSemi | 3:3e8c16b6620c | 46 | pc.printf(" \n\r\t\033[%dm Invalid Chracter!! No worries, let us try again \033[%dm",41,40); |
CactusSemi | 3:3e8c16b6620c | 47 | break; |
CactusSemi | 3:3e8c16b6620c | 48 | } |
CactusSemi | 3:3e8c16b6620c | 49 | } |
CactusSemi | 4:1c48c9fa44fc | 50 | if (count >= 1 && count <= 24 && temp == '\r') flag1 = 1; |
CactusSemi | 3:3e8c16b6620c | 51 | else if (temp == '\r') pc.printf(" \n\r\t\033[%dm Invalid Chracter!! No worries, let us try again \033[%dm",41,40); |
CactusSemi | 3:3e8c16b6620c | 52 | } |
CactusSemi | 3:3e8c16b6620c | 53 | Re_enter: |
CactusSemi | 3:3e8c16b6620c | 54 | flag1 = 0; |
CactusSemi | 3:3e8c16b6620c | 55 | //Read Pointer to the Register that needs to be read |
CactusSemi | 3:3e8c16b6620c | 56 | while (!flag1) { |
CactusSemi | 4:1c48c9fa44fc | 57 | pc.printf("\n\n \r\tEnter Register Address in hex (0 to 17): "); |
CactusSemi | 4:1c48c9fa44fc | 58 | reg_ptr = get_byte(&flag1); |
CactusSemi | 3:3e8c16b6620c | 59 | if (flag1==0) pc.printf(" \033[%dm Invalid Chracter!! No worries, let us try again \033[%dm",41,40); |
CactusSemi | 3:3e8c16b6620c | 60 | } |
CactusSemi | 3:3e8c16b6620c | 61 | |
CactusSemi | 3:3e8c16b6620c | 62 | pc.printf("\n\n\n\r\t\033[%dm", 44);//change backround to blue |
CactusSemi | 3:3e8c16b6620c | 63 | pc.printf(" Device Address (fixed) = 0x%2.2X ; Register Pointer = 0x%2.2X ; Count = %d ",dev_addr, reg_ptr, count); |
CactusSemi | 3:3e8c16b6620c | 64 | pc.printf("\033[%dm", 40);//change backround to black |
CactusSemi | 3:3e8c16b6620c | 65 | |
CactusSemi | 3:3e8c16b6620c | 66 | pc.printf("\n\n\n \r\tContinue Read? (y/n) [Press 'e' to re-enter Pointer]: "); |
CactusSemi | 3:3e8c16b6620c | 67 | temp = 0; |
CactusSemi | 3:3e8c16b6620c | 68 | while ( temp!='y' && temp!='n' && temp!='e') { |
CactusSemi | 3:3e8c16b6620c | 69 | temp = pc.getc(); |
CactusSemi | 3:3e8c16b6620c | 70 | } |
CactusSemi | 3:3e8c16b6620c | 71 | if (temp == 'n') { |
CactusSemi | 3:3e8c16b6620c | 72 | pc.printf("\n\n \r\tAborting Register Read :(\n\n\r"); |
CactusSemi | 3:3e8c16b6620c | 73 | return; |
CactusSemi | 3:3e8c16b6620c | 74 | } |
CactusSemi | 3:3e8c16b6620c | 75 | if (temp == 'e') { |
CactusSemi | 3:3e8c16b6620c | 76 | pc.printf(" \n\n\n \r\tOk, let us try again :)"); |
CactusSemi | 3:3e8c16b6620c | 77 | goto Re_enter; |
CactusSemi | 3:3e8c16b6620c | 78 | } |
CactusSemi | 3:3e8c16b6620c | 79 | i2c.frequency(frequ*1000); |
CactusSemi | 3:3e8c16b6620c | 80 | i2c.stop(); //add a stop after hot-read |
CactusSemi | 3:3e8c16b6620c | 81 | wait_us(10); |
CactusSemi | 4:1c48c9fa44fc | 82 | for ( ; (count > 0) && (reg_ptr < 0x18); count = count - 1) { |
CactusSemi | 3:3e8c16b6620c | 83 | i2c.start(); |
CactusSemi | 3:3e8c16b6620c | 84 | flag1 = i2c.write(dev_addr); |
CactusSemi | 3:3e8c16b6620c | 85 | if (flag1 != 1) pc.printf("\n\n\n \r\tNo Ack for dev addr :("); |
CactusSemi | 3:3e8c16b6620c | 86 | flag1 = i2c.write(reg_ptr); |
CactusSemi | 3:3e8c16b6620c | 87 | if (flag1 != 1) pc.printf("\n\n \r\tNo Ack reg pointer :("); |
CactusSemi | 3:3e8c16b6620c | 88 | i2c.stop(); |
CactusSemi | 4:1c48c9fa44fc | 89 | wait_us(300); |
CactusSemi | 3:3e8c16b6620c | 90 | i2c.start(); |
CactusSemi | 3:3e8c16b6620c | 91 | flag1 = i2c.write(dev_addr | 0x01); //lsb 1 for read |
CactusSemi | 3:3e8c16b6620c | 92 | if (flag1 != 1) pc.printf("\n\n \r\tNo Ack for dev addr :("); |
CactusSemi | 3:3e8c16b6620c | 93 | reg_data = i2c.read(0); //0- donot send ack after read is done |
CactusSemi | 3:3e8c16b6620c | 94 | pc.printf("\n\n\n \r\tRead 0x%2.2X = 0x%2.2X ", reg_ptr, reg_data); |
CactusSemi | 3:3e8c16b6620c | 95 | wait_us(5); |
CactusSemi | 3:3e8c16b6620c | 96 | i2c.stop(); |
CactusSemi | 3:3e8c16b6620c | 97 | if (reg_data == 0xff) pc.printf(" |\033[%dm Register read might not be sucessfull \033[%dm ",45,40); |
CactusSemi | 3:3e8c16b6620c | 98 | reg_ptr = reg_ptr + 1; |
CactusSemi | 4:1c48c9fa44fc | 99 | wait_us(300); |
CactusSemi | 3:3e8c16b6620c | 100 | } |
CactusSemi | 3:3e8c16b6620c | 101 | pc.printf("\n\n\n \r\tYeahhh! Register Read Complete\n\n\r"); |
CactusSemi | 3:3e8c16b6620c | 102 | i2c.~I2C(); |
CactusSemi | 3:3e8c16b6620c | 103 | } |