SylixOS iMX6平台I2C总线驱动(5)

程序清单 310 __i2cTransferWaitOpDone的具体实现

static INT  __i2cTransferWaitOpDone (UINT  uiChannel, INT  iIsTx) {     ……     /*      *  Loop until we get an interrupt      *  (循环等待,直到我们得到一个中断,若没有产生中断,返回-10)      */     while (!(readw(REG_I2C_I2SR(uiChannel)) & IIF) && (--i > 0));     if (i <= 0) {         printk("I2C Error: timeout unexpected\n");         return (ERR_NO_IIF);     }     /*      *  Clear the interrupts      *  (清除中断位)       */     ……     /*      *  Check for arbitration lost      *  (检查仲裁位,产生1为仲裁丢失,返回-3)      */     if (readw(REG_I2C_I2SR(uiChannel)) & IAL) {         printk("Error  Arbitration lost\n");         return (ERR_IAL_LOST);     }     /*      *  Check for ACK received in transmit mode      *  (传输模式中检查是否收到ACK)      */     if (iIsTx) {                                                        /*  iIsTx参数传入为1            */         if (readw(REG_I2C_I2SR(uiChannel)) & RXAK) {             /*              * 没有收到ACK,清除MSTA位使其停止传输              */             printk("Error no ack received\n");             __i2cTransferStop(uiChannel);                               /*  停止 / 将主从模式位设置为0  */             return (ERR_NO_ACK);         }     }     …… }

__i2cTransferRxBytes的具体实现

如程序清单 311所示。

程序清单 311 __i2cTransferRxBytes的具体实现

static INT  __i2cTransferRxBytes (UINT8  *pChar,                               UINT    uiChannel,                               INT     iSize) {     ……     /*      *  等待传输完成      */     for (i = 0; iSize > 0; iSize--, i++) {         if (__i2cTransferWaitOpDone(uiChannel, 0) != 0) {             return (PX_ERROR);         }         /*          *  接下来的两个if指令设置为下一个读取控制寄存器的值          *  若iSize == 1则此次为最后一次且已完成传输(清除MSTA位)          *  若iSize == 2则下次为最后一次传输,不发送ACK信号(禁止TXAK位)          */         ……         /*          *  真正开始读取数据          */         pChar[i] = readw(REG_I2C_I2DR(uiChannel));     }     …… }

__i2cTransferStop的具体实现

__i2cTransferStop函数设置I2C控制器为从模式(释放总线)。

__i2cTransferDisable的具体实现

__i2cTransferDisable函数失能I2C。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/fe08012c725cebb94d15d7ae4ab6785b.html