Exemple #1
0
uint8_t TwoWire::requestFrom(uint8_t address, uint8_t quantity, uint8_t sendStop) {
	if (quantity > BUFFER_LENGTH) quantity = BUFFER_LENGTH;
	int readed = 0;
	int timeout_=TIMEOUT;
	while(timeout_--)
	{
		/* Send start */
		I2C_START(i2c);	
		I2C_WAIT_READY(i2c);
		
		/* Send control byte */
		I2C_SET_DATA(i2c, (address<<1)+1);			
		I2C_SET_CONTROL_REG(i2c, I2C_SI | I2C_AA);
		I2C_WAIT_READY(i2c);	
	
		if(I2C_GET_STATUS(i2c)!=0x40)
		{ /* Send stop */			
			I2C_SET_CONTROL_REG(i2c, I2C_STO | I2C_SI);	
			continue;	
		}
		readed = 0;		 	 
		while (readed < quantity){				
			/* Read data */
			if((readed+1)==quantity)			
				I2C_SET_CONTROL_REG(i2c, I2C_SI);
			else
				I2C_SET_CONTROL_REG(i2c, I2C_SI | I2C_AA);
			I2C_WAIT_READY(i2c);			
			rxBuffer[readed++] = I2C_GET_DATA(i2c);
		};	
		if(sendStop==true){
					/* Send stop */
			I2C_SET_CONTROL_REG(i2c, I2C_STO | I2C_SI);				
		}else
			I2C_SET_CONTROL_REG(i2c, I2C_SI);					
		
		break;
	}
			
	// set rx buffer iterator vars
	rxBufferIndex = 0;
	rxBufferLength = readed;		
		
	return readed;			
}
Exemple #2
0
uint8_t TwoWire::endTransmission(uint8_t sendStop) {
	
	int sent = 0;	/* Send data */
	int timeout_=TIMEOUT;
	while(timeout_--)
	{
		/* Send start */
		I2C_START(i2c);	
		I2C_WAIT_READY(i2c);			
	
		/* Send control byte */
		I2C_SET_DATA(i2c, txAddress);
		I2C_SET_CONTROL_REG(i2c, I2C_SI);
		I2C_WAIT_READY(i2c);			
		if(I2C_GET_STATUS(i2c)!=0x18) 
		{ 
			I2C_SET_CONTROL_REG(i2c, I2C_STO | I2C_SI);
			continue;
		}
		sent = 0;
		while (sent < txBufferLength) {
			I2C_SET_DATA(i2c, txBuffer[sent++]);
			I2C_SET_CONTROL_REG(i2c, I2C_SI);
			I2C_WAIT_READY(i2c);	
			if(I2C_GET_STATUS(i2c)!=0x28) { 
				I2C_SET_CONTROL_REG(i2c, I2C_STO | I2C_SI);
				continue;
			}			
		}
		if(sendStop==true)
		{
			/* Send stop */
			I2C_SET_CONTROL_REG(i2c, I2C_STO | I2C_SI);  				
		}
		break;
	}	
	// empty buffer
	txBufferLength = 0;
	status = MASTER_IDLE;	
	return sent;	
}
uint8_t MPU6050_I2C_SingleRead(uint8_t index)
{
	uint8_t tmp;
	      I2C_START(MPU6050_I2C_PORT);                         //Start
	      I2C_WAIT_READY(MPU6050_I2C_PORT);
        MPU6050_I2C_PORT->INTSTS |= I2C_INTSTS_INTSTS_Msk;   //clear flag		
	
	      I2C_SET_DATA(MPU6050_I2C_PORT, MPU6050_I2C_SLA);         //send slave address+W
	      I2C_SET_CONTROL_REG(MPU6050_I2C_PORT, I2C_SI);
	      I2C_WAIT_READY(MPU6050_I2C_PORT);
        MPU6050_I2C_PORT->INTSTS |= I2C_INTSTS_INTSTS_Msk;   //clear flag		

	      I2C_SET_DATA(MPU6050_I2C_PORT, index);               //send index
	      I2C_SET_CONTROL_REG(MPU6050_I2C_PORT, I2C_SI);
	      I2C_WAIT_READY(MPU6050_I2C_PORT);
        MPU6050_I2C_PORT->INTSTS |= I2C_INTSTS_INTSTS_Msk;   //clear flag		
	
	      I2C_SET_CONTROL_REG(MPU6050_I2C_PORT, I2C_STA | I2C_SI);	//Start
	      I2C_WAIT_READY(MPU6050_I2C_PORT);
        MPU6050_I2C_PORT->INTSTS |= I2C_INTSTS_INTSTS_Msk;   //clear flag	

		    I2C_SET_DATA(MPU6050_I2C_PORT, (MPU6050_I2C_SLA+1));     //send slave address+R
	      I2C_SET_CONTROL_REG(MPU6050_I2C_PORT, I2C_SI);
	      I2C_WAIT_READY(MPU6050_I2C_PORT);
        MPU6050_I2C_PORT->INTSTS |= I2C_INTSTS_INTSTS_Msk;   //clear flag								
	
	      I2C_SET_CONTROL_REG(MPU6050_I2C_PORT, I2C_SI);
	      I2C_WAIT_READY(MPU6050_I2C_PORT);
        MPU6050_I2C_PORT->INTSTS |= I2C_INTSTS_INTSTS_Msk;   //clear flag								
				tmp = I2C_GET_DATA(MPU6050_I2C_PORT);                //read data   
	
	      I2C_STOP(MPU6050_I2C_PORT); //STOP
				return tmp;
}
uint8_t LM75A_I2C_SingleRead(uint8_t index)
{
	uint8_t tmp;
	      I2C_START(LM75A_I2C_PORT);                         //Start
	      I2C_WAIT_READY(LM75A_I2C_PORT);
        LM75A_I2C_PORT->INTSTS |= I2C_INTSTS_INTSTS_Msk;   //clear flag		
	
	      I2C_SET_DATA(LM75A_I2C_PORT, LM75A_I2C_SLA);         //send slave address+W
	      I2C_SET_CONTROL_REG(LM75A_I2C_PORT, I2C_SI);
	      I2C_WAIT_READY(LM75A_I2C_PORT);
        LM75A_I2C_PORT->INTSTS |= I2C_INTSTS_INTSTS_Msk;   //clear flag		

	      I2C_SET_DATA(LM75A_I2C_PORT, index);               //send index
	      I2C_SET_CONTROL_REG(LM75A_I2C_PORT, I2C_SI);
	      I2C_WAIT_READY(LM75A_I2C_PORT);
        LM75A_I2C_PORT->INTSTS |= I2C_INTSTS_INTSTS_Msk;   //clear flag		
	
	      I2C_SET_CONTROL_REG(LM75A_I2C_PORT, I2C_STA | I2C_SI);	//Start
	      I2C_WAIT_READY(LM75A_I2C_PORT);
        LM75A_I2C_PORT->INTSTS |= I2C_INTSTS_INTSTS_Msk;   //clear flag	

		    I2C_SET_DATA(LM75A_I2C_PORT, (LM75A_I2C_SLA+1));     //send slave address+R
	      I2C_SET_CONTROL_REG(LM75A_I2C_PORT, I2C_SI);
	      I2C_WAIT_READY(LM75A_I2C_PORT);
        LM75A_I2C_PORT->INTSTS |= I2C_INTSTS_INTSTS_Msk;   //clear flag								
	
	      I2C_SET_CONTROL_REG(LM75A_I2C_PORT, I2C_SI);
	      I2C_WAIT_READY(LM75A_I2C_PORT);
        LM75A_I2C_PORT->INTSTS |= I2C_INTSTS_INTSTS_Msk;   //clear flag								
				tmp = I2C_GET_DATA(LM75A_I2C_PORT);                //read data   
	
	      I2C_SET_CONTROL_REG(LM75A_I2C_PORT, I2C_SI|I2C_STO);//Stop
				return tmp;
}
void MPU6050_I2C_SingleWrite(uint8_t index, uint8_t data)
{
        I2C_START(MPU6050_I2C_PORT);                         //Start
	      I2C_WAIT_READY(MPU6050_I2C_PORT);
        MPU6050_I2C_PORT->INTSTS |= I2C_INTSTS_INTSTS_Msk;   //clear flag	
	
	      I2C_SET_DATA(MPU6050_I2C_PORT, MPU6050_I2C_SLA);         //send slave address
	      I2C_SET_CONTROL_REG(MPU6050_I2C_PORT, I2C_SI);
	      I2C_WAIT_READY(MPU6050_I2C_PORT);
        MPU6050_I2C_PORT->INTSTS |= I2C_INTSTS_INTSTS_Msk;   //clear flag		

	      I2C_SET_DATA(MPU6050_I2C_PORT, index);               //send index
	      I2C_SET_CONTROL_REG(MPU6050_I2C_PORT, I2C_SI);
	      I2C_WAIT_READY(MPU6050_I2C_PORT);
        MPU6050_I2C_PORT->INTSTS |= I2C_INTSTS_INTSTS_Msk;   //clear flag		

	      I2C_SET_DATA(MPU6050_I2C_PORT, data);                //send Data
	      I2C_SET_CONTROL_REG(MPU6050_I2C_PORT, I2C_SI);
	      I2C_WAIT_READY(MPU6050_I2C_PORT);
        MPU6050_I2C_PORT->INTSTS |= I2C_INTSTS_INTSTS_Msk;   //clear flag		
				
				I2C_STOP(MPU6050_I2C_PORT); //STOP
}
void LM75A_I2C_SingleWrite(uint8_t index, uint8_t data)
{
        I2C_START(LM75A_I2C_PORT);                         //Start
	      I2C_WAIT_READY(LM75A_I2C_PORT);
        LM75A_I2C_PORT->INTSTS |= I2C_INTSTS_INTSTS_Msk;   //clear flag	
	
	      I2C_SET_DATA(LM75A_I2C_PORT, LM75A_I2C_SLA);         //send slave address
	      I2C_SET_CONTROL_REG(LM75A_I2C_PORT, I2C_SI);
	      I2C_WAIT_READY(LM75A_I2C_PORT);
        LM75A_I2C_PORT->INTSTS |= I2C_INTSTS_INTSTS_Msk;   //clear flag		

	      I2C_SET_DATA(LM75A_I2C_PORT, index);               //send index
	      I2C_SET_CONTROL_REG(LM75A_I2C_PORT, I2C_SI);
	      I2C_WAIT_READY(LM75A_I2C_PORT);
        LM75A_I2C_PORT->INTSTS |= I2C_INTSTS_INTSTS_Msk;   //clear flag		

	      I2C_SET_DATA(LM75A_I2C_PORT, data);                //send Data
	      I2C_SET_CONTROL_REG(LM75A_I2C_PORT, I2C_SI);
	      I2C_WAIT_READY(LM75A_I2C_PORT);
        LM75A_I2C_PORT->INTSTS |= I2C_INTSTS_INTSTS_Msk;   //clear flag		
				
				I2C_SET_CONTROL_REG(LM75A_I2C_PORT, I2C_SI|I2C_STO);//Stop
}
uint16_t LM75A_I2C_DoubleRead(uint8_t index)
{
	uint8_t msb, lsb;
	uint16_t tmp;
	      I2C_START(LM75A_I2C_PORT);                         //Start
	      I2C_WAIT_READY(LM75A_I2C_PORT);
        LM75A_I2C_PORT->INTSTS |= I2C_INTSTS_INTSTS_Msk;   //clear flag		
	
	      I2C_SET_DATA(LM75A_I2C_PORT, LM75A_I2C_SLA);      //send slave address+W
	      I2C_SET_CONTROL_REG(LM75A_I2C_PORT, I2C_SI);
	      I2C_WAIT_READY(LM75A_I2C_PORT);
        LM75A_I2C_PORT->INTSTS |= I2C_INTSTS_INTSTS_Msk;   //clear flag		

	      I2C_SET_DATA(LM75A_I2C_PORT, index);               //send index
	      I2C_SET_CONTROL_REG(LM75A_I2C_PORT, I2C_SI);
	      I2C_WAIT_READY(LM75A_I2C_PORT);
        LM75A_I2C_PORT->INTSTS |= I2C_INTSTS_INTSTS_Msk;   //clear flag		
	
	      I2C_SET_CONTROL_REG(LM75A_I2C_PORT, I2C_STA | I2C_SI);	//Start
	      I2C_WAIT_READY(LM75A_I2C_PORT);
        LM75A_I2C_PORT->INTSTS |= I2C_INTSTS_INTSTS_Msk;   //clear flag	

		    I2C_SET_DATA(LM75A_I2C_PORT, (LM75A_I2C_SLA+1));     //send slave address+R
	      I2C_SET_CONTROL_REG(LM75A_I2C_PORT, I2C_SI);
	      I2C_WAIT_READY(LM75A_I2C_PORT);
        LM75A_I2C_PORT->INTSTS |= I2C_INTSTS_INTSTS_Msk;   //clear flag								
	
	      I2C_SET_CONTROL_REG(LM75A_I2C_PORT, I2C_SI);
	      I2C_WAIT_READY(LM75A_I2C_PORT);
        LM75A_I2C_PORT->INTSTS |= I2C_INTSTS_INTSTS_Msk;   //clear flag								
				msb = I2C_GET_DATA(LM75A_I2C_PORT);                //read data   

	      I2C_SET_CONTROL_REG(LM75A_I2C_PORT, I2C_SI);
	      I2C_WAIT_READY(LM75A_I2C_PORT);
        LM75A_I2C_PORT->INTSTS |= I2C_INTSTS_INTSTS_Msk;   //clear flag								
				lsb = I2C_GET_DATA(LM75A_I2C_PORT);                //read data  				
	      I2C_SET_CONTROL_REG(LM75A_I2C_PORT, I2C_SI|I2C_STO);//Stop
				
				tmp = msb;
				tmp = tmp<<8 | lsb;
				return tmp;
}