SPI是串行外设接口(SerialPeripheral Interface)的缩写。SPI,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为PCB的布局上节省空间,提供方便,正是出于这种简单易用的特性,如今越来越多的芯片集成了这种通信协议。 现在很多MCU都集成了SPI模块了,这里我就用硬件SPI+DMA刷个屏幕,用到的寄存器不多。用到了SPI_C1,SPI_C2,SPI_C3,SPI_BR这几个寄存器。 首先是打开SPI配置部分,代码如下: void vfnSPI8_Init(void) { SIM_SCGC4|= SIM_SCGC4_SPI1_MASK; SIM_SCGC5|= SIM_SCGC5_PORTE_MASK; /*SPI1_CLK = PTE2 = ALT2 */ PORTE_PCR2= PORT_PCR_MUX(0x02)|PORT_PCR_DSE_MASK; /*SPI1_CS0 = PTE4 = ALT2 */ PORTE_PCR4= PORT_PCR_MUX(0x02); /*SPI1_MOSI = PTE1 = ALT2 */ PORTE_PCR1= PORT_PCR_MUX(0x02)|PORT_PCR_DSE_MASK; /*SPI1_MISO = PTE3 = ALT2*/ PORTE_PCR3= PORT_PCR_MUX(0x02); SPI_C1|= SPI_C1_MSTR_MASK | SPI_C1_SSOE_MASK |SPI_C1_CPOL_MASK|SPI_C1_CPHA_MASK; SPI_C2|= SPI_C2_MODFEN_MASK|SPI_C2_TXDMAE_MASK|SPI_C2_RXDMAE_MASK;// SPI_C3 |= SPI_C3_FIFOMODE_MASK; /*SPI_BAUD = BUS_CLK / ((SPPR+1)x 2^(SPR+1)) */ /*SPI_BAUD = 24Mhz / (6x(2^(1)))*/ /*SPI_BAUD = 1Mhz */ SPI_BR= SPI_BR_SPPR(SPI_BAUDRATE_PRESCALER) | SPI_BR_SPR(SPI_BAUDRATE_DIVISOR); } 第一步是打开SPI时钟和PORTE脚时钟,用的是3线的SPI,SCLK脚是PORTE2,MOSI是PORTE1,还有DC(命令/数据控制端)用到了PORTE5脚,RST脚用PORTE6脚。 接下来就是SPI模块参数的配置。把通过SPI_C1寄存器配置成主模式,空闲时SCLK是低电平。如手册的截图: 通过SPI_C2寄存器配置成DMA模式,如手册的截图: 接着打开DMA通道,然后配置FIFO模式,最后设置波特率。 波特率的计算公式: 波特率寄存器的相关的说明: 然后接下来就是DMA的配置,这里我就不多说了,只要配置好原地址,目的地址,传输的字节数就可以了。 下面放出测试图:
|