程序清单 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。