/*! * \brief Writes a byte and reads the value * \param val Value to write. This value will be shifted out * \return The value shifted in */ static uint8_t SPI_WriteRead(uint8_t val) { uint8_t ch; while (SM1_GetCharsInTxBuf()!=0) {} /* wait until tx is empty */ while (SM1_SendChar(val)!=ERR_OK) {} /* send character */ while (SM1_GetCharsInTxBuf()!=0) {} /* wait until data has been sent */ while (SM1_GetCharsInRxBuf()==0) {} /* wait until we receive data */ while (SM1_RecvChar(&ch)!=ERR_OK) {} /* get data */ return ch; }
uint8_t HardwareSPI::transfer(uint8_t val) { uint8_t ch; while(SM1_GetCharsInTxBuf()!=0) {} /* wait until tx is empty */ while(SM1_SendChar(val)!=ERR_OK) {} /* send character */ while(SM1_GetCharsInTxBuf()!=0) {} /* wait until data has been sent */ while(SM1_GetCharsInRxBuf()==0) {} /* wait until we receive data */ while(SM1_RecvChar(&ch)!=ERR_OK) {} /* get data */ return ch; }
/* ** =================================================================== ** Method : SM1_RecvBlock (component SynchroMaster) ** Description : ** If any data received, this method returns the block of the ** data and its length (and incidental error), otherwise it ** returns error code (it does not wait for data). ** If less than requested number of characters is received only ** the available data is copied from the receive buffer to the ** user specified destination and the ERR_EXEMPTY value is ** returned. ** This method is available only if non-zero length of input ** buffer is defined. ** For information about SW overrun behavior please see ** <General info page>. ** Parameters : ** NAME - DESCRIPTION ** * Ptr - A pointer to the block of received data ** Size - The size of the block ** * Rcv - Pointer to a variable where an actual ** number of copied characters is stored ** Returns : ** --- - Error code, possible codes: ** ERR_OK - OK - The valid data is received. ** ERR_SPEED - This device does not work in ** the active speed mode. ** ERR_RXEMPTY - It was not possible to read ** requested number of bytes from the buffer. ** ERR_OVERRUN - Overrun error was detected ** from the last char or block received. If ** interrupt service is enabled, and input ** buffer allocated by the component is full, ** the component behaviour depends on <Input ** buffer size> property : if property is 0, ** last received data-word is preserved (and ** previous is overwritten), if property is ** greater than 0, new received data-word are ** ignored. ** ERR_FAULT - Fault error was detected from ** the last char or block received. In the ** polling mode the ERR_FAULT is return until ** the user clear the fault flag bit, but in ** the interrupt mode ERR_FAULT is returned ** only once after the fault error occured. ** This error is supported only on the CPUs ** supports the faul mode function - where ** <Fault mode> property is available. ** =================================================================== */ byte SM1_RecvBlock(SM1_TComData *Ptr,word Size,word *Rcv) { register word count; /* Number of received chars */ register byte Result = ERR_OK; /* Most serious error */ register byte ResultTmp; /* Last error */ count = 0U; while (count < Size) { ResultTmp = SM1_RecvChar(Ptr++); /* Receive one character */ if (ResultTmp > Result) { /* Is last error most serious than through error state? */ Result = ResultTmp; /* If yes then prepare error value to return */ } if ((ResultTmp != ERR_OK)&&(ResultTmp != ERR_OVERRUN)) { /* Receiving given number of chars */ break; /* Break data block receiving */ } count++; } *Rcv = count; /* Return number of received chars */ return Result; /* Return most serious error */ }