1 | #include "LPC214X.H" /* LPC214x definitions */
|
2 |
|
3 | #define SPI_SEL 0x00100000
|
4 |
|
5 | /* SPI and MMC commands related modules. */
|
6 | void SPI_Init( void )
|
7 | {
|
8 | unsigned long portConfig;
|
9 | volatile unsigned char i, Dummy;
|
10 |
|
11 | SSPCR1 = 0x00; /* SSP master (off) in normal mode */
|
12 | portConfig = PINSEL1;
|
13 | PINSEL1 = portConfig | 0x02A8;
|
14 | IODIR0 = SPI_SEL; /* SSEL is output */
|
15 | IOSET0 = SPI_SEL; /* set SSEL to high */
|
16 | VPBDIV = 0x04;
|
17 | /* Set data to 8-bit, Frame format SPI, CPOL = 0, CPHA = 1, and SCR is 7 */
|
18 | SSPCR0 = 0x0787; // CPHA = 1;
|
19 | SSPCPSR = 0x20; /* SSPCPSR clock prescale register */
|
20 | SSPCR1 = 0x02; /* Device select as master, SSP Enabled, normal operational mode */
|
21 |
|
22 | for ( i = 0; i < 8; i++ )
|
23 | {
|
24 | Dummy = SSPDR; /* clear the RxFIFO */
|
25 | }
|
26 | return;
|
27 | }
|
28 |
|
29 | /* SPI Send a block of data based on the length */
|
30 | void SPI_Send( unsigned char *buf, unsigned long Length )
|
31 | {
|
32 | volatile unsigned char Dummy;
|
33 |
|
34 | if (Length == 0 ) return;
|
35 | while ( Length != 0 )
|
36 | {
|
37 | while ((SSPSR & 0x02) == 0); /* wait if SPI transmit buffer full */
|
38 | SSPDR = *buf;
|
39 | while ( !(SSPSR & 0x04) ); /* Wait until the Busy bit is cleared */
|
40 | Dummy = SSPDR; /* Flush the RxFIFO */
|
41 | Length--;
|
42 | buf++;
|
43 | }
|
44 | return;
|
45 | }
|
46 |
|
47 |
|
48 | unsigned char SPI_ReceiveByte( void )
|
49 | {
|
50 | unsigned char data;
|
51 |
|
52 | SSPDR = 0xFF; // Write
|
53 | while (((SSPSR & 0x10) != 0) ); // wait until busy flag is cleared
|
54 | data = SSPDR;
|
55 | return ( data );
|
56 | }
|
57 |
|
58 |
|
59 | /* SPI receives a block of data based on the length */
|
60 | void SPI_Receive(unsigned char *buf, unsigned long Length)
|
61 | {
|
62 | unsigned long i;
|
63 | volatile unsigned char a;
|
64 |
|
65 | /* clear input buffer has no effect
|
66 | volatile unsigned char Dummy;
|
67 | for ( i = 0; i < 8; i++ )
|
68 | {
|
69 | Dummy = SSPDR; //clear the RxFIFO
|
70 | }
|
71 | */
|
72 |
|
73 | for (i = 0; i < Length; i++ )
|
74 | {
|
75 | *buf = SPI_ReceiveByte();
|
76 | buf++;
|
77 | }
|
78 | return;
|
79 | }
|
80 |
|
81 |
|
82 | void Delay(unsigned long Delay)
|
83 | {
|
84 | volatile unsigned long i;
|
85 |
|
86 | i= Delay*30;
|
87 | while ((i--) > 0);
|
88 | }
|
89 |
|
90 |
|
91 | int main(void)
|
92 | {
|
93 | unsigned char OutBuf[] = {0x24,0x02,0x02,0xAA,0xBB,0xCC};
|
94 | unsigned char InBuf[20];
|
95 | int i;
|
96 |
|
97 | SPI_Init();
|
98 | while (1==1)
|
99 | {
|
100 | for (i=0;i<20;i++)
|
101 | InBuf[i] = 0;
|
102 |
|
103 | SPI_Send(OutBuf,6);
|
104 | Delay(50000UL);
|
105 | SPI_Receive(InBuf,9);
|
106 | Delay(1000);
|
107 | }
|
108 | }
|