bool_t bSMBusSequentialRead_NACK(uint8 u8Address, uint8 u8Length, uint8* pu8Data) { /* Send address with write bit set */ vAHI_SiMasterWriteSlaveAddr(u8Address, !E_AHI_SI_SLAVE_RW_SET); vAHI_SiMasterSetCmdReg(E_AHI_SI_START_BIT, E_AHI_SI_NO_STOP_BIT, E_AHI_SI_NO_SLAVE_READ, E_AHI_SI_SLAVE_WRITE, E_AHI_SI_SEND_ACK, E_AHI_SI_NO_IRQ_ACK); if(!bSMBusWait()) return(FALSE); while(u8Length > 0){ u8Length--; /* * If its the last byte to be sent, send with * stop sequence set */ if(u8Length == 0){ vAHI_SiMasterSetCmdReg(E_AHI_SI_NO_START_BIT, E_AHI_SI_STOP_BIT, E_AHI_SI_SLAVE_READ, E_AHI_SI_NO_SLAVE_WRITE, E_AHI_SI_SEND_NACK, E_AHI_SI_NO_IRQ_ACK); } else { vAHI_SiMasterSetCmdReg(E_AHI_SI_NO_START_BIT, E_AHI_SI_NO_STOP_BIT, E_AHI_SI_SLAVE_READ, E_AHI_SI_NO_SLAVE_WRITE, E_AHI_SI_SEND_NACK, E_AHI_SI_NO_IRQ_ACK); } while(bAHI_SiMasterPollTransferInProgress()); /* busy wait */ *pu8Data++ = u8AHI_SiMasterReadData8(); } return(TRUE); }
/** Read I2C bus. * @param sendAck if ACK is required * @param sendStop if STOP required * @return Result of reading, or negative error code (-7 error in first reading, -9 error in final reading, -8 no ACK for first reading, -10 no ACK for final reading) */ uint8 ReadI2C(bool_t sendAck, bool_t sendStop) { #ifdef I2CDEV_SERIAL_DEBUG i2cdev_debug_depth++; int z; for(z=0;z<i2cdev_debug_depth;z++) DBG_vPrintf(TRACE_APP, "\t"); DBG_vPrintf(TRACE_APP, "ReadI2C\r\n"); #endif bool_t check_status; if (!I2Cdev_enabled) { i2cdev_debug_depth--; return -15; } bAHI_SiMasterSetCmdReg(E_AHI_SI_NO_START_BIT, sendStop, E_AHI_SI_SLAVE_READ, E_AHI_SI_NO_SLAVE_WRITE, sendAck, E_AHI_SI_NO_IRQ_ACK); check_status = IdleI2C(); if (check_status) { #ifdef I2CDEV_SERIAL_DEBUG i2cdev_debug_depth--; #endif return -7 - 2*(sendStop == SEND_STOP); // Return -7, or -9 if final reading } // Check acknowledge if ((check_status = bAHI_SiMasterCheckRxNack())) { #ifdef I2CDEV_SERIAL_DEBUG i2cdev_debug_depth--; #endif return -8 - 2*(sendStop == SEND_STOP); // Return -8, or -10 if final reading } uint8 buf = u8AHI_SiMasterReadData8(); #ifdef I2CDEV_SERIAL_DEBUG i2cdev_debug_depth--; #endif return buf; }
uint8_t TwoWire::requestFrom(uint8_t address, uint8_t quantity, uint8_t sendStop) { if (quantity > BUFFER_LENGTH) quantity = BUFFER_LENGTH; DBG_PRINTF("vAHI_SiMasterWriteSlaveAddr %x\r\n", address); vAHI_SiMasterWriteSlaveAddr(address, true); vAHI_SiSetCmdReg(E_AHI_SI_START_BIT, E_AHI_SI_NO_STOP_BIT, E_AHI_SI_NO_SLAVE_READ, E_AHI_SI_SLAVE_WRITE, E_AHI_SI_SEND_ACK, E_AHI_SI_NO_IRQ_ACK); while(bAHI_SiPollTransferInProgress()); /* wait while busy */ // perform blocking read into buffer int readed = 0; do { if(readed == (quantity-1) ) { vAHI_SiSetCmdReg(E_AHI_SI_NO_START_BIT, E_AHI_SI_STOP_BIT, E_AHI_SI_SLAVE_READ, E_AHI_SI_NO_SLAVE_WRITE, E_AHI_SI_SEND_ACK, E_AHI_SI_NO_IRQ_ACK); } else { vAHI_SiSetCmdReg(E_AHI_SI_NO_START_BIT, E_AHI_SI_NO_STOP_BIT, E_AHI_SI_SLAVE_READ, E_AHI_SI_NO_SLAVE_WRITE, E_AHI_SI_SEND_ACK, E_AHI_SI_NO_IRQ_ACK); } while(bAHI_SiPollTransferInProgress()); /* wait while busy */ rxBuffer[readed++] = u8AHI_SiMasterReadData8(); DBG_PRINTF("u8AHI_SiMasterReadData8 %x\r\n", rxBuffer[readed-1]); } while (readed < quantity); // set rx buffer iterator vars rxBufferIndex = 0; rxBufferLength = readed; return readed; }
/* * read a buff to I2C * - i2c_device: i2c device pointer * - dev_addr: device address * - data: data buff * - len: data lenght * return */ uint8 suli_i2c_read(void *i2c_device, uint8 dev_addr, uint8 *buff, uint8 len) { vAHI_SiMasterWriteSlaveAddr(dev_addr, TRUE); // bSetSTA, bSetSTO, bSetRD, bSetWR, bSetAckCtrl, bSetIACK); bAHI_SiMasterSetCmdReg(TRUE, FALSE, FALSE, TRUE, E_AHI_SI_SEND_ACK, E_AHI_SI_NO_IRQ_ACK); while(bAHI_SiMasterPollTransferInProgress()); //Waitforanindicationofsuccess int i; uint8 *old = buff; for(i = 0; i < len; i++) { if(i == (len - 1)) //should send stop, nack { bAHI_SiMasterSetCmdReg(FALSE, TRUE, TRUE, FALSE, E_AHI_SI_SEND_NACK, E_AHI_SI_NO_IRQ_ACK); } else { bAHI_SiMasterSetCmdReg(FALSE, FALSE, TRUE, FALSE, E_AHI_SI_SEND_ACK, E_AHI_SI_NO_IRQ_ACK); } while(bAHI_SiMasterPollTransferInProgress()); //Waitforanindicationofsuccess *buff++ = u8AHI_SiMasterReadData8(); } return buff - old; }