MM32F5375 SPI模块支持DMA请求,数据位宽可以设置1-32位
驱动lcd屏需要用到spi DMA请求,在发指令时需将数据位宽设置成8位,发显示数据将位宽设置成16位,spi频率设置37.5M
一.准备工作
1.mini-F5375-OB开发板
2.1.54’ spi屏
二.示例代码
1.spi配置:
GPIO\_InitTypeDef GPIO\_InitStruct;
SPI\_InitTypeDef SPI\_InitStruct;
RCC\_APB2PeriphClockCmd(RCC\_APB2Periph\_SPI1, ENABLE);
SPI\_StructInit(&SPI\_InitStruct);
SPI\_InitStruct.SPI\_Mode = SPI\_Mode\_Master;
SPI\_InitStruct.SPI\_DataSize = SPI\_DataSize\_32b;
SPI\_InitStruct.SPI\_DataWidth = 8;
SPI\_InitStruct.SPI\_CPOL = SPI\_CPOL\_Low;
SPI\_InitStruct.SPI\_CPHA = SPI\_CPHA\_1Edge;
SPI\_InitStruct.SPI\_NSS = SPI\_NSS\_Soft;
SPI\_InitStruct.SPI\_BaudRatePrescaler = SPI\_BaudRatePrescaler\_4;
SPI\_InitStruct.SPI\_FirstBit = SPI\_FirstBit\_MSB;
SPI\_Init(SPI1, &SPI\_InitStruct);
SPI\_DataSizeConfig(SPI1, 8);
SPI\_BiDirectionalLineConfig(SPI1, SPI\_Enable\_RX);
SPI\_BiDirectionalLineConfig(SPI1, SPI\_Enable\_TX);
RCC\_AHBPeriphClockCmd(RCC\_AHBPeriph\_GPIOA, ENABLE);
GPIO\_PinAFConfig(GPIOA, GPIO\_PinSource4, GPIO\_AF\_5); /* PA4 SPI\_NSS */
GPIO\_PinAFConfig(GPIOA, GPIO\_PinSource5, GPIO\_AF\_5); /* PA5 SPI\_SCK */
GPIO\_PinAFConfig(GPIOA, GPIO\_PinSource6, GPIO\_AF\_5); /* PA6 SPI\_MISO */
GPIO\_PinAFConfig(GPIOA, GPIO\_PinSource7, GPIO\_AF\_5); /* PA7 SPI\_MOSI */
GPIO\_StructInit(&GPIO\_InitStruct);
GPIO\_InitStruct.GPIO\_Pin = GPIO\_Pin\_4 | GPIO\_Pin\_5 | GPIO\_Pin\_7;
GPIO\_InitStruct.GPIO\_Speed = GPIO\_Speed\_High;
GPIO\_InitStruct.GPIO\_Mode = GPIO\_Mode\_AF\_PP;
GPIO\_Init(GPIOA, &GPIO\_InitStruct);
GPIO\_StructInit(&GPIO\_InitStruct);
GPIO\_InitStruct.GPIO\_Pin = GPIO\_Pin\_6;
GPIO\_InitStruct.GPIO\_Speed = GPIO\_Speed\_High;
GPIO\_InitStruct.GPIO\_Mode = GPIO\_Mode\_IPU;
GPIO\_Init(GPIOA, &GPIO\_InitStruct);
SPI\_Cmd(SPI1, ENABLE);
2.定义 CS, CD,和背光控制命令:
define LCDINTERFACE SPI1
define CMD 0
define DATA 1
define SETCS(s) \
do{ \
if(s) \
{ \
while (RESET == SPI\_GetFlagStatus(LCDINTERFACE, SPI\_FLAG\_TXEPT)); \
} \
SPI\_CSInternalSelected(LCDINTERFACE, s); \
}while(0)
define SETRES(s) \
do{ \
GPIO\_WriteBit(GPIOA, GPIO\_Pin\_3, s); \
}while(0)
define SETCMD(c) \
do{ \
while(RESET == SPI\_GetFlagStatus(LCDINTERFACE, SPI\_FLAG\_TXEPT)); \
GPIO\_WriteBit(GPIOA, GPIO\_Pin\_2, c); \
}while(0)
define SETBLK(s) \
do{ \
if(s) \
{ \
GPIO\_WriteBit(GPIOB, GPIO\_Pin\_1, 1); \
}else{ \
GPIO\_WriteBit(GPIOB, GPIO\_Pin\_1, 0); \
} \
}while(0)
3.LCD屏初始化:
//-------- Reset Sequence-----//
SETBLK(0);
sysDelayMs(50);
SETCS(ENABLE);
sysDelayMs(12);
SETRES(1);
sysDelayMs(12);
SETRES(0);
sysDelayMs(12);
SETRES(1);
sysDelayMs(20);
//------end Reset Sequence-----//
SPI\_DataSizeConfig(LCDINTERFACE, 8);
WriteComm(0x11);
sysDelayMs(20);
WriteComm(0x36); //Memory Data Access Control
WriteData(0x08);
WriteComm(0x3A); //Interface Pixel Format
WriteData(0x55); //MCU-16bit
WriteComm(0xB2); //Porch Setting
WriteData(0x0C); //Normal BP
WriteData(0x0C); //Normal FP
WriteData(0x00); //Enable Seperate
WriteData(0x33); //idle, BP[7:4], FP[3:0]
WriteData(0x33); //partial, BP[7:4], FP[3:0]
WriteComm(0xB7); //Gate Control
WriteData(0x70); //0x70,0x35,0x75 VGH=14.06V, VGL=-11.38
WriteComm(0xBB); //VCOMS Setting
WriteData(0x35); //0x35,0x3D Vcom=1.625V
WriteComm(0xC2);
WriteData(0x01);
WriteComm(0xC3); //VRH Set ???à¨?¨¨ 2?¨oy???????????
WriteData(0x19); //0x19 GVDD=4.8V
WriteComm(0xC4);
WriteData(0x20); //0x20 VDV, 0x20:0v
WriteComm(0xC6); //Frame Rate Control in Normal Mode
WriteData(0x0F); //0x0F:60Hz
WriteComm(0xD0); //Power Control 1
WriteData(0xA4);
WriteData(0xA1); //AVDD=6.8V, AVCL=-4.8V, VDS=2.3V
//-------------------GAMMA---------------------------
WriteComm(0xE0);
WriteData(0x70);
WriteData(0x06);
WriteData(0x0B);
WriteData(0x07);
WriteData(0x08);
WriteData(0x05);
WriteData(0x2B);
WriteData(0x43);
WriteData(0x42);
WriteData(0x06);
WriteData(0x14);
WriteData(0x15);
WriteData(0x29);
WriteData(0x2D);
WriteComm(0xE1);
WriteData(0x70);
WriteData(0x05);
WriteData(0x0B);
WriteData(0x06);
WriteData(0x07);
WriteData(0x05);
WriteData(0x2A);
WriteData(0x33);
WriteData(0x41);
WriteData(0x07);
WriteData(0x14);
WriteData(0x15);
WriteData(0x29);
WriteData(0x2C);
WriteComm(0x21);
WriteComm(0x2A); //Column Address Set
WriteData(0x00);
WriteData(0x00); //0
WriteData(0x00);
WriteData(0xEF); //239
WriteComm(0x2B); //Row Address Set
WriteData(0x00);
WriteData(0x00); //0
WriteData(0x00);
WriteData(0xEF); //239
WriteComm(0xd6);
WriteData(0xa1);
WriteComm(0x29);