Пример #1
0
void i2c_writereg(int address, int reg, int data)
{

	i2c_sendheader(address);

	I2C_SendData(I2C1, reg);
	I2C_SendData(I2C1, data);

	while (I2C_StateDetect(I2C1, I2C_PROGRAMMINGMODE_MASTER_BYTE_TRANSMITTED) == ERROR && I2CTIMEOUTCONDITION)
	  {
		  i2ccount++;
	  }

	I2C_StopOnBus_Enable(I2C1, ENABLE);
#ifdef WAITFORSTOP
	while (I2C1->CTLR1 & 0x0200 && I2CTIMEOUTCONDITION)
		i2ccount++;
#endif

	if (!I2CTIMEOUTCONDITION)
	  {
		  liberror++;
	  }

}
Пример #2
0
/**
  * @brief  Handle I2C1 event interrupt request.
  * @param  None
  * @retval None
  */
void I2C1_EventIRQ_Handler(void)
{
    if(I2C_GetBitState(I2C1, I2C_FLAG_SBSEND))
    {
        /* Send slave address */
        I2C_AddressingDevice_7bit(I2C1, I2C2_SLAVE_ADDRESS7, I2C_DIRECTION_TRANSMITTER);
    }
    else if(I2C_GetBitState(I2C1, I2C_FLAG_ADDSEND))
    {
        /*Clear ADDSEND bit */
        event1 = I2C_GetCurrentState(I2C1);
    }
    else if(I2C_GetBitState(I2C1, I2C_FLAG_TBE))
    {
        if(I2C_nBytes>0)
        {
            /* The master sends a data byte */
            I2C_SendData(I2C1,*I2C_WriteBuffer++);
            I2C_nBytes--;
        }
        else
        {
            /* The master sends a stop condition to I2C bus */
            I2C_StopOnBus_Enable(I2C1, ENABLE);
            /* Disable the I2C1 interrupt */
            I2C_INTConfig(I2C1,I2C_INT_EIE | I2C_INT_EE | I2C_INT_BIE, DISABLE);
        }
    }

}
Пример #3
0
int i2c_readreg(int address, int reg)
{
	int data;


	i2c_sendheader(address);

	I2C_SendData(I2C1, reg);
	while (I2C_StateDetect(I2C1, I2C_PROGRAMMINGMODE_MASTER_BYTE_TRANSMITTED) == ERROR && I2CTIMEOUTCONDITION)
	  {
		  i2ccount++;
	  }
// restart
	I2C_StartOnBus_Enable(I2C1, ENABLE);
	while (!I2C_StateDetect(I2C1, I2C_PROGRAMMINGMODE_MASTER_SBSEND && I2CTIMEOUTCONDITION))
	  {
		  i2ccount++;
	  }

// send receiveing address  
	I2C_SendData(I2C1, (address << 1) + 1);
	while (!I2C_StateDetect(I2C1, I2C_PROGRAMMINGMODE_MASTER_RECEIVER_ADDSEND) && I2CTIMEOUTCONDITION)
	  {
		  i2ccount++;
	  }

// wait for one byte
	while (!I2C_StateDetect(I2C1, I2C_PROGRAMMINGMODE_MASTER_BYTE_RECEIVED) && I2CTIMEOUTCONDITION)
	  {
		  i2ccount++;
	  }
	data = I2C_ReceiveData(I2C1);

	I2C_StopOnBus_Enable(I2C1, ENABLE);
	// wait for stop
#ifdef WAITFORSTOP
	while (I2C1->CTLR1 & 0x0200 && I2CTIMEOUTCONDITION)
		i2ccount++;
#endif
	if (!I2CTIMEOUTCONDITION)
	  {
		  liberror++;
	  }

	return data;
}
Пример #4
0
void IIC_Stop(void)
{
    /* Send a stop condition to I2C bus */
    I2C_StopOnBus_Enable(BOARD_I2C,ENABLE);
#ifdef DBG_OLED_BLOCK
    while(BOARD_I2C->CTLR1&0x0200);
#else
    reset_timout_tic();
    while(BOARD_I2C->CTLR1&0x0200 && timeout_tic > 0) {
        timeout_tic--;
    }
    if (timeout_tic == 0) {
        reboot_system(SUCCESS);
    }
#endif

}
Пример #5
0
/**
  * @brief  Main program.
  * @param  None
  * @retval None
  */
int main(void)
{
    int i;
    
    RCC_Configuration();
    GPIO_Configuration();
    I2C_Configuration();

    i=0;
    /* Enable I2C2 */
    I2C_Enable(BOARD_I2C,ENABLE);

    /* Enable Acknowledge */
    I2C_Acknowledge_Enable(BOARD_I2C,ENABLE);

    /* Send a NACK for the next data byte which will be received into the shift register */
    I2C_NACKPosition_Enable(BOARD_I2C,I2C_NACKPOSITION_NEXT);

    /* Wait until I2C Bus is idle */
    while(I2C_GetBitState(BOARD_I2C, I2C_FLAG_I2CBSY));

    /* Send a start condition to I2C bus */
    I2C_StartOnBus_Enable(BOARD_I2C, ENABLE);

    /* Wait until SBSEND bit is set */
    while(!I2C_StateDetect(BOARD_I2C, I2C_PROGRAMMINGMODE_MASTER_SBSEND));

    /* Send slave address to I2C bus */
    I2C_AddressingDevice_7bit(BOARD_I2C, SLAVE_ADDRESS7, I2C_DIRECTION_RECEIVER);

    /* Disable ACK before clearing ADDSEND bit */
    I2C_Acknowledge_Enable(BOARD_I2C, DISABLE);

    /* Wait until ADDSEND bit is set and clear it */
    while(!I2C_StateDetect(BOARD_I2C, I2C_PROGRAMMINGMODE_MASTER_RECEIVER_ADDSEND));

    /* Wait until the last data byte is received into the shift register */
    while(!I2C_GetBitState(BOARD_I2C, I2C_FLAG_BTC));

    /* Send a stop condition */
    I2C_StopOnBus_Enable(BOARD_I2C, ENABLE);

    /* Wait until the reception data register is not empty */
    while(!I2C_GetBitState(BOARD_I2C, I2C_FLAG_RBNE));

    /* Read a data from I2C_DTR */
    BOARD_I2C_Buf_Read[i++]=I2C_ReceiveData(BOARD_I2C);

    /* Wait until the reception data register is not empty */
    while(!I2C_GetBitState(BOARD_I2C, I2C_FLAG_RBNE));

    /* Read a data from I2C_DTR */
    BOARD_I2C_Buf_Read[i++]=I2C_ReceiveData(BOARD_I2C);

    while(BOARD_I2C->CTLR1&0x0200);

    I2C_NACKPosition_Enable(BOARD_I2C,I2C_NACKPOSITION_CURRENT);

    /* Enable Acknowledge */
    I2C_Acknowledge_Enable(BOARD_I2C, ENABLE);

    while(1);
}
Пример #6
0
int i2c_readdata(int address, int reg, int *data, int size)
{
	int index = 0;
	int error = 0;
	int i2ccount2 = 0;
	int byteerror = 0;

	i2c_sendheader(address);

	I2C_SendData(I2C1, reg);

	while (I2C_StateDetect(I2C1, I2C_PROGRAMMINGMODE_MASTER_BYTE_TRANSMITTED) == ERROR && I2CTIMEOUTCONDITION)
		i2ccount++;
// restart
	I2C_StartOnBus_Enable(I2C1, ENABLE);

	while (!I2C_StateDetect(I2C1, I2C_PROGRAMMINGMODE_MASTER_SBSEND) && I2CTIMEOUTCONDITION)
	  {
		  i2ccount++;
	  }
	// read address  
	I2C_SendData(I2C1, (address << 1) + 1);

	I2C_Acknowledge_Enable(I2C1, ENABLE);

	while (!I2C_StateDetect(I2C1, I2C_PROGRAMMINGMODE_MASTER_RECEIVER_ADDSEND) && I2CTIMEOUTCONDITION)
	  {
		  i2ccount++;
	  }


	while (index < size)
	  {
		  i2ccount2 = 0;
		  while (!I2C_StateDetect(I2C1, I2C_PROGRAMMINGMODE_MASTER_BYTE_RECEIVED) && (i2ccount2 < 2048))
		    {
			    i2ccount2++;
		    }
		  if (i2ccount2 >= 2048)
			  byteerror = 1;

		  data[index] = I2C_ReceiveData(I2C1);
		  index++;
		  if (index == size - 1)
			  I2C_Acknowledge_Enable(I2C1, DISABLE);
	  }
	I2C_StopOnBus_Enable(I2C1, ENABLE);
// wait for stop
#ifdef WAITFORSTOP
	while (I2C1->CTLR1 & 0x0200 && I2CTIMEOUTCONDITION)
		i2ccount++;
#endif

	if (!I2CTIMEOUTCONDITION || byteerror)
	  {
		  liberror++;
		  error = 1;
	  }
	I2C_Acknowledge_Enable(I2C1, DISABLE);

	return error;
}