📄 spi.c
字号:
#include <config.h>#include <hardware.h>#ifdef CFG_DRIVER_SPI#define SPI_CLK 5000000#define SPI_ID 13void spi_init( void) { static pio_t *pioa = PIOA_BASE; static pio_t *piob = PIOB_BASE; static spi_t *spi = SPI_BASE; static apmc_t *apmc; apmc = (apmc_t *)APMC_BASE; /* pio ... */ pioa->pdr = 0x0001ff80; piob->pdr = 0x020ff000; piob->bsr = 0x020ff000; /* open SPI clock */ apmc->pcer = (1 << SPI_ID); spi->cr = SWRST; spi->cr = SPIEN; spi->mr = PS | MSTR; spi->csr3 = (((ARM_CLK/SPI_CLK/2)<<8)&SCBR) | NCPHA; /* Setup the DataFlash card mode */ piob->codr = PIO(7); piob->oer = PIO(7); piob->per = PIO(7); /* Setup the SPI pins for the DataFlash card */ pioa->sodr = PIO(6); pioa->oer = PIO(6); pioa->per = PIO(6); pioa->pdr = PIO(3) | PIO(2) | PIO(1) | PIO(0);}void write_spi( char * spi_msg, int size) { static spi_t * spi = SPI_BASE; while (size--) { while (!(spi->sr & TDRE)); /* wait for previous transmission *//* printf("Writing 0x%x in spi->tdr.\n", (char)*spi_msg); */ spi->tdr = 0x00070000 | (0x000000ff & *spi_msg++); } while (!(spi->sr & TDRE)); /* wait for last transmission to finish */}void read_spi( char * spi_msg, int size) { static spi_t * spi = SPI_BASE; volatile unsigned long dummy; dummy = spi->rdr; /* clear the RDRF just in case */ while (size--) { write_spi(spi_msg, 1); while (!(spi->sr & RDRF)); /* wait for shift in done *//* printf("Reading 0x%x from spi->rdr.\n", (char)spi->rdr);*/ *spi_msg++ = spi->rdr; }}#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -