114 lines
1.9 KiB
C

#include "iolpc2368.h"
#include "ucos_ii.h"
#include <stdlib.h>
#include "cpu.h"
#include "spi.h"
OS_EVENT *SpiLock = NULL;
unsigned char SpiExchange(unsigned char spi, unsigned char ch)
{
while(!SSP0SR_bit.TFE);
SSP0DR = ch;
while(SSP0SR_bit.BSY);
while(!SSP0SR_bit.RNE);
return SSP0DR;
}
void SpiInit(void)
{
// on spi power
PCONP_bit.PCSSP0 = 1;
// clk = cclk
PCLKSEL1_bit.PCLK_SSP0 = 1;
// pin select
PINSEL0_bit.P0_15 = 0x2;
PINSEL1_bit.P0_16 = 0x0; // FRAM CS
PINSEL4_bit.P2_10 = 0x0; // MFRC522 CS
PINSEL1_bit.P0_17 = 0x2;
PINSEL1_bit.P0_18 = 0x2;
PINMODE0_bit.P0_15 = 2;
PINMODE1_bit.P0_16 = 0; // FRAM CS
PINMODE4_bit.P2_10 = 0; // MFRC522 CS
PINMODE1_bit.P0_17 = 2;
PINMODE1_bit.P0_18 = 2;
// Chip select FRAM
FIO0MASK_bit.P0_16 = 0;
FIO0DIR_bit.P0_16 = 1;
FIO0SET_bit.P0_16 = 1;
// Chip select MFRC522
FIO2MASK_bit.P2_10 = 0;
FIO2DIR_bit.P2_10 = 1;
FIO2SET_bit.P2_10 = 1;
FIO0MASK_bit.P0_15 = 1;
FIO0MASK_bit.P0_17 = 1;
FIO0MASK_bit.P0_18 = 1;
SSP0CR0_bit.DSS = 7; // 8-bit
SSP0CR0_bit.FRF = 0; // spi
SSP0CR0_bit.SPO = 0;
SSP0CR0_bit.SPH = 0;
SSP0CR0_bit.SCR = 1;
SSP0CR1_bit.LBM = 0;
SSP0CR1_bit.SSE = 1;
SSP0CR1_bit.MS = 0; // master
SSP0CR1_bit.SOD = 0;
SSP0CPSR_bit.CPSDVSR = 8; // ~5 MHz
SSP0IMSC = 0;
SSP0DMACR = 0;
if (!SpiLock) SpiLock = OSSemCreate(1);
}
unsigned char spi_selectChip(unsigned char spi)
{
if (spi == FM25_SPI){
FIO0CLR_bit.P0_16 = 1;
}
else if (spi == MFRC522_SPI){
FIO2CLR_bit.P2_10 = 1;
}
return 0;
}
unsigned char spi_unselectChip(unsigned char spi)
{
if (spi == FM25_SPI){
FIO0SET_bit.P0_16 = 1;
}
else if (spi == MFRC522_SPI){
FIO2SET_bit.P2_10 = 1;
}
return 0;
}
void spi_getSem()
{
CPU_INT08U err;
do{
OSSemPend(SpiLock, 1, &err);
if (!err) break;
OSTimeDly(1);
}while (err);
}
void spi_freeSem()
{
OSSemPost(SpiLock);
}