/* * write a buff to I2C * - i2c_device: i2c device pointer * - dev_addr: device address * - data: data buff * - len: data lenght */ uint8 suli_i2c_write(void * i2c_device, uint8 dev_addr, uint8 *data, uint8 len) { vAHI_SiMasterWriteSlaveAddr(dev_addr, FALSE); // 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 = data; for(i = 0; i < len; i++) { vAHI_SiMasterWriteData8(*data++); if(i == (len - 1)) //should send stop { bAHI_SiMasterSetCmdReg(FALSE, TRUE, FALSE, TRUE, E_AHI_SI_SEND_ACK, E_AHI_SI_NO_IRQ_ACK); } else { bAHI_SiMasterSetCmdReg(FALSE, FALSE, FALSE, TRUE, E_AHI_SI_SEND_ACK, E_AHI_SI_NO_IRQ_ACK); } while(bAHI_SiMasterPollTransferInProgress()); //Waitforanindicationofsuccess if(bAHI_SiMasterCheckRxNack()) { bAHI_SiMasterSetCmdReg(FALSE, TRUE, FALSE, FALSE, E_AHI_SI_SEND_ACK, E_AHI_SI_NO_IRQ_ACK); break; } } return data - old; }
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 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; }
/** Active wait . * @return Status of wait (timeout or succeed) */ bool_t IdleI2C() { #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, "IdleI2C\r\n"); #endif volatile uint32 i; bool_t check_status; for (i = 0; (check_status = bAHI_SiMasterPollTransferInProgress()) && (i < 1000); i++) { // NOP } #ifdef I2CDEV_SERIAL_DEBUG i2cdev_debug_depth--; #endif return check_status; }
PRIVATE bool_t bSMBusWait(void) { while(bAHI_SiMasterPollTransferInProgress()); /* busy wait */ if (bAHI_SiMasterPollArbitrationLost() | bAHI_SiMasterCheckRxNack()) { /* release bus & abort */ vAHI_SiMasterSetCmdReg(E_AHI_SI_NO_START_BIT, E_AHI_SI_STOP_BIT, E_AHI_SI_NO_SLAVE_READ, E_AHI_SI_SLAVE_WRITE, E_AHI_SI_SEND_ACK, E_AHI_SI_NO_IRQ_ACK); return(FALSE); } return(TRUE); }