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 LG by
DeviceI2C.c
- Committer:
 - Diletant
 - Date:
 - 2016-05-15
 - Revision:
 - 161:efd949e8d536
 - Parent:
 - 156:e68ee0bcdcda
 - Child:
 - 167:bedc0a9d559a
 
File content as of revision 161:efd949e8d536:
#include "Device.h"
//I2C Control Set Register
#define I2CONSET_I2EN  0x0000040
#define I2CONSET_AA    0x0000004
#define I2CONSET_SI    0x0000008
#define I2CONSET_STO   0x0000010
#define I2CONSET_STA   0x0000020
//I2C Control clear Register
#define I2CONCLR_AAC   0x0000004
#define I2CONCLR_SIC   0x0000008
#define I2CONCLR_STAC  0x0000020
#define I2CONCLR_I2ENC 0x0000040
//I2C SCL Duty Cycle High Reg
#define I2SCLH_SCLH    0x00000080 //High
#define I2SCLL_SCLL    0x00000080 //Low
//Address
#define I2C_A_ADDRESS  0x0000005E //address of slave potentiometer A (table 6-2 of pot's manual)
#define I2C_B_ADDRESS  0x0000005C //address of slave potentiometer B (table 6-2 of pot's manual)
#define I2C_WRITE_CMD  0x00000000 //address of wiper0 register in memory map
//Timeout
#define I2C_TIMEOUT    1000
extern Device device;
//
//Warning!!!
//  Different LPC17xx.h versions declare different I2C registers names:
//    LPC_I2C0->CONCLR (Keil?)/ LPC_I2C0->I2CONCLR (mbed)
//    ...
//
void InitI2CWithDefaults(void){
  device.controller.I2C.settings.trigger = 1000;
}
void InitI2C(void) {
  device.controller.I2C.state.CON0 = 0;
  device.controller.I2C.state.buffer[0] = I2C_A_ADDRESS;
  device.controller.I2C.state.buffer[1] = I2C_WRITE_CMD;
  device.controller.I2C.state.buffer[2] = device.isacs.potentiometers.settings.a;
  device.controller.I2C.state.buffer[3] = I2C_B_ADDRESS;
  device.controller.I2C.state.buffer[4] = I2C_WRITE_CMD;
  device.controller.I2C.state.buffer[5] = device.isacs.potentiometers.settings.b;
  device.controller.I2C.state.position = 0;
  device.controller.I2C.state.counter = 0;
  device.controller.I2C.state.trigger = device.controller.I2C.settings.trigger;
  
  LPC_SC->PCONP |= (1 << 7);//I2C0 on
  //LPC_SC->PCONP |= (1 << 19);//I2C1 on
  // set PIO0.27 and PIO0.28 to I2C0 SDA and SCK
  // function to 01 on both SDA and SCK
  LPC_PINCON->PINSEL1 &= ~0x03C00000; //P0.27 - SDA
  LPC_PINCON->PINSEL1 |= 0x01400000;  //P0.28 - SCK
  
  LPC_I2C0->CONCLR = I2CONCLR_AAC | I2CONCLR_SIC | I2CONCLR_STAC | I2CONCLR_I2ENC; //Master mode
  //LPC_I2C0->I2CONCLR = I2CONCLR_AAC | I2CONCLR_SIC | I2CONCLR_STAC | I2CONCLR_I2ENC; //Master mode
  LPC_I2C0->SCLL   = I2SCLL_SCLL; // - счетчик scl low time period
  //LPC_I2C0->I2SCLL   = I2SCLL_SCLL; // - счетчик scl low time period
  LPC_I2C0->SCLH   = I2SCLH_SCLH; // - счетчик scl high time period
  //LPC_I2C0->I2SCLH   = I2SCLH_SCLH; // - счетчик scl high time period
  
  LPC_I2C0->CONSET = I2CONSET_I2EN; //включение интерфейса I2C
  //LPC_I2C0->I2CONSET = I2CONSET_I2EN; //включение интерфейса I2C
  
  device.controller.I2C.state.CON0 = LPC_I2C0->CONSET & (~LPC_I2C0->CONCLR);
  //device.controller.I2C.state.CON0 = LPC_I2C0->I2CONSET & (~LPC_I2C0->I2CONCLR);
}
void DeviceI2CTransmit(void) {
  if (!device.controller.I2C.state.enabled) return;                   //Transmission disabled, go away
  device.controller.I2C.state.counter++;
  if (device.controller.I2C.state.counter > device.controller.I2C.state.trigger){//Time out, go away
    device.controller.I2C.state.counter = 0;
    device.controller.I2C.state.enabled = 0;
    LPC_I2C0->CONSET = I2CONSET_STO;                     //Set Stop flag
    //LPC_I2C0->I2CONSET = I2CONSET_STO;                     //Set Stop flag
    LPC_I2C0->CONCLR = I2CONCLR_AAC | I2CONCLR_SIC | I2CONCLR_STAC;
    //LPC_I2C0->I2CONCLR = I2CONCLR_AAC | I2CONCLR_SIC | I2CONCLR_STAC;
    return;
  }
  
  if (!(LPC_I2C0->CONSET & I2CONSET_SI)) return;         //State of I2C bus has not been changed
  //if (!(LPC_I2C0->I2CONSET & I2CONSET_SI)) return;         //State of I2C bus has not been changed
  uint32_t StatValue = LPC_I2C0->STAT;
  //uint32_t StatValue = LPC_I2C0->I2STAT;
  switch ( StatValue ) {
    //Start condition issued (write data for the first potentiometer) 
    case 0x08:
      device.controller.I2C.state.position = 0;                       //Init buffer position
      device.controller.I2C.state.counter = 0;                 //Init countdown
      LPC_I2C0->DAT = device.controller.I2C.state.buffer[device.controller.I2C.state.position++];  //Send address
      //LPC_I2C0->I2DAT = device.controller.I2C.state.buffer[device.controller.I2C.state.position++];  //Send address
      LPC_I2C0->CONCLR = (I2CONCLR_SIC | I2CONCLR_STAC); //Clear interrupt bit and start bit
      //LPC_I2C0->I2CONCLR = (I2CONCLR_SIC | I2CONCLR_STAC); //Clear interrupt bit and start bit
    break;
    
    //Repeated started is issued (write data for the second potentiometer) 
    case 0x10:
      LPC_I2C0->DAT = device.controller.I2C.state.buffer[device.controller.I2C.state.position++];  //Send address
      //LPC_I2C0->I2DAT = device.controller.I2C.state.buffer[device.controller.I2C.state.position++];  //Send address
      LPC_I2C0->CONCLR = (I2CONCLR_SIC | I2CONCLR_STAC); //Clear interrupt bit and start bit
      //LPC_I2C0->I2CONCLR = (I2CONCLR_SIC | I2CONCLR_STAC); //Clear interrupt bit and start bit
    break;
    //ACK after slave address reading
    case 0x18:
      LPC_I2C0->DAT = device.controller.I2C.state.buffer[device.controller.I2C.state.position++];  //Send another byte
      //LPC_I2C0->I2DAT = device.controller.I2C.state.buffer[device.controller.I2C.state.position++];  //Send another byte
      LPC_I2C0->CONCLR = I2CONCLR_SIC;                   //Clear interrupt bit
      //LPC_I2C0->I2CONCLR = I2CONCLR_SIC;                   //Clear interrupt bit
    break;
    //ACK after data byte
    case 0x28:
      if  (device.controller.I2C.state.position == I2C_BUFFER_LENGTH) {                   //Data transmission finished
        device.controller.I2C.state.enabled = 0;
        LPC_I2C0->CONSET = I2CONSET_STO;                 //Set Stop flag
        //LPC_I2C0->I2CONSET = I2CONSET_STO;                 //Set Stop flag
       //Output.Str.Cnt_Dif = 300;
      } else if (device.controller.I2C.state.position == 3) {
       LPC_I2C0->CONSET = I2CONSET_STA;
       //LPC_I2C0->I2CONSET = I2CONSET_STA;
       //Output.Str.Cnt_Dif = 200;
      } else {
        LPC_I2C0->DAT = device.controller.I2C.state.buffer[device.controller.I2C.state.position++];//Send another byte   
        //LPC_I2C0->I2DAT = device.controller.I2C.state.buffer[device.controller.I2C.state.position++];//Send another byte   
        //Output.Str.Cnt_Dif = 100;
      }
      LPC_I2C0->CONCLR = I2CONCLR_SIC;                   //Clear interrupt bit
      //LPC_I2C0->I2CONCLR = I2CONCLR_SIC;                   //Clear interrupt bit
    break;
    //No acknoledgement after address transmitting
    case 0x20:
    //No acknoledgement after data block transmitting
    case 0x30:
      LPC_I2C0->CONSET = I2CONSET_STO;                   //Set Stop flag
      //LPC_I2C0->I2CONSET = I2CONSET_STO;                   //Set Stop flag
      LPC_I2C0->CONCLR = (I2CONCLR_SIC | I2CONCLR_STAC);
      //LPC_I2C0->I2CONCLR = (I2CONCLR_SIC | I2CONCLR_STAC);
      device.controller.I2C.state.enabled = 0;                        //Disable transmission
    break;
  }
}
void StartI2CTransmission(void){
  device.controller.I2C.state.position = 0;
  device.controller.I2C.state.counter = I2C_TIMEOUT;
  LPC_I2C0->CONSET = I2CONSET_STA; //Set start flag
  //LPC_I2C0->I2CONSET = I2CONSET_STA; //Set start flag
  device.controller.I2C.state.enabled = 1;      //Enable transmission
}
            
    