/*
* =============================================================================
* SPI.C
*
* DESCRICAO: driver de SPI
* envia e recebe pela SPI escolhida em um mesmo comando.
* CPOL, CPHA e CLK escolhidos na inicializacao.
* AUTOR: Tiago Butzke dos Santos
* DATA DE CRIACAO: 2010/03
* DISPOSITIVO: LPC2388
* PLACA: MCB2300
*
* =============================================================================
*/
#include "spi.h"
void SPI_Ini(unsigned char pcClock, unsigned char pcCPol, unsigned char pcCPha) {
PCONP |= (1 << 8); //habilita SPI
S0SPCR = (0x20) | (pcCPol << 4) | (pcCPha << 3); //spi modo mestre, 8 bits
switch (pcClock) {
case cSPI_200KHz:
case cSPI_150KHz:
PCLKSEL0 |= (cHD_CCLK2 << 16); //seleciona clock
break;
case cSPI_100KHz:
case cSPI_36KHz:
PCLKSEL0 |= (cHD_CCLK4 << 16); //seleciona clock
break;
case cSPI_22500Hz:
case cSPI_15625Hz:
case cSPI_7500Hz:
PCLKSEL0 |= (cHD_CCLK8 << 16); //seleciona clock
break;
default:
PCLKSEL0 |= (cHD_CCLK << 16); //seleciona clock
break;
}
S0SPCCR = pcClock; //seleciona o divisor de clock
PINSEL0 |= (0x3 << 30); //configura pinos da spi
PINSEL1 |= 0x3C; //ssel desabilitado
FIO0DIR0 |= 0x80; //define SCLK como saida
FIO0DIR1 |= (1 << 2); //define MOSI como saida
PINSEL8 &= ~(0x3 << 16);
FIO0DIR0 |= 0x30; //define SSEL nos pinos P0.4, P0.5
FIO0DIR2 |= 0x01; //define SSEL no pino P0.16
cSPI_SS1DESATIVA;
cSPI_SS2DESATIVA;
cSPI_SSMDESATIVA;
}
unsigned char SPI_Escreve(unsigned char pcDado, unsigned char pcEscravo, unsigned char pcUltimo) {
switch (pcEscravo) {
case cSPI_ESCRAVO1:
cSPI_SS1ATIVA;
break;
case cSPI_ESCRAVO2:
cSPI_SS2ATIVA;
break;
case cSPI_ESCRAVOMODEM:
cSPI_SSMATIVA;
break;
}
S0SPDR = pcDado; //envia dado
while (cSPI_TRANSMITINDO) { //espera fim da transmissao
//HD_WdtFeed();
}
if (pcUltimo) {
switch (pcEscravo) {
case cSPI_ESCRAVO1:
cSPI_SS1DESATIVA;
break;
case cSPI_ESCRAVO2:
cSPI_SS2DESATIVA;
break;
case cSPI_ESCRAVOMODEM:
cSPI_SSMDESATIVA;
break;
}
}
return S0SPDR; //retorna dado recebido
}
/*
#define GetRegPage(addr) (0x80 | (addr>>3))
unsigned char MFRC_Le(unsigned char pAddress) {
SPI_Escreve(0x00, 0);
SPI_Escreve(GetRegPage(pAddress), 0); // seleciona a página do registrador a ser lido
pAddress <<= 1;
pAddress |= 0x80;
pAddress &= 0xFE;
SPI_Escreve(pAddress, 0);
return SPI_Escreve(0x00, 1);
}
unsigned char Get_Key_Status(unsigned char pCmd) {
unsigned char vcRetCmd = 0x00;
unsigned char CRC = 0x00;
//while(SPI_DRDY == 0);
SPI_Escreve(pCmd, 0);
Delay(25);
//while(SPI_DRDY == 0);
vcRetCmd = SPI_Escreve(0x00, 0);
Delay(25);
//while(SPI_DRDY == 0);
CRC = SPI_Escreve(0x00, 1);
Delay(25);
return vcRetCmd;
}
*/