/* Sequential master read */ int Chip_I2C_MasterRead(I2C_ID_T id, uint8_t slaveAddr, uint8_t *buff, int len) { I2C_XFER_T xfer = {0}; xfer.slaveAddr = slaveAddr; xfer.rxBuff = buff; xfer.rxSz = len; while (Chip_I2C_MasterTransfer(id, &xfer) == I2C_STATUS_ARBLOST) {} return len - xfer.rxSz; }
void I2C_XFER_config (I2C_XFER_T * xfer,uint8_t *rbuf, int rxSz, uint8_t slaveAddr, I2C_STATUS_T status, uint8_t * wbuf, int txSz) { xfer->rxBuff = rbuf; //Buffer de lectura xfer->rxSz = rxSz; //cantidad de bytes que se desean leer, arbitrariamente seteamos 10 xfer->slaveAddr = slaveAddr; //Adress estatica del dispositivo i2c a leer (MPU6050) xfer->status = status; xfer->txBuff = wbuf; //Buffer de escritura xfer->txSz = txSz; //cantidad de bytes que se desean escribir, solo escribimos el registro desde //el que comenzamos a leer Chip_I2C_MasterTransfer(I2C1, xfer); }
int main(void) { uint8_t wbuf[3] = {0,0,0xAA}; uint8_t rbuf[3] = {0,0,0}; uint32_t i; I2C_XFER_T xfer; initHardware(); /* Transferencia de escritura (escribo addr y datos, ojo, tamaño de página 32 bytes) */ xfer.rxBuff = 0; xfer.rxSz = 0; xfer.slaveAddr = 0x50; xfer.status = 0; xfer.txBuff = wbuf; xfer.txSz = 3; Chip_I2C_MasterTransfer(I2C1, &xfer); //delay por software calculado con el teorema de los cinco dedos oscilantes for(i=0; i<0xFFFF; i++); /* Transferencia de lectura (escribo addr, leo datos) */ xfer.rxBuff = rbuf; xfer.rxSz = 1; xfer.slaveAddr = 0x50; xfer.status = 0; xfer.txBuff = wbuf; xfer.txSz = 2; Chip_I2C_MasterTransfer(I2C1, &xfer); //delay por software calculado con el teorema de los cinco dedos oscilantes for(i=0; i<0xFFFF; i++); while(1); }