#include #define SPI0_BASE 0xFFF01000UL #define GPI0_BASE 0xFF709000UL #define CTRLR0_OFFSET 0x00 #define CTRLR1_OFFSET 0x04 #define SSIENR_OFFSET 0x08 #define SER_OFFSET 0x10 #define BAUDR_OFFSET 0x14 #define SR_OFFSET 0x28 #define DR_OFFSET 0x60 // primo registro dati #define SR_BUSY (1 << 0) #define SR_TFNF (1 << 1) #define SR_TFE (1 << 2) #define TMOD_TX_ONLY (1 << 8) #define DFS_8BIT (0x07) // 8-bit frame size #define DFS_16BIT (0x0F) // 16-bit #define SPI_MODE0 (0 << 5) | (0 << 6) /// forse 6 e 7 ?? #define GPIO_DR 0x00 #define GPIO_DDR 0x04 #define GPIO_LED (1<<24) #define GPIO_SWITCH (1<<11) volatile uint32_t * const SPI0 = (volatile uint32_t *)SPI0_BASE; volatile uint32_t * const GPI0 = (volatile uint32_t *)GPI0_BASE; // tabella di 16 valori a 16 bit (esadecimali) static const uint16_t spi_data_table[16] = { 0x0000, 0x013C, 0x0242, 0x03A5, 0x0481, 0x05A5, 0x0699, 0x0742, 0x083C, 0x0900, 0x0A03, 0x0B07, 0x0C01, 0x0D01, 0x0E01, 0x0F00 }; void spi0_init(void) { // 1. Disabilita SPI per configurarlo SPI0[SSIENR_OFFSET/4] = 0; // 2. Configura CTRLR0: 8-bit, CPOL=0, CPHA=0, TX only SPI0[CTRLR0_OFFSET/4] = DFS_16BIT | TMOD_TX_ONLY | SPI_MODE0; // 3. Imposta baud rate (divisore) SPI0[BAUDR_OFFSET/4] = 500; // fSPI = fPCLK / 50 (≈ 1 MHz se PCLK=50 MHz) // 4. Seleziona slave 0 SPI0[SER_OFFSET/4] = 0x1; // bit0 = CS0 attivo // 5. Abilita SPI SPI0[SSIENR_OFFSET/4] = 1; } void gpi0_init(void) { GPI0[GPIO_DDR/4] = GPIO_LED | GPIO_SWITCH; // Configuro i GPIO come uscite GPI0[GPIO_DR/4] = GPIO_LED ; // accendo il led e lo switch a 0 } void spi0_send16(uint16_t data) { // Attende spazio nel TX FIFO while (!(SPI0[SR_OFFSET/4] & SR_TFNF)); // Scrive nel registro dati (avvia trasmissione) SPI0[DR_OFFSET/4] = data; // Attende fine trasmissione while (SPI0[SR_OFFSET/4] & SR_BUSY); } int main(void) { int i,j; printf("INIT SPI\n"); spi0_init(); printf("INIT GPIO\n"); gpi0_init(); while(1){ // Invio dei 16 valori a 16 bit for (i = 0; i < 16; i++) { spi0_send16(spi_data_table[i]); //printf("%d\n",i); //for (j = 0; j < 10000; j++); // piccolo delay opzionale } } // Disabilita SPI (opzionale) SPI0[SSIENR_OFFSET/4] = 0; return 0; }