123

Dependencies:   mbed

Fork of LG by igor Apu

Committer:
Diletant
Date:
Sun Jul 31 06:19:02 2016 +0000
Revision:
183:c7a9c309086c
Parent:
167:bedc0a9d559a
Device&... update. More AskGld&Techno functionality.NotFinal!!!

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 183:c7a9c309086c 14 //I2C SCL Duty Cycle Register
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 183:c7a9c309086c 27 //Attention!!!
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 183:c7a9c309086c 40 device.controller.I2C.state.buffer[2] = 255 - 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 183:c7a9c309086c 43 device.controller.I2C.state.buffer[5] = 255 - 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 183:c7a9c309086c 47 device.controller.I2C.state.enabled = 0;
Diletant 167:bedc0a9d559a 48 }
Diletant 167:bedc0a9d559a 49
Diletant 167:bedc0a9d559a 50 void DeviceStartI2C(void) {
Diletant 183:c7a9c309086c 51 LPC_SC->PCONP |= (1 << 7);//I2C0 power on
Diletant 156:e68ee0bcdcda 52
Diletant 156:e68ee0bcdcda 53 LPC_PINCON->PINSEL1 &= ~0x03C00000; //P0.27 - SDA
Diletant 156:e68ee0bcdcda 54 LPC_PINCON->PINSEL1 |= 0x01400000; //P0.28 - SCK
Diletant 156:e68ee0bcdcda 55
Diletant 156:e68ee0bcdcda 56 LPC_I2C0->CONCLR = I2CONCLR_AAC | I2CONCLR_SIC | I2CONCLR_STAC | I2CONCLR_I2ENC; //Master mode
Diletant 156:e68ee0bcdcda 57 //LPC_I2C0->I2CONCLR = I2CONCLR_AAC | I2CONCLR_SIC | I2CONCLR_STAC | I2CONCLR_I2ENC; //Master mode
Diletant 156:e68ee0bcdcda 58
Diletant 156:e68ee0bcdcda 59 LPC_I2C0->SCLL = I2SCLL_SCLL; // - счетчик scl low time period
Diletant 156:e68ee0bcdcda 60 //LPC_I2C0->I2SCLL = I2SCLL_SCLL; // - счетчик scl low time period
Diletant 156:e68ee0bcdcda 61 LPC_I2C0->SCLH = I2SCLH_SCLH; // - счетчик scl high time period
Diletant 156:e68ee0bcdcda 62 //LPC_I2C0->I2SCLH = I2SCLH_SCLH; // - счетчик scl high time period
Diletant 156:e68ee0bcdcda 63
Diletant 156:e68ee0bcdcda 64 LPC_I2C0->CONSET = I2CONSET_I2EN; //включение интерфейса I2C
Diletant 156:e68ee0bcdcda 65 //LPC_I2C0->I2CONSET = I2CONSET_I2EN; //включение интерфейса I2C
Diletant 156:e68ee0bcdcda 66
Diletant 156:e68ee0bcdcda 67 device.controller.I2C.state.CON0 = LPC_I2C0->CONSET & (~LPC_I2C0->CONCLR);
Diletant 183:c7a9c309086c 68
Diletant 183:c7a9c309086c 69 i2cEnableTransmission();
Diletant 156:e68ee0bcdcda 70 }
Diletant 156:e68ee0bcdcda 71
Diletant 183:c7a9c309086c 72 void i2cProcess(void) {
Diletant 183:c7a9c309086c 73 if (!device.controller.I2C.state.enabled) return; //Transmission disabled, go away
Diletant 156:e68ee0bcdcda 74
Diletant 156:e68ee0bcdcda 75 device.controller.I2C.state.counter++;
Diletant 156:e68ee0bcdcda 76 if (device.controller.I2C.state.counter > device.controller.I2C.state.trigger){//Time out, go away
Diletant 156:e68ee0bcdcda 77 device.controller.I2C.state.counter = 0;
Diletant 156:e68ee0bcdcda 78 device.controller.I2C.state.enabled = 0;
Diletant 156:e68ee0bcdcda 79 LPC_I2C0->CONSET = I2CONSET_STO; //Set Stop flag
Diletant 156:e68ee0bcdcda 80 //LPC_I2C0->I2CONSET = I2CONSET_STO; //Set Stop flag
Diletant 156:e68ee0bcdcda 81 LPC_I2C0->CONCLR = I2CONCLR_AAC | I2CONCLR_SIC | I2CONCLR_STAC;
Diletant 156:e68ee0bcdcda 82 //LPC_I2C0->I2CONCLR = I2CONCLR_AAC | I2CONCLR_SIC | I2CONCLR_STAC;
Diletant 156:e68ee0bcdcda 83 return;
Diletant 156:e68ee0bcdcda 84 }
Diletant 156:e68ee0bcdcda 85
Diletant 156:e68ee0bcdcda 86 if (!(LPC_I2C0->CONSET & I2CONSET_SI)) return; //State of I2C bus has not been changed
Diletant 156:e68ee0bcdcda 87 //if (!(LPC_I2C0->I2CONSET & I2CONSET_SI)) return; //State of I2C bus has not been changed
Diletant 156:e68ee0bcdcda 88
Diletant 156:e68ee0bcdcda 89 uint32_t StatValue = LPC_I2C0->STAT;
Diletant 156:e68ee0bcdcda 90 //uint32_t StatValue = LPC_I2C0->I2STAT;
Diletant 156:e68ee0bcdcda 91 switch ( StatValue ) {
Diletant 156:e68ee0bcdcda 92 //Start condition issued (write data for the first potentiometer)
Diletant 156:e68ee0bcdcda 93 case 0x08:
Diletant 156:e68ee0bcdcda 94 device.controller.I2C.state.position = 0; //Init buffer position
Diletant 156:e68ee0bcdcda 95 device.controller.I2C.state.counter = 0; //Init countdown
Diletant 156:e68ee0bcdcda 96 LPC_I2C0->DAT = device.controller.I2C.state.buffer[device.controller.I2C.state.position++]; //Send address
Diletant 156:e68ee0bcdcda 97 //LPC_I2C0->I2DAT = device.controller.I2C.state.buffer[device.controller.I2C.state.position++]; //Send address
Diletant 156:e68ee0bcdcda 98 LPC_I2C0->CONCLR = (I2CONCLR_SIC | I2CONCLR_STAC); //Clear interrupt bit and start bit
Diletant 156:e68ee0bcdcda 99 //LPC_I2C0->I2CONCLR = (I2CONCLR_SIC | I2CONCLR_STAC); //Clear interrupt bit and start bit
Diletant 156:e68ee0bcdcda 100 break;
Diletant 156:e68ee0bcdcda 101
Diletant 156:e68ee0bcdcda 102 //Repeated started is issued (write data for the second potentiometer)
Diletant 156:e68ee0bcdcda 103 case 0x10:
Diletant 156:e68ee0bcdcda 104 LPC_I2C0->DAT = device.controller.I2C.state.buffer[device.controller.I2C.state.position++]; //Send address
Diletant 156:e68ee0bcdcda 105 //LPC_I2C0->I2DAT = device.controller.I2C.state.buffer[device.controller.I2C.state.position++]; //Send address
Diletant 156:e68ee0bcdcda 106 LPC_I2C0->CONCLR = (I2CONCLR_SIC | I2CONCLR_STAC); //Clear interrupt bit and start bit
Diletant 156:e68ee0bcdcda 107 //LPC_I2C0->I2CONCLR = (I2CONCLR_SIC | I2CONCLR_STAC); //Clear interrupt bit and start bit
Diletant 156:e68ee0bcdcda 108 break;
Diletant 156:e68ee0bcdcda 109
Diletant 156:e68ee0bcdcda 110 //ACK after slave address reading
Diletant 156:e68ee0bcdcda 111 case 0x18:
Diletant 156:e68ee0bcdcda 112 LPC_I2C0->DAT = device.controller.I2C.state.buffer[device.controller.I2C.state.position++]; //Send another byte
Diletant 156:e68ee0bcdcda 113 //LPC_I2C0->I2DAT = device.controller.I2C.state.buffer[device.controller.I2C.state.position++]; //Send another byte
Diletant 156:e68ee0bcdcda 114 LPC_I2C0->CONCLR = I2CONCLR_SIC; //Clear interrupt bit
Diletant 156:e68ee0bcdcda 115 //LPC_I2C0->I2CONCLR = I2CONCLR_SIC; //Clear interrupt bit
Diletant 156:e68ee0bcdcda 116 break;
Diletant 156:e68ee0bcdcda 117
Diletant 156:e68ee0bcdcda 118 //ACK after data byte
Diletant 156:e68ee0bcdcda 119 case 0x28:
Diletant 183:c7a9c309086c 120 if (device.controller.I2C.state.position == I2C_BUFFER_LENGTH) { //Data transmission finished
Diletant 156:e68ee0bcdcda 121 device.controller.I2C.state.enabled = 0;
Diletant 156:e68ee0bcdcda 122 LPC_I2C0->CONSET = I2CONSET_STO; //Set Stop flag
Diletant 156:e68ee0bcdcda 123 //LPC_I2C0->I2CONSET = I2CONSET_STO; //Set Stop flag
Diletant 156:e68ee0bcdcda 124 } else if (device.controller.I2C.state.position == 3) {
Diletant 156:e68ee0bcdcda 125 LPC_I2C0->CONSET = I2CONSET_STA;
Diletant 156:e68ee0bcdcda 126 //LPC_I2C0->I2CONSET = I2CONSET_STA;
Diletant 183:c7a9c309086c 127 //sprintf(device.service.buffer, "I2C 0x28 mid\r\n"); WriteConcole(); //Development message
Diletant 156:e68ee0bcdcda 128 } else {
Diletant 156:e68ee0bcdcda 129 LPC_I2C0->DAT = device.controller.I2C.state.buffer[device.controller.I2C.state.position++];//Send another byte
Diletant 156:e68ee0bcdcda 130 //LPC_I2C0->I2DAT = device.controller.I2C.state.buffer[device.controller.I2C.state.position++];//Send another byte
Diletant 156:e68ee0bcdcda 131 }
Diletant 156:e68ee0bcdcda 132 LPC_I2C0->CONCLR = I2CONCLR_SIC; //Clear interrupt bit
Diletant 156:e68ee0bcdcda 133 //LPC_I2C0->I2CONCLR = I2CONCLR_SIC; //Clear interrupt bit
Diletant 156:e68ee0bcdcda 134 break;
Diletant 156:e68ee0bcdcda 135
Diletant 156:e68ee0bcdcda 136 //No acknoledgement after address transmitting
Diletant 156:e68ee0bcdcda 137 case 0x20:
Diletant 156:e68ee0bcdcda 138 //No acknoledgement after data block transmitting
Diletant 156:e68ee0bcdcda 139 case 0x30:
Diletant 156:e68ee0bcdcda 140 LPC_I2C0->CONSET = I2CONSET_STO; //Set Stop flag
Diletant 156:e68ee0bcdcda 141 //LPC_I2C0->I2CONSET = I2CONSET_STO; //Set Stop flag
Diletant 156:e68ee0bcdcda 142 LPC_I2C0->CONCLR = (I2CONCLR_SIC | I2CONCLR_STAC);
Diletant 156:e68ee0bcdcda 143 //LPC_I2C0->I2CONCLR = (I2CONCLR_SIC | I2CONCLR_STAC);
Diletant 183:c7a9c309086c 144 device.controller.I2C.state.enabled = 0; //Disable transmission
Diletant 156:e68ee0bcdcda 145 break;
Diletant 156:e68ee0bcdcda 146 }
Diletant 156:e68ee0bcdcda 147 }
Diletant 156:e68ee0bcdcda 148
Diletant 183:c7a9c309086c 149 void i2cEnableTransmission(void){
Diletant 156:e68ee0bcdcda 150 device.controller.I2C.state.position = 0;
Diletant 183:c7a9c309086c 151 device.controller.I2C.state.counter = 0;
Diletant 156:e68ee0bcdcda 152 LPC_I2C0->CONSET = I2CONSET_STA; //Set start flag
Diletant 156:e68ee0bcdcda 153 //LPC_I2C0->I2CONSET = I2CONSET_STA; //Set start flag
Diletant 183:c7a9c309086c 154 device.controller.I2C.state.enabled = 1; //Enable transmission
Diletant 156:e68ee0bcdcda 155 }