示例#1
0
/**************************************************************************************************
 * @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;
}
示例#2
0
/**************************************************************************************************
 * @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----------------------------------------*/