引脚接法
*SCL PB13 ————SPI2 SCK
*SDA PB15 ————SPI2 MOSI
*RES PB11
*DC PB2
*CS PB0
*BLK PC4
使用SPI2的主机模式,8位数据,软件片选功能,SPI频率2分频,SPI2的主频是60MHz
void DAL_SPI2_Config(void)
{
hspi2.Instance = SPI2;
hspi2.Init.Mode = SPI_MODE_MASTER;
hspi2.Init.Direction = SPI_DIRECTION_2LINES;
hspi2.Init.DataSize = SPI_DATASIZE_8BIT;
hspi2.Init.CLKPolarity = SPI_POLARITY_LOW;
hspi2.Init.CLKPhase = SPI_PHASE_1EDGE;
hspi2.Init.NSS = SPI_NSS_SOFT;
hspi2.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2;
hspi2.Init.FirstBit = SPI_FIRSTBIT_MSB;
hspi2.Init.TIMode = SPI_TIMODE_DISABLE;
hspi2.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
hspi2.Init.CRCPolynomial = 0;
if (DAL_SPI_Init(&hspi2) != DAL_OK)
{
Error_Handler();
}
}
void DAL_SPI_MspInit(SPI_HandleTypeDef *hspi)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
if (hspi->Instance == SPI1)
{
/* Enable SPI1 clock */
__DAL_RCM_SPI1_CLK_ENABLE();
/* Enable SPI1 GPIO clock */
__DAL_RCM_GPIOA_CLK_ENABLE();
/* Configure SPI1 NSS SCK MISO and MOSI pin */
GPIO_InitStruct.Pin = GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
DAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}
if (hspi->Instance == SPI2)
{
/* Enable SPI2 clock */
__DAL_RCM_SPI2_CLK_ENABLE();
/* Enable SPI2 GPIO clock */
__DAL_RCM_GPIOB_CLK_ENABLE();
/* Configure SPI2 NSS SCK MISO and MOSI pin */
GPIO_InitStruct.Pin = GPIO_PIN_12 | GPIO_PIN_13 | GPIO_PIN_14 | GPIO_PIN_15;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
DAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
}
}
这个地方必须要将读的Buff填进去,不能填NULL,不然无法正常发送数据。
void SPI_WriteByte(u8 byte)
{
u8 buffer[100];
DAL_SPI_TransmitReceive(&hspi2, &byte, buffer, 1, 1000U);
}
#define CS(stat) DAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,stat)
#define RES(stat) DAL_GPIO_WritePin(GPIOB,GPIO_PIN_11,stat)
#define DC(stat) DAL_GPIO_WritePin(GPIOB,GPIO_PIN_2,stat)
#define BLK(stat) DAL_GPIO_WritePin(GPIOC,GPIO_PIN_4,stat)
void LCD_WR_REG(u8 Reg)
{
CS(FALSE);
DC(FALSE);
SPI_WriteByte(Reg);
CS(TRUE);
}
void LCD_WR_DATA(u8 Data)
{
CS(FALSE);
DC(TRUE);
SPI_WriteByte(Data);
CS(TRUE);
}
将写寄存器和写数据配置完成后就可以刷屏了
可以看的出来,刷屏还是有点慢的,后面再改成DMA发送,这样刷屏会更快一点,还是慢的话就用SPI1+DMA,时钟频率更高点,速度会更快
|