123

Dependencies:   mbed

Fork of LG by igor Apu

Committer:
Diletant
Date:
Sun Jun 05 11:03:33 2016 +0000
Revision:
167:bedc0a9d559a
Parent:
161:efd949e8d536
Child:
183:c7a9c309086c
Device & ... update. Not final!!!

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Diletant 156:e68ee0bcdcda 1 #include "Device.h"
Diletant 156:e68ee0bcdcda 2
Diletant 156:e68ee0bcdcda 3 //I2C Control Set Register
Diletant 156:e68ee0bcdcda 4 #define I2CONSET_I2EN 0x0000040
Diletant 156:e68ee0bcdcda 5 #define I2CONSET_AA 0x0000004
Diletant 156:e68ee0bcdcda 6 #define I2CONSET_SI 0x0000008
Diletant 156:e68ee0bcdcda 7 #define I2CONSET_STO 0x0000010
Diletant 156:e68ee0bcdcda 8 #define I2CONSET_STA 0x0000020
Diletant 156:e68ee0bcdcda 9 //I2C Control clear Register
Diletant 156:e68ee0bcdcda 10 #define I2CONCLR_AAC 0x0000004
Diletant 156:e68ee0bcdcda 11 #define I2CONCLR_SIC 0x0000008
Diletant 156:e68ee0bcdcda 12 #define I2CONCLR_STAC 0x0000020
Diletant 156:e68ee0bcdcda 13 #define I2CONCLR_I2ENC 0x0000040
Diletant 156:e68ee0bcdcda 14 //I2C SCL Duty Cycle High Reg
Diletant 156:e68ee0bcdcda 15 #define I2SCLH_SCLH 0x00000080 //High
Diletant 156:e68ee0bcdcda 16 #define I2SCLL_SCLL 0x00000080 //Low
Diletant 156:e68ee0bcdcda 17 //Address
Diletant 156:e68ee0bcdcda 18 #define I2C_A_ADDRESS 0x0000005E //address of slave potentiometer A (table 6-2 of pot's manual)
Diletant 156:e68ee0bcdcda 19 #define I2C_B_ADDRESS 0x0000005C //address of slave potentiometer B (table 6-2 of pot's manual)
Diletant 156:e68ee0bcdcda 20 #define I2C_WRITE_CMD 0x00000000 //address of wiper0 register in memory map
Diletant 156:e68ee0bcdcda 21 //Timeout
Diletant 156:e68ee0bcdcda 22 #define I2C_TIMEOUT 1000
Diletant 156:e68ee0bcdcda 23
Diletant 156:e68ee0bcdcda 24 extern Device device;
Diletant 156:e68ee0bcdcda 25
Diletant 156:e68ee0bcdcda 26 //
Diletant 156:e68ee0bcdcda 27 //Warning!!!
Diletant 156:e68ee0bcdcda 28 // Different LPC17xx.h versions declare different I2C registers names:
Diletant 156:e68ee0bcdcda 29 // LPC_I2C0->CONCLR (Keil?)/ LPC_I2C0->I2CONCLR (mbed)
Diletant 156:e68ee0bcdcda 30 // ...
Diletant 156:e68ee0bcdcda 31 //
Diletant 156:e68ee0bcdcda 32
Diletant 167:bedc0a9d559a 33 void InitI2CDefaultSettings(void){
Diletant 156:e68ee0bcdcda 34 device.controller.I2C.settings.trigger = 1000;
Diletant 156:e68ee0bcdcda 35 }
Diletant 156:e68ee0bcdcda 36
Diletant 167:bedc0a9d559a 37 void InitI2CState(void) {
Diletant 156:e68ee0bcdcda 38 device.controller.I2C.state.buffer[0] = I2C_A_ADDRESS;
Diletant 156:e68ee0bcdcda 39 device.controller.I2C.state.buffer[1] = I2C_WRITE_CMD;
Diletant 161:efd949e8d536 40 device.controller.I2C.state.buffer[2] = device.isacs.potentiometers.settings.a;
Diletant 156:e68ee0bcdcda 41 device.controller.I2C.state.buffer[3] = I2C_B_ADDRESS;
Diletant 156:e68ee0bcdcda 42 device.controller.I2C.state.buffer[4] = I2C_WRITE_CMD;
Diletant 161:efd949e8d536 43 device.controller.I2C.state.buffer[5] = device.isacs.potentiometers.settings.b;
Diletant 156:e68ee0bcdcda 44 device.controller.I2C.state.position = 0;
Diletant 156:e68ee0bcdcda 45 device.controller.I2C.state.counter = 0;
Diletant 156:e68ee0bcdcda 46 device.controller.I2C.state.trigger = device.controller.I2C.settings.trigger;
Diletant 167:bedc0a9d559a 47 }
Diletant 167:bedc0a9d559a 48
Diletant 167:bedc0a9d559a 49 void DeviceStartI2C(void) {
Diletant 156:e68ee0bcdcda 50 LPC_SC->PCONP |= (1 << 7);//I2C0 on
Diletant 156:e68ee0bcdcda 51 //LPC_SC->PCONP |= (1 << 19);//I2C1 on
Diletant 156:e68ee0bcdcda 52
Diletant 156:e68ee0bcdcda 53 // set PIO0.27 and PIO0.28 to I2C0 SDA and SCK
Diletant 156:e68ee0bcdcda 54 // function to 01 on both SDA and SCK
Diletant 156:e68ee0bcdcda 55 LPC_PINCON->PINSEL1 &= ~0x03C00000; //P0.27 - SDA
Diletant 156:e68ee0bcdcda 56 LPC_PINCON->PINSEL1 |= 0x01400000; //P0.28 - SCK
Diletant 156:e68ee0bcdcda 57
Diletant 156:e68ee0bcdcda 58 LPC_I2C0->CONCLR = I2CONCLR_AAC | I2CONCLR_SIC | I2CONCLR_STAC | I2CONCLR_I2ENC; //Master mode
Diletant 156:e68ee0bcdcda 59 //LPC_I2C0->I2CONCLR = I2CONCLR_AAC | I2CONCLR_SIC | I2CONCLR_STAC | I2CONCLR_I2ENC; //Master mode
Diletant 156:e68ee0bcdcda 60
Diletant 156:e68ee0bcdcda 61 LPC_I2C0->SCLL = I2SCLL_SCLL; // - счетчик scl low time period
Diletant 156:e68ee0bcdcda 62 //LPC_I2C0->I2SCLL = I2SCLL_SCLL; // - счетчик scl low time period
Diletant 156:e68ee0bcdcda 63 LPC_I2C0->SCLH = I2SCLH_SCLH; // - счетчик scl high time period
Diletant 156:e68ee0bcdcda 64 //LPC_I2C0->I2SCLH = I2SCLH_SCLH; // - счетчик scl high time period
Diletant 156:e68ee0bcdcda 65
Diletant 156:e68ee0bcdcda 66 LPC_I2C0->CONSET = I2CONSET_I2EN; //включение интерфейса I2C
Diletant 156:e68ee0bcdcda 67 //LPC_I2C0->I2CONSET = I2CONSET_I2EN; //включение интерфейса I2C
Diletant 156:e68ee0bcdcda 68
Diletant 156:e68ee0bcdcda 69 device.controller.I2C.state.CON0 = LPC_I2C0->CONSET & (~LPC_I2C0->CONCLR);
Diletant 156:e68ee0bcdcda 70 //device.controller.I2C.state.CON0 = LPC_I2C0->I2CONSET & (~LPC_I2C0->I2CONCLR);
Diletant 156:e68ee0bcdcda 71 }
Diletant 156:e68ee0bcdcda 72
Diletant 156:e68ee0bcdcda 73 void DeviceI2CTransmit(void) {
Diletant 156:e68ee0bcdcda 74 if (!device.controller.I2C.state.enabled) return; //Transmission disabled, go away
Diletant 156:e68ee0bcdcda 75
Diletant 156:e68ee0bcdcda 76 device.controller.I2C.state.counter++;
Diletant 156:e68ee0bcdcda 77 if (device.controller.I2C.state.counter > device.controller.I2C.state.trigger){//Time out, go away
Diletant 156:e68ee0bcdcda 78 device.controller.I2C.state.counter = 0;
Diletant 156:e68ee0bcdcda 79 device.controller.I2C.state.enabled = 0;
Diletant 156:e68ee0bcdcda 80 LPC_I2C0->CONSET = I2CONSET_STO; //Set Stop flag
Diletant 156:e68ee0bcdcda 81 //LPC_I2C0->I2CONSET = I2CONSET_STO; //Set Stop flag
Diletant 156:e68ee0bcdcda 82 LPC_I2C0->CONCLR = I2CONCLR_AAC | I2CONCLR_SIC | I2CONCLR_STAC;
Diletant 156:e68ee0bcdcda 83 //LPC_I2C0->I2CONCLR = I2CONCLR_AAC | I2CONCLR_SIC | I2CONCLR_STAC;
Diletant 156:e68ee0bcdcda 84 return;
Diletant 156:e68ee0bcdcda 85 }
Diletant 156:e68ee0bcdcda 86
Diletant 156:e68ee0bcdcda 87 if (!(LPC_I2C0->CONSET & I2CONSET_SI)) return; //State of I2C bus has not been changed
Diletant 156:e68ee0bcdcda 88 //if (!(LPC_I2C0->I2CONSET & I2CONSET_SI)) return; //State of I2C bus has not been changed
Diletant 156:e68ee0bcdcda 89
Diletant 156:e68ee0bcdcda 90 uint32_t StatValue = LPC_I2C0->STAT;
Diletant 156:e68ee0bcdcda 91 //uint32_t StatValue = LPC_I2C0->I2STAT;
Diletant 156:e68ee0bcdcda 92 switch ( StatValue ) {
Diletant 156:e68ee0bcdcda 93 //Start condition issued (write data for the first potentiometer)
Diletant 156:e68ee0bcdcda 94 case 0x08:
Diletant 156:e68ee0bcdcda 95 device.controller.I2C.state.position = 0; //Init buffer position
Diletant 156:e68ee0bcdcda 96 device.controller.I2C.state.counter = 0; //Init countdown
Diletant 156:e68ee0bcdcda 97 LPC_I2C0->DAT = device.controller.I2C.state.buffer[device.controller.I2C.state.position++]; //Send address
Diletant 156:e68ee0bcdcda 98 //LPC_I2C0->I2DAT = device.controller.I2C.state.buffer[device.controller.I2C.state.position++]; //Send address
Diletant 156:e68ee0bcdcda 99 LPC_I2C0->CONCLR = (I2CONCLR_SIC | I2CONCLR_STAC); //Clear interrupt bit and start bit
Diletant 156:e68ee0bcdcda 100 //LPC_I2C0->I2CONCLR = (I2CONCLR_SIC | I2CONCLR_STAC); //Clear interrupt bit and start bit
Diletant 156:e68ee0bcdcda 101 break;
Diletant 156:e68ee0bcdcda 102
Diletant 156:e68ee0bcdcda 103 //Repeated started is issued (write data for the second potentiometer)
Diletant 156:e68ee0bcdcda 104 case 0x10:
Diletant 156:e68ee0bcdcda 105 LPC_I2C0->DAT = device.controller.I2C.state.buffer[device.controller.I2C.state.position++]; //Send address
Diletant 156:e68ee0bcdcda 106 //LPC_I2C0->I2DAT = device.controller.I2C.state.buffer[device.controller.I2C.state.position++]; //Send address
Diletant 156:e68ee0bcdcda 107 LPC_I2C0->CONCLR = (I2CONCLR_SIC | I2CONCLR_STAC); //Clear interrupt bit and start bit
Diletant 156:e68ee0bcdcda 108 //LPC_I2C0->I2CONCLR = (I2CONCLR_SIC | I2CONCLR_STAC); //Clear interrupt bit and start bit
Diletant 156:e68ee0bcdcda 109 break;
Diletant 156:e68ee0bcdcda 110
Diletant 156:e68ee0bcdcda 111 //ACK after slave address reading
Diletant 156:e68ee0bcdcda 112 case 0x18:
Diletant 156:e68ee0bcdcda 113 LPC_I2C0->DAT = device.controller.I2C.state.buffer[device.controller.I2C.state.position++]; //Send another byte
Diletant 156:e68ee0bcdcda 114 //LPC_I2C0->I2DAT = device.controller.I2C.state.buffer[device.controller.I2C.state.position++]; //Send another byte
Diletant 156:e68ee0bcdcda 115 LPC_I2C0->CONCLR = I2CONCLR_SIC; //Clear interrupt bit
Diletant 156:e68ee0bcdcda 116 //LPC_I2C0->I2CONCLR = I2CONCLR_SIC; //Clear interrupt bit
Diletant 156:e68ee0bcdcda 117 break;
Diletant 156:e68ee0bcdcda 118
Diletant 156:e68ee0bcdcda 119 //ACK after data byte
Diletant 156:e68ee0bcdcda 120 case 0x28:
Diletant 156:e68ee0bcdcda 121 if (device.controller.I2C.state.position == I2C_BUFFER_LENGTH) { //Data transmission finished
Diletant 156:e68ee0bcdcda 122 device.controller.I2C.state.enabled = 0;
Diletant 156:e68ee0bcdcda 123 LPC_I2C0->CONSET = I2CONSET_STO; //Set Stop flag
Diletant 156:e68ee0bcdcda 124 //LPC_I2C0->I2CONSET = I2CONSET_STO; //Set Stop flag
Diletant 156:e68ee0bcdcda 125 //Output.Str.Cnt_Dif = 300;
Diletant 156:e68ee0bcdcda 126 } else if (device.controller.I2C.state.position == 3) {
Diletant 156:e68ee0bcdcda 127 LPC_I2C0->CONSET = I2CONSET_STA;
Diletant 156:e68ee0bcdcda 128 //LPC_I2C0->I2CONSET = I2CONSET_STA;
Diletant 156:e68ee0bcdcda 129 //Output.Str.Cnt_Dif = 200;
Diletant 156:e68ee0bcdcda 130 } else {
Diletant 156:e68ee0bcdcda 131 LPC_I2C0->DAT = device.controller.I2C.state.buffer[device.controller.I2C.state.position++];//Send another byte
Diletant 156:e68ee0bcdcda 132 //LPC_I2C0->I2DAT = device.controller.I2C.state.buffer[device.controller.I2C.state.position++];//Send another byte
Diletant 156:e68ee0bcdcda 133 //Output.Str.Cnt_Dif = 100;
Diletant 156:e68ee0bcdcda 134 }
Diletant 156:e68ee0bcdcda 135 LPC_I2C0->CONCLR = I2CONCLR_SIC; //Clear interrupt bit
Diletant 156:e68ee0bcdcda 136 //LPC_I2C0->I2CONCLR = I2CONCLR_SIC; //Clear interrupt bit
Diletant 156:e68ee0bcdcda 137 break;
Diletant 156:e68ee0bcdcda 138
Diletant 156:e68ee0bcdcda 139 //No acknoledgement after address transmitting
Diletant 156:e68ee0bcdcda 140 case 0x20:
Diletant 156:e68ee0bcdcda 141 //No acknoledgement after data block transmitting
Diletant 156:e68ee0bcdcda 142 case 0x30:
Diletant 156:e68ee0bcdcda 143 LPC_I2C0->CONSET = I2CONSET_STO; //Set Stop flag
Diletant 156:e68ee0bcdcda 144 //LPC_I2C0->I2CONSET = I2CONSET_STO; //Set Stop flag
Diletant 156:e68ee0bcdcda 145 LPC_I2C0->CONCLR = (I2CONCLR_SIC | I2CONCLR_STAC);
Diletant 156:e68ee0bcdcda 146 //LPC_I2C0->I2CONCLR = (I2CONCLR_SIC | I2CONCLR_STAC);
Diletant 156:e68ee0bcdcda 147 device.controller.I2C.state.enabled = 0; //Disable transmission
Diletant 156:e68ee0bcdcda 148 break;
Diletant 156:e68ee0bcdcda 149 }
Diletant 156:e68ee0bcdcda 150 }
Diletant 156:e68ee0bcdcda 151
Diletant 156:e68ee0bcdcda 152 void StartI2CTransmission(void){
Diletant 156:e68ee0bcdcda 153 device.controller.I2C.state.position = 0;
Diletant 156:e68ee0bcdcda 154 device.controller.I2C.state.counter = I2C_TIMEOUT;
Diletant 156:e68ee0bcdcda 155 LPC_I2C0->CONSET = I2CONSET_STA; //Set start flag
Diletant 156:e68ee0bcdcda 156 //LPC_I2C0->I2CONSET = I2CONSET_STA; //Set start flag
Diletant 156:e68ee0bcdcda 157 device.controller.I2C.state.enabled = 1; //Enable transmission
Diletant 156:e68ee0bcdcda 158 }