Example #1
0
void _ISR _SI2CInterrupt(void) //I2C slave interrupt
{
	IEC0bits.SI2CIE = 0; //Disable interrupts
	if((I2CSTATbits.R_W == 0)&&(I2CSTATbits.D_A == 0))	//Address matched, writing register address to slave
	{
		temp = I2CRCV;		//dummy read to remove stored address value
		Flag.AddrFlag = 1;	//next byte will be address
		Flag.DataFlag = 0;
	}
	else if((I2CSTATbits.R_W == 0)&&(I2CSTATbits.D_A == 1))	//Check for data	
	{
		if(Flag.AddrFlag)
		{
			Flag.AddrFlag = 0;	
			Flag.DataFlag = 1;	//next byte is data
			address = I2CRCV;
			I2CCONbits.SCLREL = 1;	//Release SCL line
		}
		else if(Flag.DataFlag)
		{
			registerWrite(address, I2CRCV);// store data into register
			I2CCONbits.SCLREL = 1;	//Release SCL line
			address++; //Increment address pointer incase stop bit isn't recieved / another byte comes through
		}
	}
	else if((I2CSTATbits.R_W == 1)&&(I2CSTATbits.D_A == 0)) //Been told to put data on bus, must already have desired register address
	{
		temp = I2CRCV; //ditch stored address
		I2CTRN = registerRead(address); //Read data from register & send data to I2C transmit buffer, setting D/A in the process
		I2CCONbits.SCLREL = 1;	//Release SCL line
		address++; //Increment address for next read
	}
	else if((I2CSTATbits.R_W == 1)&&(I2CSTATbits.D_A == 1)) //D/A hasn't been reset, master must want more data
	{
		I2CTRN = registerRead(address); //Read data from RAM & send data to I2C master device
		I2CCONbits.SCLREL = 1;	//Release SCL line
		address++;
	}
	_SI2CIF = 0;	//clear I2C1 Slave interrupt flag
	IEC0bits.SI2CIE = 1; //Enable interrupts
}
Example #2
0
static int pixi_spi_set (int channel, int address, int data) {
	LIBPIXI_UNUSED(channel);
	return registerWrite (address, data);
}
void MMA8452Q::offset(int8_t off_x, int8_t off_y, int8_t off_z) {
	registerWrite(OFF_X, off_x);
	registerWrite(OFF_Y, off_y);
	registerWrite(OFF_Z, off_z);
}
static inline void registerSetBit(uint8_t addr, uint8_t bit, bool value) {
	uint8_t val = registerRead(addr);
	bitWrite(val, bit, value);
	registerWrite(addr, val);
}