Ashwath M Pavithran
/
csi066_rev0p3_harald_prog
Publishing for sharing with Harald
I2C_hot_read.cpp@3:3e8c16b6620c, 2018-06-21 (annotated)
- Committer:
- CactusSemi
- Date:
- Thu Jun 21 22:11:25 2018 +0000
- Revision:
- 3:3e8c16b6620c
- Child:
- 4:1c48c9fa44fc
06/21/2018
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; //unit kHz |
CactusSemi | 3:3e8c16b6620c | 5 | extern char dev_addr; //fixed |
CactusSemi | 3:3e8c16b6620c | 6 | |
CactusSemi | 3:3e8c16b6620c | 7 | char get_half_byte(int *); //defined in I2C_read.cpp |
CactusSemi | 3:3e8c16b6620c | 8 | |
CactusSemi | 3:3e8c16b6620c | 9 | void read_bit(int bit_pos) { |
CactusSemi | 3:3e8c16b6620c | 10 | // pc.printf("\n\r\tstart hot-read"); |
CactusSemi | 3:3e8c16b6620c | 11 | int i; |
CactusSemi | 3:3e8c16b6620c | 12 | char temp = 0; |
CactusSemi | 3:3e8c16b6620c | 13 | int delay1 = 20; |
CactusSemi | 3:3e8c16b6620c | 14 | int delay2 = 2 * delay1; |
CactusSemi | 3:3e8c16b6620c | 15 | //DigitalIn sda(p9,PullNone); |
CactusSemi | 3:3e8c16b6620c | 16 | DigitalInOut sda(p9,PIN_OUTPUT,PullNone,1); |
CactusSemi | 3:3e8c16b6620c | 17 | DigitalOut scl(p10,1); |
CactusSemi | 3:3e8c16b6620c | 18 | LPC_PINCON->PINMODE_OD0 = (LPC_PINCON->PINMODE_OD0 | 0x0003); // To make p9 & P10 open_drain |
CactusSemi | 3:3e8c16b6620c | 19 | scl = 1; |
CactusSemi | 3:3e8c16b6620c | 20 | sda = 1; |
CactusSemi | 3:3e8c16b6620c | 21 | |
CactusSemi | 3:3e8c16b6620c | 22 | //Transmit Stop (scl high followed by sda high) |
CactusSemi | 3:3e8c16b6620c | 23 | sda = 0; |
CactusSemi | 3:3e8c16b6620c | 24 | wait_us(delay2); |
CactusSemi | 3:3e8c16b6620c | 25 | scl = 1; |
CactusSemi | 3:3e8c16b6620c | 26 | wait_us(delay1); |
CactusSemi | 3:3e8c16b6620c | 27 | sda = 1; |
CactusSemi | 3:3e8c16b6620c | 28 | |
CactusSemi | 3:3e8c16b6620c | 29 | //Generater Start |
CactusSemi | 3:3e8c16b6620c | 30 | wait_us(4); |
CactusSemi | 3:3e8c16b6620c | 31 | sda = 0; |
CactusSemi | 3:3e8c16b6620c | 32 | wait_us(delay1); |
CactusSemi | 3:3e8c16b6620c | 33 | scl = 0; |
CactusSemi | 3:3e8c16b6620c | 34 | wait_us(delay2); |
CactusSemi | 3:3e8c16b6620c | 35 | //Txr Dev Addr 0x01 for read |
CactusSemi | 3:3e8c16b6620c | 36 | for(i = 7; i > 0; i = i-1) { |
CactusSemi | 3:3e8c16b6620c | 37 | wait_us(delay2); |
CactusSemi | 3:3e8c16b6620c | 38 | scl = 1; |
CactusSemi | 3:3e8c16b6620c | 39 | wait_us(delay2); |
CactusSemi | 3:3e8c16b6620c | 40 | scl = 0; |
CactusSemi | 3:3e8c16b6620c | 41 | } |
CactusSemi | 3:3e8c16b6620c | 42 | sda = 1; |
CactusSemi | 3:3e8c16b6620c | 43 | wait_us(delay2); |
CactusSemi | 3:3e8c16b6620c | 44 | scl = 1; |
CactusSemi | 3:3e8c16b6620c | 45 | wait_us(delay2); |
CactusSemi | 3:3e8c16b6620c | 46 | scl = 0; |
CactusSemi | 3:3e8c16b6620c | 47 | wait_us(delay2); |
CactusSemi | 3:3e8c16b6620c | 48 | //Recieve ACK |
CactusSemi | 3:3e8c16b6620c | 49 | sda.input(); |
CactusSemi | 3:3e8c16b6620c | 50 | scl = 1; |
CactusSemi | 3:3e8c16b6620c | 51 | wait_us(delay2); |
CactusSemi | 3:3e8c16b6620c | 52 | if (sda !=0) { |
CactusSemi | 3:3e8c16b6620c | 53 | pc.printf("\n\n \r\tNo Ack reg pointer :("); |
CactusSemi | 3:3e8c16b6620c | 54 | wait_us(20); |
CactusSemi | 3:3e8c16b6620c | 55 | } |
CactusSemi | 3:3e8c16b6620c | 56 | scl = 0; |
CactusSemi | 3:3e8c16b6620c | 57 | wait_us(10); |
CactusSemi | 3:3e8c16b6620c | 58 | //Start of Hot Read. Move the pointer to corresponding bit |
CactusSemi | 3:3e8c16b6620c | 59 | for(i = 7; i > bit_pos; i = i-1) { |
CactusSemi | 3:3e8c16b6620c | 60 | scl = 1; |
CactusSemi | 3:3e8c16b6620c | 61 | wait_us(delay2); |
CactusSemi | 3:3e8c16b6620c | 62 | scl = 0; |
CactusSemi | 3:3e8c16b6620c | 63 | wait_us(delay2); |
CactusSemi | 3:3e8c16b6620c | 64 | } |
CactusSemi | 3:3e8c16b6620c | 65 | pc.printf("\n\n\n\r\tWaiting at bit position %d ..... Monitor adc_op_clk pin\n\n\r\tPress 'q' to quit hot read : ", i); |
CactusSemi | 3:3e8c16b6620c | 66 | while(temp!='q') { |
CactusSemi | 3:3e8c16b6620c | 67 | temp = pc.getc(); |
CactusSemi | 3:3e8c16b6620c | 68 | } |
CactusSemi | 3:3e8c16b6620c | 69 | //send out the remaining clock pulses |
CactusSemi | 3:3e8c16b6620c | 70 | for(; i >= 0; i = i-1) { |
CactusSemi | 3:3e8c16b6620c | 71 | scl = 1; |
CactusSemi | 3:3e8c16b6620c | 72 | wait_us(delay2); |
CactusSemi | 3:3e8c16b6620c | 73 | scl = 0; |
CactusSemi | 3:3e8c16b6620c | 74 | wait_us(delay2); |
CactusSemi | 3:3e8c16b6620c | 75 | } |
CactusSemi | 3:3e8c16b6620c | 76 | //Transmit NACK (pull sda high before the 9th pulse) |
CactusSemi | 3:3e8c16b6620c | 77 | sda.output(); |
CactusSemi | 3:3e8c16b6620c | 78 | sda = 1; |
CactusSemi | 3:3e8c16b6620c | 79 | wait_us(delay2); |
CactusSemi | 3:3e8c16b6620c | 80 | scl = 1; |
CactusSemi | 3:3e8c16b6620c | 81 | wait_us(delay2); |
CactusSemi | 3:3e8c16b6620c | 82 | scl = 0; |
CactusSemi | 3:3e8c16b6620c | 83 | wait_us(delay2); |
CactusSemi | 3:3e8c16b6620c | 84 | sda = 1; |
CactusSemi | 3:3e8c16b6620c | 85 | wait_us(10); |
CactusSemi | 3:3e8c16b6620c | 86 | //Transmit Stop (scl high followed by sda high) |
CactusSemi | 3:3e8c16b6620c | 87 | sda = 0; |
CactusSemi | 3:3e8c16b6620c | 88 | wait_us(delay2); |
CactusSemi | 3:3e8c16b6620c | 89 | scl = 1; |
CactusSemi | 3:3e8c16b6620c | 90 | wait_us(delay1); |
CactusSemi | 3:3e8c16b6620c | 91 | sda = 1; |
CactusSemi | 3:3e8c16b6620c | 92 | wait_us(200); |
CactusSemi | 3:3e8c16b6620c | 93 | sda.~DigitalInOut(); |
CactusSemi | 3:3e8c16b6620c | 94 | scl.~DigitalOut(); |
CactusSemi | 3:3e8c16b6620c | 95 | } |
CactusSemi | 3:3e8c16b6620c | 96 | |
CactusSemi | 3:3e8c16b6620c | 97 | void hot_read() { |
CactusSemi | 3:3e8c16b6620c | 98 | char reg_ptr = 0x55; |
CactusSemi | 3:3e8c16b6620c | 99 | char temp; |
CactusSemi | 3:3e8c16b6620c | 100 | int flag1 = 0; |
CactusSemi | 3:3e8c16b6620c | 101 | char bit_position = 0; |
CactusSemi | 3:3e8c16b6620c | 102 | I2C i2c(p9,p10); |
CactusSemi | 3:3e8c16b6620c | 103 | LPC_PINCON->PINMODE_OD0 = (LPC_PINCON->PINMODE_OD0 | 0x0003); // To make p9 & P10 open_drain |
CactusSemi | 3:3e8c16b6620c | 104 | pc.printf("\n\n\n\r\tYahoooo! Lets Perform a Hot Read"); |
CactusSemi | 3:3e8c16b6620c | 105 | Re_enter: |
CactusSemi | 3:3e8c16b6620c | 106 | flag1 = 0; |
CactusSemi | 3:3e8c16b6620c | 107 | //Read Pointer to the Register that needs to be read |
CactusSemi | 3:3e8c16b6620c | 108 | while (!flag1) { |
CactusSemi | 3:3e8c16b6620c | 109 | pc.printf("\n\n\r\tEnter Register Address in hex (0 to f): "); |
CactusSemi | 3:3e8c16b6620c | 110 | reg_ptr = get_half_byte(&flag1); |
CactusSemi | 3:3e8c16b6620c | 111 | if (flag1==0) pc.printf(" \n\r\t\033[%dm Invalid Chracter!! No worries, let us try again \033[%dm",41,40); |
CactusSemi | 3:3e8c16b6620c | 112 | } |
CactusSemi | 3:3e8c16b6620c | 113 | //Read the bit at which hot read is to be performed |
CactusSemi | 3:3e8c16b6620c | 114 | flag1=0; |
CactusSemi | 3:3e8c16b6620c | 115 | while (!flag1) { |
CactusSemi | 3:3e8c16b6620c | 116 | pc.printf("\n\n\r\tEnter bit position to be read (0 to 7): "); |
CactusSemi | 3:3e8c16b6620c | 117 | bit_position = get_half_byte(&flag1); |
CactusSemi | 3:3e8c16b6620c | 118 | if (bit_position > 7) flag1 = 0; |
CactusSemi | 3:3e8c16b6620c | 119 | if (flag1==0) pc.printf(" \n\r\t\033[%dm Invalid Choice!! No worries, let us try again \033[%dm",41,40); |
CactusSemi | 3:3e8c16b6620c | 120 | } |
CactusSemi | 3:3e8c16b6620c | 121 | |
CactusSemi | 3:3e8c16b6620c | 122 | pc.printf("\n\n\n\r\t\033[%dm", 44);//change backround to blue |
CactusSemi | 3:3e8c16b6620c | 123 | pc.printf(" Device Address (fixed) = 0x%2.2X ; Register Pointer = 0x%2.2X ; bit position = %d ",dev_addr, reg_ptr, bit_position); |
CactusSemi | 3:3e8c16b6620c | 124 | pc.printf("\033[%dm", 40);//change backround to black |
CactusSemi | 3:3e8c16b6620c | 125 | |
CactusSemi | 3:3e8c16b6620c | 126 | pc.printf("\n\n\n\r\tContinue Read? (y/n) [Press 'e' to re-enter]: "); |
CactusSemi | 3:3e8c16b6620c | 127 | temp = 0; |
CactusSemi | 3:3e8c16b6620c | 128 | while ( temp!='y' && temp!='n' && temp!='e') { |
CactusSemi | 3:3e8c16b6620c | 129 | temp = pc.getc(); |
CactusSemi | 3:3e8c16b6620c | 130 | } |
CactusSemi | 3:3e8c16b6620c | 131 | if (temp == 'n') { |
CactusSemi | 3:3e8c16b6620c | 132 | pc.printf("\n\n\r\tAborting Register Read :("); |
CactusSemi | 3:3e8c16b6620c | 133 | return; |
CactusSemi | 3:3e8c16b6620c | 134 | } |
CactusSemi | 3:3e8c16b6620c | 135 | if (temp == 'e') { |
CactusSemi | 3:3e8c16b6620c | 136 | pc.printf(" \n\n\n\r\tOk, let us try again :)"); |
CactusSemi | 3:3e8c16b6620c | 137 | goto Re_enter; |
CactusSemi | 3:3e8c16b6620c | 138 | } |
CactusSemi | 3:3e8c16b6620c | 139 | i2c.frequency(frequ*1000); |
CactusSemi | 3:3e8c16b6620c | 140 | i2c.stop(); //add a stop after a previous hot-read |
CactusSemi | 3:3e8c16b6620c | 141 | i2c.start(); |
CactusSemi | 3:3e8c16b6620c | 142 | flag1 = i2c.write(dev_addr); |
CactusSemi | 3:3e8c16b6620c | 143 | if (flag1 != 1) pc.printf("\n\n\n\r\tNo Ack for dev addr :("); |
CactusSemi | 3:3e8c16b6620c | 144 | flag1 = i2c.write(reg_ptr); |
CactusSemi | 3:3e8c16b6620c | 145 | if (flag1 != 1) pc.printf("\n\n\r\tNo Ack reg pointer :("); |
CactusSemi | 3:3e8c16b6620c | 146 | i2c.stop(); |
CactusSemi | 3:3e8c16b6620c | 147 | pc.printf("\n\n\n\r\tPress 's' to start hot read [Press 'a' to abort] : "); |
CactusSemi | 3:3e8c16b6620c | 148 | while(temp!='s' && temp!='a') { |
CactusSemi | 3:3e8c16b6620c | 149 | temp = pc.getc(); |
CactusSemi | 3:3e8c16b6620c | 150 | } |
CactusSemi | 3:3e8c16b6620c | 151 | if (temp == 'a') { |
CactusSemi | 3:3e8c16b6620c | 152 | pc.printf("\n\n\r\tAborting Register Read :("); |
CactusSemi | 3:3e8c16b6620c | 153 | return; |
CactusSemi | 3:3e8c16b6620c | 154 | } |
CactusSemi | 3:3e8c16b6620c | 155 | read_bit(bit_position); |
CactusSemi | 3:3e8c16b6620c | 156 | } |