/************************************************************************************************** * @fn npSpiRxIsr * * @brief This function handles the DMA Rx complete interrupt. * * input parameters * * None. * * output parameters * * None. * * @return None. ************************************************************************************************** */ void HalSpiRxIsr(void) { uint8 type = halSpiBuf[1] & RPC_CMD_TYPE_MASK; uint8 *pBuf, rdy = 1; NP_SPI_ASSERT(halSpiState == NP_SPI_WAIT_RX); switch (type) { case RPC_CMD_AREQ: // call client with message type so it can schedule an OSAL event // ISN'T THIS PROBLEMATIC? IF THE BUFFER HASN'T BEEN COPIED, OR THE DMA // POINTER CHANGED, WHAT'S TO STOP THE MASTER FROM SENDING ANOTHER AREQ? // THE STATE MIGHT CAUSE AN ASSERT, BUT THIS DOESN'T SEEM LIKE THE RIGHT // SOLUTION. HAL_SPI_DBG_LOG(0x12); npSpiReqCallback( RPC_CMD_AREQ ); halSpiState = NP_SPI_WAIT_AREQ; break; case RPC_CMD_SREQ: // synchronous request received, so need to send back a synchronous reply // call client with message type so it can schedule an OSAL event HAL_SPI_DBG_LOG(0x13); npSpiReqCallback( RPC_CMD_SREQ ); halSpiState = NP_SPI_WAIT_TX; rdy = 0; // keep SRDY asserted until SRSP is ready to be sent, then deassert so master can read back SRSP break; case RPC_CMD_POLL: // callback to assign pBuf with AREQ to send from slave // Note: this AREQ was already queued by the slave when it wanted to send // an asynchronous command to the master by asserting SRDY. HAL_SPI_DBG_LOG(0x14); if ( (pBuf = npSpiPollCallback()) == NULL ) { // nothing was queued, which is odd, so just send an empty frame? halSpiBuf[0] = 0; halSpiBuf[1] = 0; halSpiBuf[2] = 0; pBuf = halSpiBuf; } halSpiState = NP_SPI_WAIT_TX; DMA_TX(pBuf); break; default: HAL_SPI_DBG_LOG(0x15); halSpiState = NP_SPI_IDLE; break; } NP_RDYOut = rdy; }
/************************************************************************************************** * @fn npSpiSRspReady * * @brief This function is called by MT to notify SPI driver that an SRSP is ready to Tx. * * input parameters * * @param pBuf - Pointer to the buffer to transmit on the SPI. * * output parameters * * None. * * @return None. ************************************************************************************************** */ void npSpiSRspReady(uint8 *pBuf) { volatile uint8 i = 1; HAL_SPI_DBG_LOG(0x03); if ((halSpiState == NP_SPI_WAIT_TX) && (NP_RDYOut == 0)) { HAL_SPI_DBG_LOG(0x04); DMA_TX( pBuf ); NP_RDYOut = 1; } else { while(i); } }
void SENDDATA(float Value, uint8_t* TxAddr, uint8_t channel) { uint8_t* Data = (uint8_t*)&Value; TxAddr[0] = 0xFF; switch (channel) { case 0: TxAddr[1] = 0xF0; break; case 1: TxAddr[1] = 0xF1; break; case 2: TxAddr[1] = 0xF2; break; case 3: TxAddr[1] = 0xF3; break; case 4: TxAddr[1] = 0xF4; break; case 5: TxAddr[1] = 0xF5; break; case 6: TxAddr[1] = 0xF6; break; } TxAddr[2] = Data[0]; TxAddr[3] = Data[1]; TxAddr[4] = Data[2]; TxAddr[5] = Data[3]; TxAddr[6] = 0xFE; DMA_TX(); }/*--------------------------------End of SENDDATA functions----------------------------------------*/