Publishing for sharing with Harald

Dependencies:   csi059

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?

UserRevisionLine numberNew 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 }