UPGRADE YOUR BROWSER

We have detected your current browser version is not the latest one. Xilinx.com uses the latest web technologies to bring you the best online experience possible. Please upgrade to a Xilinx.com supported browser:Chrome, Firefox, Internet Explorer 11, Safari. Thank you!

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
  • XPS IIC Bus Interface
このページをブックマークに追加