![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
n
Fork of LG by
Embed:
(wiki syntax)
Show/hide line numbers
InputOutput.c
00001 #include "Global.h" 00002 INPUT Input; 00003 OUTPUT Output; 00004 00005 volatile uint32_t I2CMasterState = I2C_IDLE; 00006 volatile uint32_t I2CMasterBuffer[I2C_WRITELENGTH]; 00007 00008 int ExchangeErr = 0; 00009 //----------------------temp--------------------- 00010 extern char test; 00011 /****************************************************************************** 00012 ** Function name: G_Photo_Exchange 00013 ** 00014 ** Descriptions: Driver for I2C exchange 00015 ** 00016 ** parameters: None 00017 ** Returned value: None 00018 ** 00019 ******************************************************************************/ 00020 00021 void G_Photo_Exchange(void) 00022 { 00023 uint32_t StatValue; 00024 static uint32_t WrIndex; 00025 static int32_t time_out = TIMEOUT; 00026 00027 if (I2CMasterState) 00028 return; //e.transmitting is not active, go away 00029 00030 if (--time_out < 0) //e. valid time period elapsed, go away 00031 { 00032 time_out = TIMEOUT; 00033 I2CMasterState = I2C_IDLE; //e. timer elapsed, go away 00034 LPC_I2C0->CONSET = I2CONSET_STO; //e. Set Stop flag 00035 LPC_I2C0->CONCLR = I2CONCLR_AAC | I2CONCLR_SIC | I2CONCLR_STAC; 00036 return; 00037 } 00038 else if (!(LPC_I2C0->CONSET & I2CONSET_SI)) //e. state of I2C bus has not been changed 00039 return; 00040 00041 StatValue = LPC_I2C0->STAT; 00042 00043 switch ( StatValue ) 00044 { 00045 case 0x08: // A Start condition is issued (write data for the first potentiometer) 00046 WrIndex = 0; 00047 time_out = TIMEOUT; //e. enable countdown 00048 LPC_I2C0->DAT = I2CMasterBuffer[WrIndex++]; //e. send address 00049 LPC_I2C0->CONCLR = (I2CONCLR_SIC | I2CONCLR_STAC); //e .clear interrupt bit and start bit 00050 break; 00051 00052 case 0x10: // A repeated started is issued (write data for the second potentiometer) 00053 LPC_I2C0->DAT = I2CMasterBuffer[WrIndex++]; //e. send address 00054 LPC_I2C0->CONCLR = (I2CONCLR_SIC | I2CONCLR_STAC); //e .clear interrupt bit and start bit 00055 break; 00056 00057 case 0x18: //e. Regardless, it's a ACK after slave address reading 00058 LPC_I2C0->DAT = I2CMasterBuffer[WrIndex++]; //e. send another byte 00059 LPC_I2C0->CONCLR = I2CONCLR_SIC; //e. clear interrupt bit 00060 break; 00061 00062 case 0x28: //e. Regardless it's a ACK after data byte 00063 if (WrIndex == I2C_WRITELENGTH) //e. we have transmitted the data for the B potentiometer 00064 { 00065 I2CMasterState = I2C_IDLE; 00066 LPC_I2C0->CONSET = I2CONSET_STO; //e. Set Stop flag 00067 Output.Str.Cnt_Dif = 300; 00068 } 00069 else if (WrIndex == 3) 00070 { 00071 LPC_I2C0->CONSET = I2CONSET_STA; 00072 Output.Str.Cnt_Dif = 200; 00073 } 00074 else 00075 { 00076 LPC_I2C0->DAT = I2CMasterBuffer[WrIndex++]; //e. send another byte 00077 Output.Str.Cnt_Dif = 100; 00078 } 00079 LPC_I2C0->CONCLR = I2CONCLR_SIC; //e. clear interrupt bit 00080 break; 00081 00082 case 0x20: //e. no aknowledgement after address transmitting 00083 case 0x30: //e. no aknowledgement after data block transmitting 00084 LPC_I2C0->CONSET = I2CONSET_STO; //e. Set Stop flag 00085 LPC_I2C0->CONCLR = (I2CONCLR_SIC | I2CONCLR_STAC); 00086 I2CMasterState = I2C_IDLE; //e. fix new state 00087 break; 00088 } 00089 return; 00090 } 00091 /****************************************************************************** 00092 ** Function name: DAC_ADC_Exchange 00093 ** 00094 ** Descriptions: Loading data to DACs and initialization of ADC reading 00095 ** 00096 ** parameters: None 00097 ** Returned value: None 00098 ** 00099 ******************************************************************************/ 00100 void DAC_ADC_Exchange() 00101 { 00102 //-------------------------loading data from ADC to buffer--------------------------------------- 00103 //int x; 00104 ExchangeErr &= ~ADC_ERR_MSK; //e. сбросить флаг ошибки 00105 if (LPC_SSP0->SR & SSP_BUSY) //e. если буфер передатчика не полон 00106 { 00107 ExchangeErr |= ADC_ERR_MSK; //e. установить флаг ошибки 00108 } 00109 else 00110 { 00111 LPC_SSP0->DR = 0x8001; //записать 0x8001 в регистр передачи. 00112 if (Sys_Clock & 1)//если нечетный такт то 00113 { 00114 LPC_SSP0->DR = WRITE_DAC0; //e.команда для ЦАП_0 передавать. 00115 LPC_SSP0->DR = (-Output.ArrayOut[3]+32767); //e. передача 12 бит 00116 } 00117 else //если такт четный. 00118 { 00119 LPC_SSP0->DR = WRITE_DAC1 ; //e.команда для ЦАП_1 передавать. 00120 LPC_SSP0->DR = (Output.ArrayOut[0]<<1) & 0xFFF0; //e. передача 12 бит 00121 } 00122 } 00123 } 00124 /****************************************************************************** 00125 ** Function name: ADC_Input 00126 ** 00127 ** Descriptions: Reading data from ADC 00128 ** 00129 ** parameters: None 00130 ** Returned value: None 00131 ** 00132 ******************************************************************************/ 00133 void ADC_Input() 00134 { 00135 uint32_t Dummy; 00136 00137 //---------------------read data from ADC buffer--------------------------------------------- 00138 Dummy = Dummy; 00139 ExchangeErr &= ~ADC_ERR_MSK; 00140 00141 if (LPC_SSP0->SR & SSP_BUSY) //если буфер фифо не полный(передача ативна) 00142 { ExchangeErr |= ADC_ERR_MSK; //установить флаг ошибки 00143 00144 if (!(LPC_SSP0->SR & TX_SSP_EMPT)) //буфер передачи не пуст. 00145 ExchangeErr |= ADC_ERR_MSK; //установить флаг ошибки 00146 } 00147 else //обмен закончен прочитать буфер. 00148 { 00149 Input.ArrayIn[0] = LPC_SSP0->DR; //чтениеThermo2 00150 Input.ArrayIn[1] = LPC_SSP0->DR; //чтение Thermo1 00151 Input.ArrayIn[2] = LPC_SSP0->DR; //чтение HF_out 00152 00153 while (LPC_SSP0->SR & RX_SSP_notEMPT) //если буфер SPI не пуст. 00154 Dummy = LPC_SSP0->DR; //очистить буфер. 00155 } 00156 00157 00158 } 00159 /***************************************************************************** 00160 ** Function name: DAC_Output 00161 ** 00162 ** Descriptions: Output data to intrnal DAC 00163 ** 00164 ** parameters: output - code for output 00165 ** Returned value: None 00166 ** 00167 *****************************************************************************/ 00168 void DAC_Output(int output) 00169 { 00170 // LPC_DAC->CR = (output<<6); 00171 return; 00172 } 00173 /****************************************************************************** 00174 ** Function name: G_Photo_Init 00175 ** 00176 ** Descriptions: Initialization of exchange with digital potentiometers 00177 ** 00178 ** parameters: None 00179 ** Returned value: None 00180 ** 00181 ******************************************************************************/ 00182 void G_Photo_Init(void ) 00183 { 00184 LPC_SC->PCONP |= (1 << 19);//включение интерфейса I2C. 00185 00186 /* set PIO0.27 and PIO0.28 to I2C0 SDA and SCK */ 00187 /* function to 01 on both SDA and SCK. */ 00188 LPC_PINCON->PINSEL1 &= ~0x03C00000; //P0.27 - SDA. 00189 LPC_PINCON->PINSEL1 |= 0x01400000; //P0.28 - SCK. 00190 00191 // подтверждение Флаг флаг разрешения 00192 /*сброс флагоф флага прерывания I2C старта интерфейса I2C */ 00193 LPC_I2C0->CONCLR = I2CONCLR_AAC | I2CONCLR_SIC | I2CONCLR_STAC | I2CONCLR_I2ENC; // установка микроконтроллера в режим мастера 00194 00195 /*--- Reset registers ---*/ 00196 LPC_I2C0->SCLL = I2SCLL_SCLL; // - счетчик scl low time period 00197 LPC_I2C0->SCLH = I2SCLH_SCLH; // - счетчик scl high time period 00198 00199 I2CMasterBuffer[0] = A_ADDRESS; //арес потенциометра канала А 00200 I2CMasterBuffer[1] = WRITE_CMD; //Данные 00201 I2CMasterBuffer[3] = B_ADDRESS; //арес потенциометра канала В 00202 I2CMasterBuffer[4] = WRITE_CMD; //Данные 00203 00204 LPC_I2C0->CONSET = I2CONSET_I2EN; //включение интерфейса I2C. 00205 00206 } 00207 /****************************************************************************** 00208 ** Function name: DAC_ADC_Exchange_Init 00209 ** 00210 ** Descriptions: Initialization of data exchange with DACs and ADCs 00211 ** 00212 ** parameters: None 00213 ** Returned value: None 00214 ** 00215 ******************************************************************************/ 00216 void DAC_ADC_Exchange_Init() 00217 { 00218 00219 int Dummy; // инициализация мусорки для очистки буфера приема. 00220 Dummy = Dummy; 00221 00222 /* Enable AHB clock to the SSP0, SSP1 */ 00223 LPC_SC->PCONP |= (0x1<<21); // включение SSP0. 00224 // LPC_SC->PCONP |= (0x1<<10); 00225 00226 /* выбор частоты для переферии используем по умолчания с делителем основной на 4 */ 00227 LPC_SC->PCLKSEL1 &= ~(0x3<<10); //00 CLK/4; 1 CLK; 2 CLK/2; 3 CLK/8 00228 LPC_SC->PCLKSEL1 |= (0x0<<10); //00 CLK/4; 1 CLK; 2 CLK/2; 3 CLK/8 00229 // LPC_SC->PCLKSEL0 &= ~(0x3<<20); 00230 00231 // P0.15~0.18 as SSP0 00232 LPC_PINCON->PINSEL0 &= ~(0x3UL<<30); //установит Р 0.15 00233 LPC_PINCON->PINSEL0 |= (0x2UL<<30); //как (???? SCK 0 ???). частота для синхронизациии Master - slave 00234 00235 LPC_PINCON->PINSEL1 &= ~((0x3<<0)|(0x3<<2)|(0x3<<4)); // устанивоить Р 0.17 и Р 0.18 00236 LPC_PINCON->PINSEL1 |= ((0x2<<2)|(0x2<<4)); // как MISO0 и MOSI0 00237 00238 LPC_PINCON->PINMODE0 &= ~(0x3UL<<30);// ? установление на Р 0.15 режима On-Chip pull-down resistor enabled 00239 LPC_PINCON->PINMODE0 |= (0x3UL<<30);// ? установление на Р 0.15 режима On-Chip pull-down resistor enabled 00240 00241 LPC_PINCON->PINMODE1 &= ~((0x3<<2)|(0x3<<4));// ? установление на Р 0.17 и Р 0.18 режима On-Chip pull-down resistor enabled 00242 LPC_PINCON->PINMODE1 |= ((0x3<<2)|(0x3<<4));// ? установление на Р 0.17 и Р 0.18 режима On-Chip pull-down resistor enabled 00243 00244 /* P0.6~0.9 as SSP1 */ 00245 /* LPC_PINCON->PINSEL0 &= ~((0x3<<12)|(0x3<<14)|(0x3<<16)|(0x3<<18)); 00246 LPC_PINCON->PINSEL0 |= ((0x2<<12)|(0x2<<14)|(0x2<<16)|(0x2<<18)); 00247 LPC_PINCON->PINMODE0 &= ~((0x3<<16)|(0x3<<12)|(0x3<<14)|(0x3<<18)); 00248 LPC_PINCON->PINMODE0 |= ((0x3<<16)|(0x3<<14)|(0x3<<18)); */ 00249 00250 /* Set DSS data to 16-bit, Frame format TI, SCR is 2 */ 00251 LPC_SSP0->CR0 = ((3<<8)|(0<<7)|(0<<4) |0xF); // (0xF)-установление DSS(Data sise select) в 16-битный формат, (3<<8 scr - выбор частоты), 00252 // низкий уровень линии тактирования между кадрами, прикрепление передачи к первому нарастанию тактового мигнала 00253 // формат кадра TI. 00254 // LPC_SSP1->CR0 = 0x0207; 00255 00256 /* SSPCPSR clock prescale register, master mode, minimum divisor is 0x02 */ 00257 LPC_SSP0->CPSR = 0x2; // freq = CLK/(cpsdvr*(scr+1)) = 1.6 MHz 00258 // LPC_SSP1->CPSR = 0x2; 00259 00260 /*SSP enable, master mode */ 00261 LPC_SSP0->CR1 = SSPCR1_SSE; 00262 // LPC_SSP1->CR1 = SSPCR1_SSE; 00263 00264 while (LPC_SSP0->SR & SSP_BUSY); 00265 // while (LPC_SSP1->SR & SSP_BUSY); 00266 00267 while (LPC_SSP0->SR & RX_SSP_notEMPT) /* clear the RxFIFO */ 00268 Dummy = LPC_SSP0->DR; 00269 //all pins after reset is in GPIO mode, so CS pins needn't to configure 00270 LPC_GPIO0->FIODIR |= ADC; // P0.16 defined as CS for ADC 00271 LPC_GPIO0->FIOSET |= ADC; // set CS for ADC 00272 00273 LPC_GPIO0->FIODIR |= DAC; // P defined as CS for DAC 00274 LPC_GPIO0->FIOCLR |= DAC; // set CS for DAC 00275 /* while (LPC_SSP1->SR & RX_SSP_notEMPT) 00276 Dummy = LPC_SSP1->DR;*/ /* clear the RxFIFO */ 00277 } 00278 /***************************************************************************** 00279 ** Function name: DACInit 00280 ** 00281 ** Descriptions: initialize DAC channel 00282 ** 00283 ** parameters: None 00284 ** Returned value: None 00285 ** 00286 *****************************************************************************/ 00287 void DACInit( void ) 00288 { 00289 /* setup the related pin to DAC output */ 00290 LPC_PINCON->PINSEL1 |= 0x00200000; /* установить p0.26 как выход ЦАП */ 00291 // LPC_GPIO0->FIODIR |= (1<<26); 00292 LPC_DAC->CNTVAL = 0; // ккаието параметры 00293 LPC_DAC->CTRL = 0; // для ДМА 00294 return; 00295 } 00296 /****************************************************************************** 00297 ** Function name: Out_G_photo 00298 ** 00299 ** Descriptions: Start of potentiometer data writing process 00300 ** 00301 ** parameters: pointer to gain factors 00302 ** Returned value: None 00303 ** 00304 ******************************************************************************/ 00305 void Out_G_photo(uint32_t Ph_A, uint32_t Ph_B) 00306 { 00307 I2CMasterBuffer[2] = Ph_A;// запись в буфер I2C мастера данных с А канала фото датчика.(уточнить) 00308 I2CMasterBuffer[5] = Ph_B;// запись в буфер I2C мастера данных с В канала фото датчика.(уточнить) 00309 00310 LPC_I2C0->CONSET = I2CONSET_STA; // установить старт флаг. 00311 I2CMasterState = I2C_BUSY; // установить флаг занятой шины. 00312 } 00313
Generated on Tue Jul 12 2022 15:16:11 by
![doxygen](doxygen.png)