AR# 42412

13.1 EDK, XPS_IIC - プロトコルが異常終了した場合に、ドライバーのコード例では Tx FIFO がフラッシュされない

説明

xps_iic のデータシートには、プロトコルが異常終了した場合は常に Tx_FIFO がクリアされる必要があると記載されていますが、コード例はこれに従っていません。その結果、Tx_FIFO のデータが破損し、バスで不正な IIC トランザクションが実行される可能性があります。

ソリューション

FIFO をリセットして、上述のような状況を回避するには、コード例の EepromWriteByte ファンクションに次の変更が必要です。

送信前 ACK ポーリング :
/*
* Set the address register to the specified address by writing
* the address to the device, this must be tried until it succeeds
* because a previous write to the device could be pending and it
* will not ack until that write is complete.
*/
do {
SentByteCount = XIic_Send(IIC_BASE_ADDRESS,EepromIicAddr, (u8 *)&Address, sizeof(Address),XIIC_STOP);
if (SentByteCount != sizeof(Address)) {
//send aborted. reset Tx_FIFO
XIic_WriteReg(IIC_BASE_ADDRESS, XIIC_CR_REG_OFFSET,XIIC_CR_TX_FIFO_RESET_MASK);
XIic_WriteReg(IIC_BASE_ADDRESS, XIIC_CR_REG_OFFSET, XIIC_CR_ENABLE_DEVICE_MASK);
//poll_cnt0++;
}

} while (SentByteCount != sizeof(Address));


送信後 ACK ポーリング :
/*
* Wait for the write to be complete by trying to do a write and
* the device will not ack if the write is still active.
*/
do {
AckByteCount = XIic_Send(IIC_BASE_ADDRESS, EepromIicAddr, (u8 *)&Address, sizeof(Address), XIIC_STOP);
if (AckByteCount != sizeof(Address)) {
//send aborted. reset Tx_FIFO
XIic_WriteReg(IIC_BASE_ADDRESS, XIIC_CR_REG_OFFSET, XIIC_CR_TX_FIFO_RESET_MASK);
XIic_WriteReg(IIC_BASE_ADDRESS, XIIC_CR_REG_OFFSET, XIIC_CR_ENABLE_DEVICE_MASK);
//poll_cnt1++;
}

} while (AckByteCount != sizeof(Address));

AR# 42412
日付 05/19/2012
ステータス アクティブ
種類 既知の問題
IP