123

Dependencies:   mbed

Fork of LG by igor Apu

Committer:
Kovalev_D
Date:
Wed Feb 03 10:44:42 2016 +0300
Revision:
22:12e6183f04d4
[thyz

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Kovalev_D 22:12e6183f04d4 1 #include "InputOutput.h"
Kovalev_D 22:12e6183f04d4 2 #include "lpc17xx.h"
Kovalev_D 22:12e6183f04d4 3
Kovalev_D 22:12e6183f04d4 4 INPUT Input;
Kovalev_D 22:12e6183f04d4 5 OUTPUT Output;
Kovalev_D 22:12e6183f04d4 6
Kovalev_D 22:12e6183f04d4 7 volatile uint32_t I2CMasterState = I2C_IDLE;
Kovalev_D 22:12e6183f04d4 8 volatile uint32_t I2CMasterBuffer[I2C_WRITELENGTH];
Kovalev_D 22:12e6183f04d4 9
Kovalev_D 22:12e6183f04d4 10 int ExchangeErr = 0;
Kovalev_D 22:12e6183f04d4 11
Kovalev_D 22:12e6183f04d4 12 /******************************************************************************
Kovalev_D 22:12e6183f04d4 13 ** Function name: G_Photo_Exchange
Kovalev_D 22:12e6183f04d4 14 **
Kovalev_D 22:12e6183f04d4 15 ** Descriptions: Driver for I2C exchange
Kovalev_D 22:12e6183f04d4 16 **
Kovalev_D 22:12e6183f04d4 17 ** parameters: None
Kovalev_D 22:12e6183f04d4 18 ** Returned value: None
Kovalev_D 22:12e6183f04d4 19 **
Kovalev_D 22:12e6183f04d4 20 ******************************************************************************/
Kovalev_D 22:12e6183f04d4 21 #if defined I2C0
Kovalev_D 22:12e6183f04d4 22 void G_Photo_Exchange(void)
Kovalev_D 22:12e6183f04d4 23 {
Kovalev_D 22:12e6183f04d4 24 uint32_t StatValue;
Kovalev_D 22:12e6183f04d4 25 static uint32_t WrIndex;
Kovalev_D 22:12e6183f04d4 26 static int32_t time_out = TIMEOUT;
Kovalev_D 22:12e6183f04d4 27
Kovalev_D 22:12e6183f04d4 28 if (I2CMasterState)
Kovalev_D 22:12e6183f04d4 29 return; //e.transmitting is not active, go away
Kovalev_D 22:12e6183f04d4 30
Kovalev_D 22:12e6183f04d4 31 if (--time_out < 0) //e. valid time period elapsed, go away
Kovalev_D 22:12e6183f04d4 32 {
Kovalev_D 22:12e6183f04d4 33 time_out = TIMEOUT;
Kovalev_D 22:12e6183f04d4 34 I2CMasterState = I2C_IDLE; //e. timer elapsed, go away
Kovalev_D 22:12e6183f04d4 35 LPC_I2C0->CONSET = I2CONSET_STO; //e. Set Stop flag
Kovalev_D 22:12e6183f04d4 36 LPC_I2C0->CONCLR = I2CONCLR_AAC | I2CONCLR_SIC | I2CONCLR_STAC;
Kovalev_D 22:12e6183f04d4 37 return;
Kovalev_D 22:12e6183f04d4 38 }
Kovalev_D 22:12e6183f04d4 39 else if (!(LPC_I2C0->CONSET & I2CONSET_SI)) //e. state of I2C bus has not been changed
Kovalev_D 22:12e6183f04d4 40 return;
Kovalev_D 22:12e6183f04d4 41
Kovalev_D 22:12e6183f04d4 42 StatValue = LPC_I2C0->STAT;
Kovalev_D 22:12e6183f04d4 43
Kovalev_D 22:12e6183f04d4 44 switch ( StatValue )
Kovalev_D 22:12e6183f04d4 45 {
Kovalev_D 22:12e6183f04d4 46 case 0x08: // A Start condition is issued (write data for the first potentiometer)
Kovalev_D 22:12e6183f04d4 47 WrIndex = 0;
Kovalev_D 22:12e6183f04d4 48 time_out = TIMEOUT; //e. enable countdown
Kovalev_D 22:12e6183f04d4 49 LPC_I2C0->DAT = I2CMasterBuffer[WrIndex++]; //e. send address
Kovalev_D 22:12e6183f04d4 50 LPC_I2C0->CONCLR = (I2CONCLR_SIC | I2CONCLR_STAC); //e .clear interrupt bit and start bit
Kovalev_D 22:12e6183f04d4 51 break;
Kovalev_D 22:12e6183f04d4 52
Kovalev_D 22:12e6183f04d4 53 case 0x10: // A repeated started is issued (write data for the second potentiometer)
Kovalev_D 22:12e6183f04d4 54 LPC_I2C0->DAT = I2CMasterBuffer[WrIndex++]; //e. send address
Kovalev_D 22:12e6183f04d4 55 LPC_I2C0->CONCLR = (I2CONCLR_SIC | I2CONCLR_STAC); //e .clear interrupt bit and start bit
Kovalev_D 22:12e6183f04d4 56 break;
Kovalev_D 22:12e6183f04d4 57
Kovalev_D 22:12e6183f04d4 58 case 0x18: //e. Regardless, it's a ACK after slave address reading
Kovalev_D 22:12e6183f04d4 59 LPC_I2C0->DAT = I2CMasterBuffer[WrIndex++]; //e. send another byte
Kovalev_D 22:12e6183f04d4 60 LPC_I2C0->CONCLR = I2CONCLR_SIC; //e. clear interrupt bit
Kovalev_D 22:12e6183f04d4 61 break;
Kovalev_D 22:12e6183f04d4 62
Kovalev_D 22:12e6183f04d4 63 case 0x28: //e. Regardless it's a ACK after data byte
Kovalev_D 22:12e6183f04d4 64 if (WrIndex == I2C_WRITELENGTH) //e. we have transmitted the data for the B potentiometer
Kovalev_D 22:12e6183f04d4 65 {
Kovalev_D 22:12e6183f04d4 66 I2CMasterState = I2C_IDLE;
Kovalev_D 22:12e6183f04d4 67 LPC_I2C0->CONSET = I2CONSET_STO; //e. Set Stop flag
Kovalev_D 22:12e6183f04d4 68 }
Kovalev_D 22:12e6183f04d4 69 else if (WrIndex == 3)
Kovalev_D 22:12e6183f04d4 70 {
Kovalev_D 22:12e6183f04d4 71 LPC_I2C0->CONSET = I2CONSET_STA;
Kovalev_D 22:12e6183f04d4 72 }
Kovalev_D 22:12e6183f04d4 73 else
Kovalev_D 22:12e6183f04d4 74 {
Kovalev_D 22:12e6183f04d4 75 LPC_I2C0->DAT = I2CMasterBuffer[WrIndex++]; //e. send another byte
Kovalev_D 22:12e6183f04d4 76 }
Kovalev_D 22:12e6183f04d4 77 LPC_I2C0->CONCLR = I2CONCLR_SIC; //e. clear interrupt bit
Kovalev_D 22:12e6183f04d4 78 break;
Kovalev_D 22:12e6183f04d4 79
Kovalev_D 22:12e6183f04d4 80 case 0x20: //e. no aknowledgement after address transmitting
Kovalev_D 22:12e6183f04d4 81 case 0x30: //e. no aknowledgement after data block transmitting
Kovalev_D 22:12e6183f04d4 82 LPC_I2C0->CONSET = I2CONSET_STO; //e. Set Stop flag
Kovalev_D 22:12e6183f04d4 83 LPC_I2C0->CONCLR = (I2CONCLR_SIC | I2CONCLR_STAC);
Kovalev_D 22:12e6183f04d4 84 I2CMasterState = I2C_IDLE; //e. fix new state
Kovalev_D 22:12e6183f04d4 85 break;
Kovalev_D 22:12e6183f04d4 86 }
Kovalev_D 22:12e6183f04d4 87 return;
Kovalev_D 22:12e6183f04d4 88 }
Kovalev_D 22:12e6183f04d4 89 #else
Kovalev_D 22:12e6183f04d4 90 void G_Photo_Exchange(void)
Kovalev_D 22:12e6183f04d4 91 {
Kovalev_D 22:12e6183f04d4 92 static uint32_t WrIndex;
Kovalev_D 22:12e6183f04d4 93 uint32_t StatValue;
Kovalev_D 22:12e6183f04d4 94 static int time_out = TIMEOUT;
Kovalev_D 22:12e6183f04d4 95
Kovalev_D 22:12e6183f04d4 96 if (I2CMasterState)
Kovalev_D 22:12e6183f04d4 97 return; //e.transmitting is not active, go away
Kovalev_D 22:12e6183f04d4 98
Kovalev_D 22:12e6183f04d4 99 if (--time_out < 0) //e. valid time period elapsed, go away
Kovalev_D 22:12e6183f04d4 100 {
Kovalev_D 22:12e6183f04d4 101 time_out = TIMEOUT;
Kovalev_D 22:12e6183f04d4 102 I2CMasterState = I2C_TIME_OUT; //e. timer elapsed, go away
Kovalev_D 22:12e6183f04d4 103 LPC_I2C2->CONSET = I2CONSET_STO; //e. Set Stop flag
Kovalev_D 22:12e6183f04d4 104 LPC_I2C2->CONCLR = I2CONCLR_AAC | I2CONCLR_SIC | I2CONCLR_STAC;
Kovalev_D 22:12e6183f04d4 105 return;
Kovalev_D 22:12e6183f04d4 106 }
Kovalev_D 22:12e6183f04d4 107 else if (!(LPC_I2C2->CONSET & I2CONSET_SI)) //e. state of I2C bus has not been changed
Kovalev_D 22:12e6183f04d4 108 return;
Kovalev_D 22:12e6183f04d4 109
Kovalev_D 22:12e6183f04d4 110 StatValue = LPC_I2C2->STAT;
Kovalev_D 22:12e6183f04d4 111
Kovalev_D 22:12e6183f04d4 112 switch ( StatValue )
Kovalev_D 22:12e6183f04d4 113 {
Kovalev_D 22:12e6183f04d4 114 case 0x08: // A Start condition is issued (write data for the first potentiometer)
Kovalev_D 22:12e6183f04d4 115 WrIndex = 0;
Kovalev_D 22:12e6183f04d4 116 time_out = TIMEOUT; //e. enable countdown
Kovalev_D 22:12e6183f04d4 117 LPC_I2C2->DAT = I2CMasterBuffer[WrIndex++]; //e. send address
Kovalev_D 22:12e6183f04d4 118 LPC_I2C2->CONCLR = (I2CONCLR_SIC | I2CONCLR_STAC); //e .clear interrupt bit and start bit
Kovalev_D 22:12e6183f04d4 119 break;
Kovalev_D 22:12e6183f04d4 120
Kovalev_D 22:12e6183f04d4 121 case 0x10: // A repeated started is issued (write data for the second potentiometer)
Kovalev_D 22:12e6183f04d4 122 LPC_I2C2->DAT = I2CMasterBuffer[WrIndex++]; //e. send address
Kovalev_D 22:12e6183f04d4 123 LPC_I2C2->CONCLR = (I2CONCLR_SIC | I2CONCLR_STAC); //e .clear interrupt bit and start bit
Kovalev_D 22:12e6183f04d4 124 break;
Kovalev_D 22:12e6183f04d4 125
Kovalev_D 22:12e6183f04d4 126 case 0x18: //e. Regardless, it's a ACK after slave address reading
Kovalev_D 22:12e6183f04d4 127 LPC_I2C2->DAT = I2CMasterBuffer[WrIndex++]; //e. send another byte
Kovalev_D 22:12e6183f04d4 128 LPC_I2C2->CONCLR = I2CONCLR_SIC; //e. clear interrupt bit
Kovalev_D 22:12e6183f04d4 129 break;
Kovalev_D 22:12e6183f04d4 130
Kovalev_D 22:12e6183f04d4 131 case 0x28: //e. Regardless it's a ACK after data byte
Kovalev_D 22:12e6183f04d4 132 if (WrIndex == I2C_WRITELENGTH) //e. we have transmitted the data for the B potentiometer
Kovalev_D 22:12e6183f04d4 133 {
Kovalev_D 22:12e6183f04d4 134 I2CMasterState = I2C_IDLE; //e. fix new state (release bus)
Kovalev_D 22:12e6183f04d4 135 LPC_I2C2->CONSET = I2CONSET_STO; //e. Set Stop flag
Kovalev_D 22:12e6183f04d4 136 }
Kovalev_D 22:12e6183f04d4 137 else if (WrIndex == 3)
Kovalev_D 22:12e6183f04d4 138 {
Kovalev_D 22:12e6183f04d4 139 LPC_I2C2->CONSET = I2CONSET_STA;
Kovalev_D 22:12e6183f04d4 140 }
Kovalev_D 22:12e6183f04d4 141 else
Kovalev_D 22:12e6183f04d4 142 {
Kovalev_D 22:12e6183f04d4 143 LPC_I2C2->DAT = I2CMasterBuffer[WrIndex++]; //e. send another byte
Kovalev_D 22:12e6183f04d4 144 }
Kovalev_D 22:12e6183f04d4 145 LPC_I2C2->CONCLR = I2CONCLR_SIC; //e. clear interrupt bit
Kovalev_D 22:12e6183f04d4 146 break;
Kovalev_D 22:12e6183f04d4 147
Kovalev_D 22:12e6183f04d4 148 case 0x20: //e. no aknowledgement after address transmitting
Kovalev_D 22:12e6183f04d4 149 case 0x30: //e. no aknowledgement after data block transmitting
Kovalev_D 22:12e6183f04d4 150 LPC_I2C2->CONSET = I2CONSET_STO; //e. Set Stop flag
Kovalev_D 22:12e6183f04d4 151 LPC_I2C2->CONCLR = (I2CONCLR_SIC | I2CONCLR_STAC);
Kovalev_D 22:12e6183f04d4 152 I2CMasterState = I2C_IDLE; //e. fix new state (release)
Kovalev_D 22:12e6183f04d4 153 break;
Kovalev_D 22:12e6183f04d4 154 }
Kovalev_D 22:12e6183f04d4 155 return;
Kovalev_D 22:12e6183f04d4 156 }
Kovalev_D 22:12e6183f04d4 157 #endif
Kovalev_D 22:12e6183f04d4 158 /******************************************************************************
Kovalev_D 22:12e6183f04d4 159 ** Function name: DAC_Out_ADC_Input
Kovalev_D 22:12e6183f04d4 160 **
Kovalev_D 22:12e6183f04d4 161 ** Descriptions: Loading data to DACs and initialization of ADC reading
Kovalev_D 22:12e6183f04d4 162 **
Kovalev_D 22:12e6183f04d4 163 ** parameters: None
Kovalev_D 22:12e6183f04d4 164 ** Returned value: None
Kovalev_D 22:12e6183f04d4 165 **
Kovalev_D 22:12e6183f04d4 166 ******************************************************************************/
Kovalev_D 22:12e6183f04d4 167 void DAC_Out_ADC_Input()
Kovalev_D 22:12e6183f04d4 168 {
Kovalev_D 22:12e6183f04d4 169 int i, Dummy = Dummy;
Kovalev_D 22:12e6183f04d4 170
Kovalev_D 22:12e6183f04d4 171 //-------------------------loading data from ADC to buffer---------------------------------------
Kovalev_D 22:12e6183f04d4 172 i = BYTES_FOR_ADCs;
Kovalev_D 22:12e6183f04d4 173 ExchangeErr &= ~ADC_ERR_MSK; //reset ADC bit of error register;
Kovalev_D 22:12e6183f04d4 174
Kovalev_D 22:12e6183f04d4 175 if (LPC_SSP0->SR & SSP_BUSY) //if exchanging is activing, error
Kovalev_D 22:12e6183f04d4 176 {
Kovalev_D 22:12e6183f04d4 177 ExchangeErr |= ADC_ERR_MSK; //reset DAC bit of error register;
Kovalev_D 22:12e6183f04d4 178 }
Kovalev_D 22:12e6183f04d4 179 else
Kovalev_D 22:12e6183f04d4 180
Kovalev_D 22:12e6183f04d4 181 while ((i-- > 0) && (LPC_SSP0->SR & TX_SSP_notFULL)) //receiving has finished, initiate a new one
Kovalev_D 22:12e6183f04d4 182 LPC_SSP0->DR = 0xFF;
Kovalev_D 22:12e6183f04d4 183 /*
Kovalev_D 22:12e6183f04d4 184 { LPC_SSP0->DR = 0x80;
Kovalev_D 22:12e6183f04d4 185 LPC_SSP0->DR = 0x01;
Kovalev_D 22:12e6183f04d4 186 LPC_SSP0->DR = 0xC0;
Kovalev_D 22:12e6183f04d4 187 LPC_SSP0->DR = 0x03;
Kovalev_D 22:12e6183f04d4 188 LPC_SSP0->DR = 0xE0;
Kovalev_D 22:12e6183f04d4 189 LPC_SSP0->DR = 0x07;
Kovalev_D 22:12e6183f04d4 190 LPC_SSP0->DR = 0xF0;
Kovalev_D 22:12e6183f04d4 191 LPC_SSP0->DR = 0x0F; }*/
Kovalev_D 22:12e6183f04d4 192 // ------------------------loading data to DACs--------------------------------------------------
Kovalev_D 22:12e6183f04d4 193 ExchangeErr &= ~DAC_ERR_MSK; //reset DAC bit of error register;
Kovalev_D 22:12e6183f04d4 194 i= BYTEs_FOR_DACs >> 1;
Kovalev_D 22:12e6183f04d4 195 if (LPC_SSP1->SR & SSP_BUSY) //if exchanging is activing, error
Kovalev_D 22:12e6183f04d4 196 {
Kovalev_D 22:12e6183f04d4 197 ExchangeErr |= DAC_ERR_MSK;
Kovalev_D 22:12e6183f04d4 198 }
Kovalev_D 22:12e6183f04d4 199 else
Kovalev_D 22:12e6183f04d4 200 while ((i-->0) && (LPC_SSP1->SR & TX_SSP_notFULL)) //load new data to DAC
Kovalev_D 22:12e6183f04d4 201 {
Kovalev_D 22:12e6183f04d4 202 LPC_SSP1->DR = (Output.ArrayOut[i]>>8)& 0xFF;
Kovalev_D 22:12e6183f04d4 203 if (LPC_SSP1->SR & TX_SSP_notFULL)
Kovalev_D 22:12e6183f04d4 204 LPC_SSP1->DR = Output.ArrayOut[i] & 0xFF;
Kovalev_D 22:12e6183f04d4 205 }
Kovalev_D 22:12e6183f04d4 206
Kovalev_D 22:12e6183f04d4 207 /* { LPC_SSP1->DR = 0x80;
Kovalev_D 22:12e6183f04d4 208 LPC_SSP1->DR = 0x01;
Kovalev_D 22:12e6183f04d4 209 LPC_SSP1->DR = 0xC0;
Kovalev_D 22:12e6183f04d4 210 LPC_SSP1->DR = 0x03;
Kovalev_D 22:12e6183f04d4 211 LPC_SSP1->DR = 0xE0;
Kovalev_D 22:12e6183f04d4 212 LPC_SSP1->DR = 0x07;
Kovalev_D 22:12e6183f04d4 213 LPC_SSP1->DR = 0xF0;
Kovalev_D 22:12e6183f04d4 214 LPC_SSP1->DR = 0x0F; } */
Kovalev_D 22:12e6183f04d4 215
Kovalev_D 22:12e6183f04d4 216 if (i != 0xFFFFFFFF)
Kovalev_D 22:12e6183f04d4 217 {
Kovalev_D 22:12e6183f04d4 218 ExchangeErr |= DAC_ERR_MSK;
Kovalev_D 22:12e6183f04d4 219 }
Kovalev_D 22:12e6183f04d4 220 }
Kovalev_D 22:12e6183f04d4 221 /******************************************************************************
Kovalev_D 22:12e6183f04d4 222 ** Function name: ADC_Out_DAC_Input
Kovalev_D 22:12e6183f04d4 223 **
Kovalev_D 22:12e6183f04d4 224 ** Descriptions: Reading data from ADC and initialization of DAC writing
Kovalev_D 22:12e6183f04d4 225 **
Kovalev_D 22:12e6183f04d4 226 ** parameters: None
Kovalev_D 22:12e6183f04d4 227 ** Returned value: None
Kovalev_D 22:12e6183f04d4 228 **
Kovalev_D 22:12e6183f04d4 229 ******************************************************************************/
Kovalev_D 22:12e6183f04d4 230 void ADC_Out_DAC_Input()
Kovalev_D 22:12e6183f04d4 231 {
Kovalev_D 22:12e6183f04d4 232 int i = 0, Dummy;
Kovalev_D 22:12e6183f04d4 233 static int timeDither = 0;
Kovalev_D 22:12e6183f04d4 234 Dummy = Dummy;
Kovalev_D 22:12e6183f04d4 235
Kovalev_D 22:12e6183f04d4 236 //++++++++++++++++++++++++++ Dither_simulation ++++++++++++++++++++++++++++++++++++++++++++++++
Kovalev_D 22:12e6183f04d4 237
Kovalev_D 22:12e6183f04d4 238 if (++timeDither>(LPC_MCPWM->LIM0/50))
Kovalev_D 22:12e6183f04d4 239 {
Kovalev_D 22:12e6183f04d4 240 LPC_MCPWM->INTF_SET |= 1;
Kovalev_D 22:12e6183f04d4 241 timeDither = 0;
Kovalev_D 22:12e6183f04d4 242 }
Kovalev_D 22:12e6183f04d4 243 //----------------------read receiver buffer of DAC--------------------------------------------
Kovalev_D 22:12e6183f04d4 244 ExchangeErr &= ~DAC_ERR_MSK;
Kovalev_D 22:12e6183f04d4 245
Kovalev_D 22:12e6183f04d4 246 if (LPC_SSP1->SR & SSP_BUSY) //if exchanging is active, error
Kovalev_D 22:12e6183f04d4 247 {
Kovalev_D 22:12e6183f04d4 248 ExchangeErr |= DAC_ERR_MSK;
Kovalev_D 22:12e6183f04d4 249 }
Kovalev_D 22:12e6183f04d4 250 else //exchanging has finished, read buffer
Kovalev_D 22:12e6183f04d4 251 {
Kovalev_D 22:12e6183f04d4 252 while (LPC_SSP1->SR & RX_SSP_notEMPT)
Kovalev_D 22:12e6183f04d4 253 {
Kovalev_D 22:12e6183f04d4 254 Dummy = LPC_SSP1->DR;
Kovalev_D 22:12e6183f04d4 255 i++;
Kovalev_D 22:12e6183f04d4 256 }
Kovalev_D 22:12e6183f04d4 257
Kovalev_D 22:12e6183f04d4 258 if (i != BYTEs_FOR_DACs)
Kovalev_D 22:12e6183f04d4 259 {
Kovalev_D 22:12e6183f04d4 260 ExchangeErr |= DAC_ERR_MSK;
Kovalev_D 22:12e6183f04d4 261 }
Kovalev_D 22:12e6183f04d4 262 }
Kovalev_D 22:12e6183f04d4 263
Kovalev_D 22:12e6183f04d4 264 //---------------------read data from ADC buffer---------------------------------------------
Kovalev_D 22:12e6183f04d4 265 i = BYTES_FOR_ADCs >> 1;
Kovalev_D 22:12e6183f04d4 266 ExchangeErr &= ~ADC_ERR_MSK;
Kovalev_D 22:12e6183f04d4 267
Kovalev_D 22:12e6183f04d4 268 if (LPC_SSP0->SR & SSP_BUSY) //if exchanging is active, error
Kovalev_D 22:12e6183f04d4 269 {
Kovalev_D 22:12e6183f04d4 270 if ((LPC_SSP0->SR & TX_SSP_EMPT)==0)
Kovalev_D 22:12e6183f04d4 271 ExchangeErr |= ADC_ERR_MSK;
Kovalev_D 22:12e6183f04d4 272 }
Kovalev_D 22:12e6183f04d4 273 else //exchanging has finished, read buffer
Kovalev_D 22:12e6183f04d4 274 {
Kovalev_D 22:12e6183f04d4 275 while ((i-- > 0)&& (LPC_SSP0->SR & RX_SSP_notEMPT) ) //read buffer while data present
Kovalev_D 22:12e6183f04d4 276 {
Kovalev_D 22:12e6183f04d4 277 Input.ArrayIn[i] = ((LPC_SSP0->DR & 0xFF) << 8);
Kovalev_D 22:12e6183f04d4 278 if (LPC_SSP0->SR & RX_SSP_notEMPT)
Kovalev_D 22:12e6183f04d4 279 Input.ArrayIn[i] |= (LPC_SSP0->DR & 0xFF);
Kovalev_D 22:12e6183f04d4 280 else
Kovalev_D 22:12e6183f04d4 281 break;
Kovalev_D 22:12e6183f04d4 282 }
Kovalev_D 22:12e6183f04d4 283 if (i != 0xFFFFFFFF)
Kovalev_D 22:12e6183f04d4 284 ExchangeErr |= ADC_ERR_MSK;
Kovalev_D 22:12e6183f04d4 285 }
Kovalev_D 22:12e6183f04d4 286 }
Kovalev_D 22:12e6183f04d4 287 /******************************************************************************
Kovalev_D 22:12e6183f04d4 288 ** Function name: G_Photo_Init
Kovalev_D 22:12e6183f04d4 289 **
Kovalev_D 22:12e6183f04d4 290 ** Descriptions: Initialization of exchange with digital potentiometers
Kovalev_D 22:12e6183f04d4 291 **
Kovalev_D 22:12e6183f04d4 292 ** parameters: None
Kovalev_D 22:12e6183f04d4 293 ** Returned value: None
Kovalev_D 22:12e6183f04d4 294 **
Kovalev_D 22:12e6183f04d4 295 ******************************************************************************/
Kovalev_D 22:12e6183f04d4 296 #if !defined I2C0
Kovalev_D 22:12e6183f04d4 297 void G_Photo_Init( void )
Kovalev_D 22:12e6183f04d4 298 {
Kovalev_D 22:12e6183f04d4 299 LPC_SC->PCONP |= (1 << 26); //e. enable I2C interface
Kovalev_D 22:12e6183f04d4 300 //e. by default sync frequency is CCLK/4 (see PCLKSEL1[21:20])
Kovalev_D 22:12e6183f04d4 301
Kovalev_D 22:12e6183f04d4 302 //e. set P0.10 and P0.11 to I2C2 SDA and SCL
Kovalev_D 22:12e6183f04d4 303 LPC_PINCON->PINSEL0 &= ~((0x03<<20)|(0x03<<22)); //e. clear
Kovalev_D 22:12e6183f04d4 304 LPC_PINCON->PINSEL0 |= ((0x02<<20)|(0x02<<22)); //e. set SDA2, SCL2
Kovalev_D 22:12e6183f04d4 305 LPC_PINCON->PINMODE0 &= ~((0x03<<20)|(0x03<<22)); //e. clear
Kovalev_D 22:12e6183f04d4 306 LPC_PINCON->PINMODE0 |= ((0x02<<20)|(0x2<<22)); //e. No pull-up no pull-down
Kovalev_D 22:12e6183f04d4 307 LPC_PINCON->PINMODE_OD0 |= ((0x01<<10)|(0x1<<11));//e. switch SDA2, SCL2 to open drain mode
Kovalev_D 22:12e6183f04d4 308
Kovalev_D 22:12e6183f04d4 309 //--- Clear flags ---
Kovalev_D 22:12e6183f04d4 310 LPC_I2C2->CONCLR = I2CONCLR_AAC | I2CONCLR_SIC | I2CONCLR_STAC | I2CONCLR_I2ENC;
Kovalev_D 22:12e6183f04d4 311
Kovalev_D 22:12e6183f04d4 312 //--- Set registers for transmition rate = PCLK/(I2SCLL_SCLL+I2SCLH_SCLH)---
Kovalev_D 22:12e6183f04d4 313 LPC_I2C2->SCLL = I2SCLL_SCLL;
Kovalev_D 22:12e6183f04d4 314 LPC_I2C2->SCLH = I2SCLH_SCLH;
Kovalev_D 22:12e6183f04d4 315
Kovalev_D 22:12e6183f04d4 316 I2CMasterBuffer[0] = A_ADDRESS;
Kovalev_D 22:12e6183f04d4 317 I2CMasterBuffer[1] = WRITE_CMD;
Kovalev_D 22:12e6183f04d4 318 I2CMasterBuffer[3] = B_ADDRESS;
Kovalev_D 22:12e6183f04d4 319 I2CMasterBuffer[4] = WRITE_CMD;
Kovalev_D 22:12e6183f04d4 320
Kovalev_D 22:12e6183f04d4 321 LPC_I2C2->CONSET = I2CONSET_I2EN;
Kovalev_D 22:12e6183f04d4 322 return;
Kovalev_D 22:12e6183f04d4 323 }
Kovalev_D 22:12e6183f04d4 324 #else
Kovalev_D 22:12e6183f04d4 325 void G_Photo_Init(void )
Kovalev_D 22:12e6183f04d4 326 {
Kovalev_D 22:12e6183f04d4 327 LPC_SC->PCONP |= (1 << 19);
Kovalev_D 22:12e6183f04d4 328
Kovalev_D 22:12e6183f04d4 329 /* set PIO0.27 and PIO0.28 to I2C0 SDA and SCK */
Kovalev_D 22:12e6183f04d4 330 /* function to 01 on both SDA and SCK. */
Kovalev_D 22:12e6183f04d4 331 LPC_PINCON->PINSEL1 &= ~0x03C00000;
Kovalev_D 22:12e6183f04d4 332 LPC_PINCON->PINSEL1 |= 0x01400000;
Kovalev_D 22:12e6183f04d4 333
Kovalev_D 22:12e6183f04d4 334 /*--- Clear flags ---*/
Kovalev_D 22:12e6183f04d4 335 LPC_I2C0->CONCLR = I2CONCLR_AAC | I2CONCLR_SIC | I2CONCLR_STAC | I2CONCLR_I2ENC;
Kovalev_D 22:12e6183f04d4 336
Kovalev_D 22:12e6183f04d4 337 /*--- Reset registers ---*/
Kovalev_D 22:12e6183f04d4 338 LPC_I2C0->SCLL = I2SCLL_SCLL;
Kovalev_D 22:12e6183f04d4 339 LPC_I2C0->SCLH = I2SCLH_SCLH;
Kovalev_D 22:12e6183f04d4 340
Kovalev_D 22:12e6183f04d4 341 I2CMasterBuffer[0] = A_ADDRESS;
Kovalev_D 22:12e6183f04d4 342 I2CMasterBuffer[1] = WRITE_CMD;
Kovalev_D 22:12e6183f04d4 343 I2CMasterBuffer[3] = B_ADDRESS;
Kovalev_D 22:12e6183f04d4 344 I2CMasterBuffer[4] = WRITE_CMD;
Kovalev_D 22:12e6183f04d4 345
Kovalev_D 22:12e6183f04d4 346 LPC_I2C0->CONSET = I2CONSET_I2EN;
Kovalev_D 22:12e6183f04d4 347
Kovalev_D 22:12e6183f04d4 348 }
Kovalev_D 22:12e6183f04d4 349 #endif
Kovalev_D 22:12e6183f04d4 350 /******************************************************************************
Kovalev_D 22:12e6183f04d4 351 ** Function name: DAC_ADC_Exchange_Init
Kovalev_D 22:12e6183f04d4 352 **
Kovalev_D 22:12e6183f04d4 353 ** Descriptions: Initialization of data exchange with DACs and ADCs
Kovalev_D 22:12e6183f04d4 354 **
Kovalev_D 22:12e6183f04d4 355 ** parameters: None
Kovalev_D 22:12e6183f04d4 356 ** Returned value: None
Kovalev_D 22:12e6183f04d4 357 **
Kovalev_D 22:12e6183f04d4 358 ******************************************************************************/
Kovalev_D 22:12e6183f04d4 359 void DAC_ADC_Exchange_Init()
Kovalev_D 22:12e6183f04d4 360 {
Kovalev_D 22:12e6183f04d4 361 int Dummy;
Kovalev_D 22:12e6183f04d4 362
Kovalev_D 22:12e6183f04d4 363 Dummy = Dummy;
Kovalev_D 22:12e6183f04d4 364
Kovalev_D 22:12e6183f04d4 365 /* Enable AHB clock to the SSP0, SSP1 */
Kovalev_D 22:12e6183f04d4 366 // LPC_SC->PCONP |= (0x1<<21);
Kovalev_D 22:12e6183f04d4 367 // LPC_SC->PCONP |= (0x1<<10);
Kovalev_D 22:12e6183f04d4 368
Kovalev_D 22:12e6183f04d4 369 /* Further divider is needed on SSP0,SSP1 clock. Using default divided by 4 */
Kovalev_D 22:12e6183f04d4 370 LPC_SC->PCLKSEL1 &= ~(0x3<<10);
Kovalev_D 22:12e6183f04d4 371 LPC_SC->PCLKSEL0 &= ~(0x3<<20);
Kovalev_D 22:12e6183f04d4 372
Kovalev_D 22:12e6183f04d4 373 /* P0.15~0.18 as SSP0 */
Kovalev_D 22:12e6183f04d4 374 LPC_PINCON->PINSEL0 &= ~(0x3UL<<30);
Kovalev_D 22:12e6183f04d4 375 LPC_PINCON->PINSEL0 |= (0x2UL<<30);
Kovalev_D 22:12e6183f04d4 376 LPC_PINCON->PINSEL1 &= ~((0x3<<0)|(0x3<<2)|(0x3<<4));
Kovalev_D 22:12e6183f04d4 377 LPC_PINCON->PINSEL1 |= ((0x2<<0)|(0x2<<2)|(0x2<<4));
Kovalev_D 22:12e6183f04d4 378
Kovalev_D 22:12e6183f04d4 379 LPC_PINCON->PINMODE0 &= ~(0x3UL<<30);
Kovalev_D 22:12e6183f04d4 380 LPC_PINCON->PINMODE0 |= (0x3UL<<30);
Kovalev_D 22:12e6183f04d4 381 LPC_PINCON->PINMODE1 &= ~((0x3<<2)|(0x3<<4));
Kovalev_D 22:12e6183f04d4 382 LPC_PINCON->PINMODE1 |= ((0x3<<2)|(0x3<<4));
Kovalev_D 22:12e6183f04d4 383
Kovalev_D 22:12e6183f04d4 384 /* P0.6~0.9 as SSP1 */
Kovalev_D 22:12e6183f04d4 385 LPC_PINCON->PINSEL0 &= ~((0x3<<12)|(0x3<<14)|(0x3<<16)|(0x3<<18));
Kovalev_D 22:12e6183f04d4 386 LPC_PINCON->PINSEL0 |= ((0x2<<12)|(0x2<<14)|(0x2<<16)|(0x2<<18));
Kovalev_D 22:12e6183f04d4 387 LPC_PINCON->PINMODE0 &= ~((0x3<<16)|(0x3<<12)|(0x3<<14)|(0x3<<18));
Kovalev_D 22:12e6183f04d4 388 LPC_PINCON->PINMODE0 |= ((0x3<<16)|(0x3<<14)|(0x3<<18));
Kovalev_D 22:12e6183f04d4 389
Kovalev_D 22:12e6183f04d4 390 /* Set DSS data to 8-bit, Frame format SPI, CPOL = 0, CPHA = 0, and SCR is 2*/
Kovalev_D 22:12e6183f04d4 391 LPC_SSP0->CR0 = 0x0207;
Kovalev_D 22:12e6183f04d4 392 LPC_SSP1->CR0 = 0x0207;
Kovalev_D 22:12e6183f04d4 393
Kovalev_D 22:12e6183f04d4 394 /* SSPCPSR clock prescale register, master mode, minimum divisor is 0x02 */
Kovalev_D 22:12e6183f04d4 395 LPC_SSP0->CPSR = 0x2;
Kovalev_D 22:12e6183f04d4 396 LPC_SSP1->CPSR = 0x2; //so, SSPfreq = PCLK/(2*(2+1)) = 4.13 MHz
Kovalev_D 22:12e6183f04d4 397
Kovalev_D 22:12e6183f04d4 398 LPC_SSP0->CR1 = SSPCR1_SSE;
Kovalev_D 22:12e6183f04d4 399 LPC_SSP1->CR1 = SSPCR1_SSE;
Kovalev_D 22:12e6183f04d4 400
Kovalev_D 22:12e6183f04d4 401 while (LPC_SSP0->SR & SSP_BUSY);
Kovalev_D 22:12e6183f04d4 402 while (LPC_SSP1->SR & SSP_BUSY);
Kovalev_D 22:12e6183f04d4 403
Kovalev_D 22:12e6183f04d4 404 while (LPC_SSP0->SR & RX_SSP_notEMPT) /* clear the RxFIFO */
Kovalev_D 22:12e6183f04d4 405 Dummy = LPC_SSP0->DR;
Kovalev_D 22:12e6183f04d4 406
Kovalev_D 22:12e6183f04d4 407 while (LPC_SSP1->SR & RX_SSP_notEMPT)
Kovalev_D 22:12e6183f04d4 408 Dummy = LPC_SSP1->DR; /* clear the RxFIFO */
Kovalev_D 22:12e6183f04d4 409 }
Kovalev_D 22:12e6183f04d4 410 /******************************************************************************
Kovalev_D 22:12e6183f04d4 411 ** Function name: Out_G_photo
Kovalev_D 22:12e6183f04d4 412 **
Kovalev_D 22:12e6183f04d4 413 ** Descriptions: Start of potentiometer data writing process
Kovalev_D 22:12e6183f04d4 414 **
Kovalev_D 22:12e6183f04d4 415 ** parameters: pointer to gain factors
Kovalev_D 22:12e6183f04d4 416 ** Returned value: None
Kovalev_D 22:12e6183f04d4 417 **
Kovalev_D 22:12e6183f04d4 418 ******************************************************************************/
Kovalev_D 22:12e6183f04d4 419 void Out_G_photo(uint32_t Ph_A, uint32_t Ph_B)
Kovalev_D 22:12e6183f04d4 420 {
Kovalev_D 22:12e6183f04d4 421 I2CMasterBuffer[2] = Ph_A;
Kovalev_D 22:12e6183f04d4 422 I2CMasterBuffer[5] = Ph_B;
Kovalev_D 22:12e6183f04d4 423 #if defined I2C0
Kovalev_D 22:12e6183f04d4 424 LPC_I2C0->CONSET = I2CONSET_STA; // Set Start flag
Kovalev_D 22:12e6183f04d4 425 #else
Kovalev_D 22:12e6183f04d4 426 LPC_I2C2->CONSET = I2CONSET_STA; // Set Start flag
Kovalev_D 22:12e6183f04d4 427 #endif
Kovalev_D 22:12e6183f04d4 428 I2CMasterState = I2C_BUSY;
Kovalev_D 22:12e6183f04d4 429 }