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