//------------------------------------------------------------------------------ /// Interrupt handler for a TWI peripheral. Manages asynchronous transfer /// occuring on the bus. This function MUST be called by the interrupt service /// routine of the TWI peripheral if asynchronous read/write are needed. /// \param pTwid Pointer to a Twid instance. //------------------------------------------------------------------------------ void TWID_Handler(Twid *pTwid) { unsigned char status; AsyncTwi *pTransfer = (AsyncTwi *) pTwid->pTransfer; AT91S_TWI *pTwi = pTwid->pTwi; SANITY_CHECK(pTwid); // Retrieve interrupt status status = TWI_GetMaskedStatus(pTwi); // Byte received if (TWI_STATUS_RXRDY(status)) { pTransfer->pData[pTransfer->transferred] = TWI_ReadByte(pTwi); pTransfer->transferred++; // Transfer finished ? if (pTransfer->transferred == pTransfer->num) { TWI_DisableIt(pTwi, AT91C_TWI_RXRDY); TWI_EnableIt(pTwi, AT91C_TWI_TXCOMP); } // Last byte ? else if (pTransfer->transferred == (pTransfer->num - 1)) { TWI_Stop(pTwi); } } // Byte sent else if (TWI_STATUS_TXRDY(status)) { // Transfer finished ? if (pTransfer->transferred == pTransfer->num) { TWI_DisableIt(pTwi, AT91C_TWI_TXRDY); TWI_EnableIt(pTwi, AT91C_TWI_TXCOMP); TWI_SendSTOPCondition(pTwi); } // Bytes remaining else { TWI_WriteByte(pTwi, pTransfer->pData[pTransfer->transferred]); pTransfer->transferred++; } } // Transfer complete else if (TWI_STATUS_TXCOMP(status)) { TWI_DisableIt(pTwi, AT91C_TWI_TXCOMP); pTransfer->status = 0; if (pTransfer->callback) { pTransfer->callback((Async *) pTransfer); } pTwid->pTransfer = 0; } }
/** * \brief Interrupt handler for a TWI peripheral. Manages asynchronous transfer * occuring on the bus. This function MUST be called by the interrupt service * routine of the TWI peripheral if asynchronous read/write are needed. * \param pTwid Pointer to a Twid instance. */ void TWID_Handler( Twid *pTwid ) { uint8_t status; AsyncTwi *pTransfer ; Twi *pTwi ; assert( pTwid != NULL ) ; pTransfer = (AsyncTwi*)pTwid->pTransfer ; assert( pTransfer != NULL ) ; pTwi = pTwid->pTwi ; assert( pTwi != NULL ) ; /* Retrieve interrupt status */ status = TWI_GetMaskedStatus(pTwi); /* Byte received */ if (TWI_STATUS_RXRDY(status)) { pTransfer->pData[pTransfer->transferred] = TWI_ReadByte(pTwi); pTransfer->transferred++; /* check for transfer finish */ if (pTransfer->transferred == pTransfer->num) { TWI_DisableIt(pTwi, TWI_IDR_RXRDY); TWI_EnableIt(pTwi, TWI_IER_TXCOMP); } /* Last byte? */ else if (pTransfer->transferred == (pTransfer->num - 1)) { TWI_Stop(pTwi); } } /* Byte sent*/ else if (TWI_STATUS_TXRDY(status)) { /* Transfer finished ? */ if (pTransfer->transferred == pTransfer->num) { TWI_DisableIt(pTwi, TWI_IDR_TXRDY); TWI_EnableIt(pTwi, TWI_IER_TXCOMP); TWI_SendSTOPCondition(pTwi); } /* Bytes remaining */ else { TWI_WriteByte(pTwi, pTransfer->pData[pTransfer->transferred]); pTransfer->transferred++; } } /* Transfer complete*/ else if (TWI_STATUS_TXCOMP(status)) { TWI_DisableIt(pTwi, TWI_IDR_TXCOMP); pTransfer->status = 0; pTwid->pTransfer = 0; if (pTransfer->callback) { pTransfer->callback((Async *) pTransfer); } } }