Dmitry Kovalev / Mbed 2 deprecated LGstaandart

Dependencies:   mbed

Fork of LG2 by Dmitry Kovalev

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers InputOutput.c Source File

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