/////////////////////////////////////////////////////////////////////////////////
/// 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);
	}
}
Пример #3
0
/**************************************************************************//**
 * @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;
}