uint8 I2C_MasterWriteBuf(uint8 slaveAddr, uint8 * xferData, uint8 cnt,uint8 mode)
{
uint8 tmr;
uint8 errStatus = I2C_MSTR_NO_ERROR;
/* Determine whether or not to automatically generate a stop condition */
if(mode & I2C_MODE_NO_STOP)
{
/* Do not generate a Stop at the end of transfer */
I2C_mstrControl |= I2C_MSTR_NO_STOP;
}
else /* Generate a Stop */
{
I2C_mstrControl &= ~I2C_MSTR_NO_STOP;
}
if((I2C_State == I2C_SM_IDLE) || (I2C_State == I2C_SM_MSTR_HALT))
{
errStatus = I2C_MSTR_BUS_TIMEOUT;
if(I2C_State != I2C_SM_MSTR_HALT)
{
for(tmr = I2C_MSTR_TIMEOUT; tmr > 0; tmr--)
{
if((I2C_MCSR & I2C_MCSR_BUS_BUSY) == 0)
{
errStatus = I2C_MSTR_NO_ERROR;
break;
}
CyDelay(1); /* Wait 1 mSec */
}
}
else /* Bus halted waiting for restart */
{
errStatus = I2C_MSTR_NO_ERROR;
I2C_mstrStatus &= ~I2C_MSTAT_XFER_HALT;
CyIntClearPending(I2C_ISR_NUMBER);
}
/* If no timeout error, generate start */
if(errStatus == I2C_MSTR_NO_ERROR)
{
slaveAddr = (slaveAddr << 1);
I2C_State = I2C_SM_MSTR_WR_ADDR;
I2C_mstrWrBufPtr = xferData; /* Set buffer pointer */
I2C_mstrWrBufIndex = 0u; /* Start buffer at zero */
I2C_mstrWrBufSize = cnt; /* Set buffer size */
I2C_DATA = slaveAddr; /* Write address to data reg */
/* Generate a Start or ReStart depending on flag passed */
if(mode & I2C_MODE_REPEAT_START)
{
I2C_MCSR = I2C_MCSR_RESTART_GEN; /* Generate a ReStart */
}
else
{
I2C_MCSR = I2C_MCSR_START_GEN; /* Generate a Start */
}
CyIntEnable(I2C_ISR_NUMBER); /* IRQ must be enabled for this to work */
/* Clear write complete flag */
I2C_mstrStatus &= ~I2C_MSTAT_WR_CMPLT;
}
}
else
{
errStatus = I2C_MSTR_SLAVE_BUSY;
}
return(errStatus);
}
在I2C的主模式下,只有一个Slave地址,还一个REG_Addr在哪呢? |