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
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 00183 /****************************************************************************** 00184 ** Function name: DAC_ADC_Exchange_Init 00185 ** 00186 ** Descriptions: Initialization of data exchange with DACs and ADCs 00187 ** 00188 ** parameters: None 00189 ** Returned value: None 00190 ** 00191 ******************************************************************************/ 00192 00193 /***************************************************************************** 00194 ** Function name: DACInit 00195 ** 00196 ** Descriptions: initialize DAC channel 00197 ** 00198 ** parameters: None 00199 ** Returned value: None 00200 ** 00201 *****************************************************************************/ 00202 void DACInit( void ) 00203 { 00204 /* setup the related pin to DAC output */ 00205 LPC_PINCON->PINSEL1 |= 0x00200000; /* установить p0.26 как выход ЦАП */ 00206 // LPC_GPIO0->FIODIR |= (1<<26); 00207 LPC_DAC->CNTVAL = 0; // ккаието параметры 00208 LPC_DAC->CTRL = 0; // для ДМА 00209 return; 00210 } 00211 /****************************************************************************** 00212 ** Function name: Out_G_photo 00213 ** 00214 ** Descriptions: Start of potentiometer data writing process 00215 ** 00216 ** parameters: pointer to gain factors 00217 ** Returned value: None 00218 ** 00219 ******************************************************************************/ 00220 void Out_G_photo(uint32_t Ph_A, uint32_t Ph_B) 00221 { 00222 I2CMasterBuffer[2] = 255-Ph_A;// запись в буфер I2C мастера данных с А канала фото датчика.(уточнить) 00223 I2CMasterBuffer[5] = 255-Ph_B;// запись в буфер I2C мастера данных с В канала фото датчика.(уточнить) 00224 GyroP.Str.Gain_Sin = Ph_A; 00225 GyroP.Str.Gain_Cos = Ph_B; 00226 LPC_I2C0->CONSET = I2CONSET_STA; // установить старт флаг. 00227 I2CMasterState = I2C_BUSY; // установить флаг занятой шины. 00228 } 00229
Generated on Thu Jul 14 2022 02:34:42 by
1.7.2
