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在哪呢?初学不懂,请高人指教。谢谢!! |   
     
  
 |