00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include "at91sam7s64.h"
00023 #include "global.h"
00024 #include "spi.h"
00025
00026 #ifndef SPI_SCKDIV
00027 #define SPI_SCKDIV 2
00028 #endif
00029
00030 void spiInit(void)
00031 {
00032
00033 AT91C_BASE_PMC->PMC_PCER = (1<<AT91C_ID_SPI);
00034
00035
00036 *AT91C_PIOA_ASR = AT91C_PA12_MISO|AT91C_PA13_MOSI|AT91C_PA14_SPCK;
00037 *AT91C_PIOA_PDR = AT91C_PA12_MISO|AT91C_PA13_MOSI|AT91C_PA14_SPCK;
00038 *AT91C_PIOA_PPUER = AT91C_PA12_MISO|AT91C_PA13_MOSI|AT91C_PA14_SPCK;
00039
00040
00041
00042
00043
00044
00045 *AT91C_SPI_CR = AT91C_SPI_SPIEN | AT91C_SPI_SWRST;
00046 *AT91C_SPI_CR = AT91C_SPI_SPIEN;
00047
00048
00049
00050
00051
00052 *AT91C_SPI_MR = AT91C_SPI_MODFDIS | AT91C_SPI_PS_VARIABLE | AT91C_SPI_MSTR;
00053
00054
00055
00056 AT91C_SPI_CSR[0] = AT91C_SPI_NCPHA|AT91C_SPI_BITS_8|(SPI_SCKDIV<<8);
00057 AT91C_SPI_CSR[1] = AT91C_SPI_NCPHA|AT91C_SPI_BITS_8|(SPI_SCKDIV<<8);
00058 AT91C_SPI_CSR[2] = AT91C_SPI_NCPHA|AT91C_SPI_BITS_8|(SPI_SCKDIV<<8);
00059 AT91C_SPI_CSR[3] = AT91C_SPI_NCPHA|AT91C_SPI_BITS_8|(SPI_SCKDIV<<8);
00060 }
00061
00062 u08 spiTransferByte(u08 data)
00063 {
00064
00065 while(!(*AT91C_SPI_SR & AT91C_SPI_TDRE));
00066
00067 *AT91C_SPI_TDR = data;
00068
00069 while(!(*AT91C_SPI_SR & AT91C_SPI_RDRF));
00070
00071 return *AT91C_SPI_RDR;
00072 }
00073
00074 u16 spiTransfer16(u16 data)
00075 {
00076
00077 while(!(*AT91C_SPI_SR & AT91C_SPI_TDRE));
00078
00079 *AT91C_SPI_TDR = data;
00080
00081 while(!(*AT91C_SPI_SR & AT91C_SPI_RDRF));
00082
00083 return *AT91C_SPI_RDR;
00084 }
00085
00086 u32 spiTransfer32(u32 data)
00087 {
00088 u32 rxdata;
00089
00090
00091 while(!(*AT91C_SPI_SR & AT91C_SPI_TDRE));
00092
00093 *AT91C_SPI_TDR = data>>16;
00094
00095 while(!(*AT91C_SPI_SR & AT91C_SPI_RDRF));
00096
00097 rxdata = (*AT91C_SPI_RDR&0xFFFF)<<16;
00098
00099 *AT91C_SPI_TDR = data;
00100
00101 while(!(*AT91C_SPI_SR & AT91C_SPI_RDRF));
00102
00103 rxdata |= (*AT91C_SPI_RDR&0xFFFF);
00104
00105 return rxdata;
00106 }
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119