spi.c

来自「开发三星s3c44b0引导程序」· C语言 代码 · 共 70 行

C
70
字号
#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 + =
减小字号Ctrl + -
显示快捷键?