#include #include #include #include "LPC17xx.h" // SP0SPCR Bit-Definitions #define BitEn 2 #define CPHA 3 #define CPOL 4 #define MSTR 5 // SP0SPSR Bit-Definitions #define SPIF 7 // Defines for LPC1768 #define SPI_IODIR LPC_GPIO0->FIODIR #define SPI_SCK_PIN 15 /* Clock P0.15 out (PINSEL0) */ #define SPI_SSEL_PIN 16 /* Digital I/O Select P0.16 GPIO out (PINSEL1) */ #define SPI_MISO_PIN 17 /* from Card P0.17 in (PINSEL1) */ #define SPI_MOSI_PIN 18 /* to Card P0.18 out (PINSEL1) */ #define SPI_ASEL_PIN 19 /* Analog Out Select P0.19 GPIO out (PINSEL1) */ #define SPI_PINSEL LPC_PINCON->PINSEL1 #define SPI_SCK_FUNCMASK 0xC0000000 //(3 << 30) // P0.15 - PINSEL0 [31:30] #define SPI_SSEL_FUNCMASK 0x00000003 // (3 << 0) // P0.16 - PINSEL1 [1:0] #define SPI_MISO_FUNCMASK 0x0000000C // (3 << 2) // P0.17 - PINSEL1 [3:2] #define SPI_MOSI_FUNCMASK 0x00000030 // (3 << 4) // P0.18 - PINSEL1 [5:4] #define SPI_SCK_FUNCBIT (3 << 30) #define SPI_SSEL_FUNCBIT (0 << 0) // Note - SSEL needed as GPIO #define SPI_MISO_FUNCBIT (3 << 2) #define SPI_MOSI_FUNCBIT (3 << 4) #define SPI_PRESCALE_REG LPC_SPI->SPCCR //#define SCK_WAIT 100 // 3MHz PCLK //#define SCK_WAIT 50 // 6MHz PCLK #define SCK_WAIT 25 // 12MHz PCLK extern uint8_t Data[]; // SPI Slave 8-bit Initialize void SSPI1_Init8(void) { uint8_t i,tmp; LPC_SC->PCONP |= (1UL << 10); // Enable the SSP1 peripheral. LPC_SC->PCLKSEL0 &= ~(3UL << 20); // Select the clock required for SSP1... LPC_SC->PCLKSEL0 |= (1UL << 20); // ... must be at least 12x faster then slave clk coming in. LPC_PINCON->PINSEL0 &= ~(3UL << 14); // Connect pin SCK1 LPC_PINCON->PINSEL0 |= (2UL << 14); LPC_PINCON->PINSEL0 &= ~(3UL << 16); // Connect pin MISO1 LPC_PINCON->PINSEL0 |= (2UL << 16); LPC_PINCON->PINSEL0 &= ~(3UL << 12); // Connect pin SSEL1 LPC_PINCON->PINSEL0 |= (2UL << 12); LPC_PINCON->PINSEL0 &= ~(3UL << 18); // Connect pin MOSI1 LPC_PINCON->PINSEL0 |= (2UL << 18); // enable SPI mode with 8-bit transfers, CPOL = 0, CPHA = 0, No Prescale LPC_SSP1->CR0 = 0x707; LPC_SSP1->CPSR = 0; // enable SSP, Slave Mode, MISO Disabled LPC_SSP1->CR1 = 0x00E; for(i=0;i<=8;i++) tmp = (uint8_t)LPC_SSP1->DR; // Flush Buffer // Note Enable MISO before each transmission } // Slave Recieve four bytes void SPIRecv4(void) // Data In { uint8_t i, j; i = LPC_SPI->SPDR; for (i = 0; i < 4; i++) { for(j=0;jSPDR = 0xFF; while (!(LPC_SPI->SPSR & (1 << SPIF))); Data[3 - i] = LPC_SPI->SPDR; } } // SPI Master Initialize void SPIInit8(void) { // Turn on the power LPC_SC->PCONP |= (1<<8); // PCSPI // setup clock // LPC_SC->PCLKSEL0 &= ~(3<<16); // PCLK_SPI(00) = CCLK/4 = 3MHz LPC_SC->PCLKSEL0 |= (1<<16); // PCLK_SPI(01) = CCLK = = 12MHz // LPC_SC->PCLKSEL0 |= (1<<17); // PCLK_SPI(10) = CCLK/2 = 6MHz // LPC_SC->PCLKSEL0 |= (3<<16); // PCLK_SPI(11) = CCLK/8 = 1.5MHz // setup GPIO SPI_IODIR |= (1 << SPI_SCK_PIN) | (1 << SPI_MOSI_PIN); SPI_IODIR &= ~(1 << SPI_MISO_PIN); //// reset Pin-Functions // P0.15 set to SCK LPC_PINCON->PINSEL0 &= ~SPI_SCK_FUNCMASK; LPC_PINCON->PINSEL0 |= SPI_SCK_FUNCBIT; // P0.17, P0.18 set to MISI, MOSI SPI_PINSEL &= ~(SPI_MOSI_FUNCMASK | SPI_MISO_FUNCMASK); SPI_PINSEL |= (SPI_MOSI_FUNCBIT | SPI_MISO_FUNCBIT); // enable SPI-Master LPC_SPI->SPCR = (1 << MSTR) | (1 << CPOL) | (1 << CPHA); // LPC_SPI->SPCR = (1 << MSTR) | (0 << CPOL); // TODO: check CPOL } // Master Send (8-bit) uint8_t SPISend(uint8_t outgoing) { uint8_t incoming; LPC_SPI->SPDR = outgoing; while (!(LPC_SPI->SPSR & (1 << SPIF))); incoming = LPC_SPI->SPDR; return incoming; }