n

Dependencies:   mbed

Fork of LG by igor Apu

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 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