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 }
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); }