Ejemplo n.º 1
0
static inline void i2c_send_ack(i2c_t *obj)
{
    int delay_value;
    switch ((int)obj->i2c) {
        case I2C_0:
            delay_value = TSC_TSU;
            break;
        case I2C_1:
            delay_value = AAIC_TSU;
            break;
        case I2C_2:
            delay_value = SHIELD_TSU;
            break;
        case I2C_3:
            delay_value = SHIELD_TSU;
            break;
    }

    i2c_delay(delay_value);
    obj->i2c->CONTROLC = SDA;
    i2c_delay(delay_value);
    obj->i2c->CONTROLS = SCL;
    i2c_delay(delay_value);
    obj->i2c->CONTROLC = SCL;
    i2c_delay(delay_value);

}
static unsigned char SCCB_get_byte(void)
{
	volatile signed char i;
	volatile unsigned char j;
	unsigned char get_byte=0;

	SET_SCCB_DATA_INPUT;

	for (i=7;i>=0;i--)
	{	/* data bit 7~0 */
		SET_SCCB_CLK_HIGH;
		//for(j=0;j<I2C_DELAY;j++);
		i2c_delay(I2C_DELAY);
		if (GET_SCCB_DATA_BIT)
			get_byte |= (1<<i);
		//for(j=0;j<I2C_DELAY;j++);
		i2c_delay(I2C_DELAY);
		SET_SCCB_CLK_LOW;
		//for(j=0;j<I2C_DELAY;j++);
		i2c_delay(I2C_DELAY);
	}
	/* don't care bit, 9th bit */
	SET_SCCB_DATA_OUTPUT;
	SET_SCCB_DATA_HIGH;
	//for(j=0;j<I2C_DELAY;j++);
	i2c_delay(I2C_DELAY);
	SET_SCCB_CLK_HIGH;
	//for(j=0;j<I2C_DELAY;j++);
	i2c_delay(I2C_DELAY);
	SET_SCCB_CLK_LOW;

	return get_byte;
}	/* SCCB_send_byte() */
Ejemplo n.º 3
0
Archivo: i2c_gvc.c Proyecto: 7LK/McWRT
/*#---------------------------------------------------------------------------
 *#
 *# FUNCTION NAME: i2c_start
 *#
 *# DESCRIPTION  : generate i2c start condition
 *#
 *# PARAMETERS   : none
 *#
 *# RETURN       : EI2CNOERRORS if OK, EI2CSTRTCOND otherwise
 *#
 *#---------------------------------------------------------------------------
 */
int i2c_start( void )
{
  /* Set SCL=1, SDA=1 */
  i2c_sda_dir_out();
  i2c_set_sda( SDA_HIGH );
  i2c_delay( WAITONEUS );
  i2c_set_scl( SCL_HIGH );
  i2c_delay( WAITONEUS );
  
  /* Set SCL=1, SDA=0 */
  i2c_set_sda( SDA_LOW );
  i2c_delay( THDSTA );
  
  /* Set SCL=0, SDA=0 */
  i2c_set_scl( SCL_LOW );
  /* We can take 1 us less than defined in spec (5 us), since the next action
   * will be to set the dataline high or low and this action is 1 us
   * before the clock is put high, so that makes our 5 us.
   */
  i2c_delay( TLOW - WAITONEUS );
  
  if ( i2c_sda_is_high() || i2c_scl_is_high() )
    {
      printk( KERN_DEBUG "I2C: EI2CSTRTCOND\n" );
      return ( EI2CSTRTCOND );
    }
  
  return ( EI2CNOERRORS );
}   /* i2c_start */
Ejemplo n.º 4
0
static i2c_ack i2c_read_ack(void)
{
    u8 ret;
    clr_i2c_pin(GPIO_I2C_SCL);//clk
    i2c_io_config( GPIO_I2C_SDA, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_16MA, 0);
    i2c_delay(DELAY_UNIT << Dtime);

    set_i2c_pin(GPIO_I2C_SCL);
    i2c_delay(DELAY_UNIT << Dtime);

    if (!gpio_get_value(GPIO_I2C_SDA))//read ack
    {
        ret = ACK;
    }
    else
    {
        ret = NACK;
    }
    clr_i2c_pin(GPIO_I2C_SCL);//clk
    i2c_io_config( GPIO_I2C_SDA, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_UP, GPIO_CFG_8MA, 0);



    return ret;
}
static void SCCB_send_byte(unsigned char send_byte)
{
	volatile signed char i;
	volatile unsigned int j;

	for (i=7;i>=0;i--)
	{	/* data bit 7~0 */
		if (send_byte & (1<<i))
		{
			SET_SCCB_DATA_HIGH;
		}
		else
		{
			SET_SCCB_DATA_LOW;
		}
		i2c_delay(I2C_DELAY);
		SET_SCCB_CLK_HIGH;
		i2c_delay(I2C_DELAY);
		SET_SCCB_CLK_LOW;
		i2c_delay(I2C_DELAY);
	}
	/* don't care bit, 9th bit */
	SET_SCCB_DATA_LOW;
	SET_SCCB_DATA_INPUT;
	SET_SCCB_CLK_HIGH;
	i2c_delay(I2C_DELAY);
	SET_SCCB_CLK_LOW;
	SET_SCCB_DATA_OUTPUT;
}	/* SCCB_send_byte() */
Ejemplo n.º 6
0
void
i2c_outbyte(unsigned char x)
{
	int i;

	i2c_dir_out();

	for (i = 0; i < 8; i++) {
		if (x & 0x80) {
			i2c_data(I2C_DATA_HIGH);
		} else {
			i2c_data(I2C_DATA_LOW);
		}

		i2c_delay(CLOCK_LOW_TIME/2);
		i2c_clk(I2C_CLOCK_HIGH);
		i2c_delay(CLOCK_HIGH_TIME);
		i2c_clk(I2C_CLOCK_LOW);
		i2c_delay(CLOCK_LOW_TIME/2);
		x <<= 1;
	}
	i2c_data(I2C_DATA_LOW);
	i2c_delay(CLOCK_LOW_TIME/2);

	/*
	 * enable input
	 */
	i2c_dir_in();
}
Ejemplo n.º 7
0
/*#---------------------------------------------------------------------------
*#
*# FUNCTION NAME: I2C::sendAck
*#
*# DESCRIPTION  : Send ACK on received data
*#
*#--------------------------------------------------------------------------*/
void
i2c_sendack(void)
{
	/*
	 * enable output
	 */
	i2c_delay(CLOCK_LOW_TIME);
	i2c_dir_out();
	/*
	 * set ack pulse high
	 */
	i2c_data(I2C_DATA_LOW);
	/*
	 * generate clock pulse
	 */
	i2c_delay(CLOCK_HIGH_TIME/6);
	i2c_clk(I2C_CLOCK_HIGH);
	i2c_delay(CLOCK_HIGH_TIME);
	i2c_clk(I2C_CLOCK_LOW);
	i2c_delay(CLOCK_LOW_TIME/6);
	/*
	 * reset data out
	 */
	i2c_data(I2C_DATA_HIGH);
	i2c_delay(CLOCK_LOW_TIME);

	i2c_dir_in();
}
Ejemplo n.º 8
0
void mag3110_init(void)
{
	
   uint8_t deviceid;
	
	 /* read sensor ID */
	 deviceid = mag3110_read(0x07); 

	 /* check available sensor */
	 if (deviceid != 0xC4)
	 {
			printf("mag3110: Device not found\r\n");
	 }	
		
  //CTRL_REG1
  //DR2|DR1|DR0|OS1|OS0|FastRead|Trigger|ActiveMode|
  // 0 | 1 | 1 | 1 | 1 |    0   |   0   |    1     |
	mag3110_write(0x10, 0x79);
	i2c_delay();
	i2c_delay();
  
	//CTRL_REG2: 
  //AutoMagRst|---|Raw|Mag_Rst|---|---|---|---|
  //    1     | 0 | 0 |   0   | 0 | 0 | 0 | 0 |
	mag3110_write(0x11, 0x80);
}
Ejemplo n.º 9
0
/* i2c_read_byte
   Read a byte from I2C bus
   => ack = acknowlege bit to send after read
   <= returns data read from the bus
*/
unsigned char i2c_read_byte(unsigned char ack)
{
   unsigned char loop, byte;
   
   i2c_set_sda();
   
   /* read data msb first */
   for(loop = 0; loop < 8; loop++)
   {
      byte = byte << 1;
      i2c_set_scl();
      i2c_delay();
      if(i2c_read_sda()) byte = byte | 1;
      i2c_clear_scl();
   }
   
   /* send ack bit */
   if(ack)
      i2c_set_sda();
   else
      i2c_clear_sda();
   i2c_set_scl();
   i2c_delay();
   i2c_clear_scl();
   i2c_set_sda();
   
   return byte;
}
Ejemplo n.º 10
0
/* i2c_write_byte
   Write a byte to I2C bus
   => byte = data to write out
   <= return 0 if acknowleged by the slave
*/
unsigned char i2c_write_byte(unsigned char byte)
{
   unsigned char loop, ack, original_byte = byte;
   
   /* send data, msb first */
   for(loop = 0; loop < 8; loop++)
   {
      if(byte & 0x80)
         i2c_set_sda();
      else
         i2c_clear_sda();
      i2c_set_scl();
      i2c_delay();
      i2c_clear_scl();
      byte = byte << 1;
   }
   
   /* read ack bit from slave */
   i2c_set_sda();
   i2c_set_scl();
   i2c_delay();
   ack = i2c_read_sda();
   i2c_clear_scl();
   
   return ack;
}
Ejemplo n.º 11
0
uint8_t i2c_read(bool ack){
  uint8_t i, d = 0;
  i2c_sda = 1; 
  for(i = 8; i != 0; i--) {
    i2c_delay();
    d <<= 1;
    do {
      i2c_scl = 1;
    }
    while(i2c_scl_in == 0); // wait for any i2c_scl clock stretching to complete
    i2c_delay();
    if (i2c_sda_in)
      d |= 1;
    i2c_scl = 0;
  } 

  if (ack)
    i2c_sda = 0;
  else
    i2c_sda = 1;

  i2c_delay();
  i2c_scl = 1;
  i2c_delay();             // send (N)ACK bit
  i2c_scl = 0;
  i2c_delay();
  i2c_sda = 1;

  return d;
}
Ejemplo n.º 12
0
int i2c_stop(i2c_t *obj)
{
    int delay_value;
    switch ((int)obj->i2c) {
        case I2C_0:
            delay_value = TSC_TSU;
            break;
        case I2C_1:
            delay_value = AAIC_TSU;
            break;
        case I2C_2:
            delay_value = SHIELD_TSU;
            break;
        case I2C_3:
            delay_value = SHIELD_TSU;
            break;
    }
    // Actual stop bit
    i2c_delay(delay_value);
    obj->i2c->CONTROLC = SDA;
    i2c_delay(delay_value);
    obj->i2c->CONTROLS = SCL;
    i2c_delay(delay_value);
    obj->i2c->CONTROLS = SDA;
    i2c_delay(delay_value);

    return 0;
}
Ejemplo n.º 13
0
void i2c_stop(){
  i2c_sda = 0; 
  i2c_delay();
  i2c_scl = 1;
  i2c_delay();
  i2c_sda = 1;
  i2c_delay();
}
Ejemplo n.º 14
0
Archivo: iic.c Proyecto: Fyiyu/X4_Flyer
void i2c_stop(void)
{
    SDA_LOW ;      
    SCL_HIGH ;    
    i2c_delay() ;  
    SDA_HIGH ;     
    i2c_delay() ;  
}
Ejemplo n.º 15
0
//------------------------------------------------------------------------
static void i2c_stop ( void )
{
    i2c_delay();
    scl_high();
    i2c_delay();
    sda_high();
    i2c_delay();
    i2c_delay();
}
Ejemplo n.º 16
0
void i2c_stop(void){
  P2DIR |= 0x01; // set SDA = 0 
  i2c_delay();
  P2DIR &= ~0x02; // set SCL = 1
  i2c_delay();
  P2DIR &= ~0x01; // set SDA = 1
  i2c_delay();
  
}
Ejemplo n.º 17
0
static void i2c_stop(void)
{
    clr_i2c_pin(GPIO_I2C_SCL);
    clr_i2c_pin(GPIO_I2C_SDA);
    set_i2c_pin(GPIO_I2C_SCL);
    i2c_delay(DELAY_UNIT << Dtime);
    set_i2c_pin(GPIO_I2C_SDA);
    i2c_delay(DELAY_UNIT << Dtime);
}
Ejemplo n.º 18
0
Archivo: i2c.c Proyecto: pandc/unitek
static void i2c_stop(void)
{
	GPIO_ResetBits(I2Cx_PORT,I2Cx_SCL_PIN);	/* SCL -> 0 */
	GPIO_ResetBits(I2Cx_PORT,I2Cx_SDA_PIN);	/* SDA->0 set bit 4 of P3 to 0 */
	i2c_delay();
	GPIO_SetBits(I2Cx_PORT,I2Cx_SCL_PIN);		/* SCL -> 1 */
	i2c_delay();
	GPIO_SetBits(I2Cx_PORT,I2Cx_SDA_PIN);		/* SDA 0->1 set bit 4 of P3 to 1 */
}
Ejemplo n.º 19
0
Archivo: iic.c Proyecto: Fyiyu/X4_Flyer
void i2c_start(void)
{
    SDA_HIGH ;
    SCL_HIGH ;  
    i2c_delay() ;  
    SDA_LOW ;   
    i2c_delay() ; 
    SCL_LOW ;  
}
Ejemplo n.º 20
0
//Передает адрес приемника + RW/RD
void i2c_tx_addr(unsigned char adr)
{
  i2c_delay();                                     //Wait for TWI interrupt flag set
  TWDR = adr;
  TWCR=((1<<TWINT)|(1<<TWEN));      //Clear int flag to send byte
  i2c_delay();             //Wait for TWI interrupt flag set
 // if((TWSR != MTX_ADR_ACK)&&(TWSR != MRX_ADR_ACK))//If NACK received return
 //   i2c_error=1;
}
Ejemplo n.º 21
0
/*
 * TODO!
 */
void i2c_stop(void) {
    i2c_init(WRITE);    // Initialization
    SDA_0;              // A LOW state on SDA line
    i2c_delay(uDLY);    // Just We Wait...
    SCL_1;              // Now HIGHT state on SCL line
    i2c_delay(uDLY);    // ...still wait...
    SDA_1;              // And SDA go to HIGHT state
    i2c_delay(uDLY);    // ...And Again
}
Ejemplo n.º 22
0
void i2c_reset(){
  i2c_sda = 1;
  while (!i2c_sda_in){
    i2c_scl = 0;
    i2c_delay();
    i2c_scl = 1;
    i2c_delay();
  }
}
Ejemplo n.º 23
0
//------------------------------------------------------------------------
static void i2c_start ( void )
{
    i2c_delay();
    i2c_delay();
    sda_low();
    i2c_delay();
    i2c_delay();
    scl_low();
    i2c_delay();
}
Ejemplo n.º 24
0
Archivo: eeprom.c Proyecto: shkmr/dfw
static inline void write_bit(unsigned bit)
{
  if (bit) set_SDA(); else clr_SDA();
  i2c_delay();
  set_SCL();
  while (!tst_SCL()) ;
  i2c_delay();
  clr_SCL();
  i2c_delay();
}
Ejemplo n.º 25
0
void i2c_start(){
  i2c_sda = 1;
  i2c_delay();
  i2c_scl = 1;
  i2c_delay();
  i2c_sda = 0;
  i2c_delay();
  i2c_scl = 0;
  i2c_delay();
}
Ejemplo n.º 26
0
/*
 * TODO!
 */
void i2c_start(void) {
    i2c_init(WRITE);    // Initialization
    SCL_1;              // HIGHT state SCL and...
    SDA_1;              // ...HIGHT state SDA, of course
    i2c_delay(uDLY);    // let's wait a bit...
    SDA_0;              // WoW!!! LOW state SDA (a START Condition)
    i2c_delay(uDLY);    // ... again ...
    SCL_0;              // And lets end the START condition-LOW state SCL
    i2c_delay(uDLY);    // ...and one more
}
Ejemplo n.º 27
0
static void i2c_stop_cond(void)
{
	/* set SDA to 0 */
	CSR_GPIO_OUT |= GPIO_I2C_SDA_DRIVELOW;
	i2c_delay();
	CSR_GPIO_OUT |= GPIO_I2C_SDC;
	i2c_delay();
	CSR_GPIO_OUT &= ~GPIO_I2C_SDA_DRIVELOW;
	i2c_delay();
	i2c_started = 0;
}
Ejemplo n.º 28
0
void i2c_start(void){
  
  P2DIR &= ~0x01;  // set the P2.0 (SDA) as input for SDA = 1 due to pull up resistor;
  i2c_delay(); 
  P2DIR &= ~0x02; // set the P2.1 (SCL) as input for SCL = 1  due to pull up resistor;
  i2c_delay();
  P2DIR |= 0x01; // Set SDA as output for  SDA = 0 due to P2OUT being set to ground earlier
  i2c_delay();
  P2DIR |= 0x02; // Set P2.1 (SCL)  as output
  i2c_delay(); 
}
Ejemplo n.º 29
0
//Посылка байта
void i2c_tx(unsigned char byte)
{
  if(i2c_error)
    return;
  i2c_delay();
  TWDR = byte;
  TWCR = ((1<<TWINT)+(1<<TWEN));
  i2c_delay();
//  if(TWSR != MTX_DATA_ACK)                            //если нет подтверждения от приемника, то
//    i2c_error=1;                                      //признак ошибки
}
Ejemplo n.º 30
0
static uint8_t i2c_read_bit(void)
{
    uint8_t val;
    /* do not drive SDA */
    i2c_read_sda();
    i2c_delay();
    i2c_read_scl_and_delay();
    val = i2c_read_sda();
    i2c_delay();
    i2c_clear_scl();
    return val;
}