PRIVATE void vSBReadIIC(uint8 u8SlaveAddress, uint8 u8Address, uint8 *pau8ReadBuffer, int16 i16Length) { uint8 i=0; uint16 u16ReadLength; if(i16Length < 0x01) { return; } u16ReadLength = i16Length; vPrintf("Start read\n"); /* set slave address */ //u8SlaveAddress = u8SlaveAddress << 1; vAHI_SiWriteSlaveAddr(u8SlaveAddress,FALSE); 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 */ /* check to see if anyone else has taken the bus */ /*if(bAHI_SiPollRxNack()) { vDebug("Error 1\n"); return; }*/ if(bAHI_SiPollArbitrationLost()) { vPrintf("Error 2\n"); return; } vPrintf("Write addr\n"); vAHI_SiWriteData8(u8Address | 0x80); /* address to start read from */ vAHI_SiSetCmdReg(E_AHI_SI_NO_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 */ vPrintf("Switch to read\n"); //u8SlaveAddress = u8SlaveAddress | 0x01; vAHI_SiWriteSlaveAddr(u8SlaveAddress,TRUE); //vAHI_SiWriteSlaveAddr(u8Address,TRUE); vAHI_SiSetCmdReg(E_AHI_SI_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 */ // vPrintf("Before reading\n"); /* now we can start reading data back from the eeprom */ while(u16ReadLength > 0x00) { if(u16ReadLength < 2) /* is it the last byte */ { 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_NACK, 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 */ pau8ReadBuffer[i++] = u8AHI_SiReadData8(); u16ReadLength--; } vPrintf("read complete\n"); }