///////////////////////////////////////////////////////////////////////////////// /// SPIRead. /// Propósito: Lê um caractere serializado através do pino MISO<br> /// Entradas: Nenhuma<br> /// Saídas: char com o caractere lido do pino MISO /// ///////////////////////////////////////////////////////////////////////////////// char SPIRead(){ int i, b=0; for(i=7; i>=0; i--){ // para os 8 bits do caractere SetSCK(); // gera pulso de clock DelaySPI(10); // aguarda if(GetMISO()) b |= 1 << i ; // se o bit for alto, faz um OR DelaySPI(10); // lógico e seta o bit do resultado ClearSCK(); // mais um pulso de clock DelaySPI(10); // aguarda } return b; }
///////////////////////////////////////////////////////////////////////////////// /// SPIWrite. /// Propósito: Envia um caractere através do pino MOSI<br> /// Entradas: char dado, dado que será enviado<br> /// Saídas: Nenhuma /// /// \param [in] dado char que será enviado através do pino MOSI ///////////////////////////////////////////////////////////////////////////////// void SPIWrite(char dado){ int i; for(i=7; i>=0; i--){ // para os 8 bits do caractere if(dado & (1 << i )) // faz um AND com uma máscara // que se move até percorrer os 8 bits SetMOSI(); // seta o pino else // ou ClearMOSI(); // zera o pino DelaySPI(10); // aguarda e gera pulsos de clock SetSCK(); // para o dispositivo slave SPI DelaySPI(10); ClearSCK(); DelaySPI(10); } }
/**************************************************************************//** * @brief Performs the actual transfer of a byte * * @param[in] data actual data to be passed towards spi * * @return actual data to be received from spi *****************************************************************************/ uint8_t SPI_XferSpi(uint8_t _Data) { uint8_t l_Result; uint8_t l_Size; uint16_t delay_count; l_Result = 0; // ensure initialised to zero(0); // clock in/out data (LSB first) for (l_Size=8; l_Size; l_Size--) { // output data, NOTE: before falling edge of SCK so signals don't all change at same time if (_Data & 0x80) SetOutput(DOUT); else ClrOutput(DOUT); // falling edge of SCK and Data out ClearSCK(); #if defined(NRF52) // nrf_delay_us(1); // for(delay_count = 0; delay_count < 17; delay_count++) // { // __ASM volatile (" NOP\n"); // } #endif // prepare for next bit out/in _Data <<= 1; l_Result <<= 1; // rising edge of SCK to latch data SetSCK(); // read in data if (ReadInput(DIN)) l_Result |= 0x01; } return l_Result; }