void I2cISR (void) {  INT8U addFlag;    addFlag = 0;     switch (I2STAT)    {         case 0x00:                        //Bus Error has occured             I2CON = GENERATE_STOP;             break;         case 0x08:                        //(rep) Start condition transmitted         case 0x10:                        //Slave slvadd+R/W are transmitted             I2DAT = pMsg[cbyMsg]->slvadd;             I2CON = RELEASE_BUS_ACK;             break;         case 0x18:                        //SLA+W transmitted,ACK received DATA or STOP will be transmitted                                         //已经发送完了SLA+W,接下来开始发送第一个地址字节              addFlag = 1;              I2DAT =  pMsg[cbyMsg]->buf[cbyBuf];                 I2CON = RELEASE_BUS_ACK;                 break;         case 0x28:                        //DATA transmitted,ACK received DATA or STOP will be transmitted                                         //已经发送了I2DAT的一个字节,接下来再次发送I2DAT里的数据字节              if (addFlag == 1){               I2DAT = pMsg[cbyMsg]->buf[cbyBuf + 1];               I2CON = RELEASE_BUS_ACK;              } else {
              if (cbyBuf < pMsg[cbyMsg]->nrBytes) {      //一个信息里的字节还没有发送完,接着发送                 I2DAT = pMsg[cbyMsg]->buf[cbyBuf++];                     I2CON = RELEASE_BUS_ACK;             } else {                                   //发送下一个信息                 cbyMsg++;                 if (cbyMsg < nrMessage) {                     cbyBuf = 0;            //next message                     I2CON = RELEASE_BUS_STA;    //generate (rep)START                 } else {                     I2CON = GENERATE_STOP;                     drvStatus = I2C_OK;                 }                                   //end  if             }                                       //end  if               }                                       //end  if             break;         case 0x20:                      //发送完SLA+W,但未收到ACK,发送停止信号         case 0x48:                        //SLA+W/R transmitted NOT ACK received             drvStatus = I2C_NACK_ON_ADDRESS;        //driver finished             I2CON = GENERATE_STOP;             break;         case 0x30:                        //DATA transmitted,NOT ACK received             drvStatus = I2C_NACK_ON_DATA;             I2CON = GENERATE_STOP;             break;         case 0x38:                        //Arbitration lost in SLA+W or DATA             I2CON = RELEASE_BUS_STA;            //release bus,set STA             break;         case 0x40:                        //SLA+R transmitted,ACK received           if (pMsg[cbyMsg]->nrBytes == 1)                   I2CON = RELEASE_BUS_NOACK;        //NOT ACK on next byte               else                 I2CON = RELEASE_BUS_ACK;        //ACK on next byte             break;         case 0x50:                        //DATA received,ACK has been returned             pMsg[cbyMsg]->buf[cbyBuf++] = I2DAT;        //read next data             if (cbyBuf + 1 ==pMsg[cbyMsg]->nrBytes)        //next byte the lase?                 I2CON = RELEASE_BUS_NOACK;        //NO ACK on next byte             else                 I2CON = RELEASE_BUS_ACK;        //return ACK             break;         case 0x58:                        //DATA received, NOT ACK has been returned             pMsg[cbyMsg]->buf[cbyBuf] = I2DAT;        //read last data             cbyMsg++;             if (cbyMsg < nrMessage) {                 cbyBuf = 0;                //next message                 I2CON = RELEASE_BUS_STA;        //generate (rep)START                     } else {                 I2CON = GENERATE_STOP;                 drvStatus = I2C_OK;             }             break;         default:;     } }  
 |