[活动] 【APM32F402R Micro-EVB开发板测评】3、硬件SPI驱动LCD

[复制链接]
 楼主| 穿西装的强子 发表于 2025-8-1 23:33 | 显示全部楼层 |阅读模式
  • 屏幕原理图

18259688cd39ab65d2.png
引脚接法
*SCL PB13    ————SPI2 SCK
*SDA PB15   ————SPI2 MOSI
*RES PB11
*DC PB2
*CS PB0
*BLK PC4

24855688cd41653fcf.png
  • 硬件SPI配置
使用SPI2的主机模式,8位数据,软件片选功能,SPI频率2分频,SPI2的主频是60MHz
72999688cd571166ed.png
  1. void DAL_SPI2_Config(void)
  2. {
  3.     hspi2.Instance = SPI2;
  4.         hspi2.Init.Mode = SPI_MODE_MASTER;
  5.     hspi2.Init.Direction = SPI_DIRECTION_2LINES;
  6.     hspi2.Init.DataSize = SPI_DATASIZE_8BIT;
  7.     hspi2.Init.CLKPolarity = SPI_POLARITY_LOW;
  8.     hspi2.Init.CLKPhase = SPI_PHASE_1EDGE;
  9.     hspi2.Init.NSS = SPI_NSS_SOFT;
  10.     hspi2.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2;
  11.     hspi2.Init.FirstBit = SPI_FIRSTBIT_MSB;
  12.     hspi2.Init.TIMode = SPI_TIMODE_DISABLE;
  13.     hspi2.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
  14.     hspi2.Init.CRCPolynomial = 0;

  15.     if (DAL_SPI_Init(&hspi2) != DAL_OK)
  16.     {
  17.         Error_Handler();
  18.     }
  19. }
  • SPI GPIO配置
  1. void DAL_SPI_MspInit(SPI_HandleTypeDef *hspi)
  2. {
  3.     GPIO_InitTypeDef GPIO_InitStruct = {0};

  4.     if (hspi->Instance == SPI1)
  5.     {
  6.         /* Enable SPI1 clock */
  7.         __DAL_RCM_SPI1_CLK_ENABLE();

  8.         /* Enable SPI1 GPIO clock */
  9.         __DAL_RCM_GPIOA_CLK_ENABLE();

  10.         /* Configure SPI1 NSS SCK MISO and MOSI pin */
  11.         GPIO_InitStruct.Pin = GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7;
  12.         GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  13.         GPIO_InitStruct.Pull = GPIO_NOPULL;
  14.         GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;

  15.         DAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
  16.     }

  17.     if (hspi->Instance == SPI2)
  18.     {
  19.         /* Enable SPI2 clock */
  20.         __DAL_RCM_SPI2_CLK_ENABLE();

  21.         /* Enable SPI2 GPIO clock */
  22.         __DAL_RCM_GPIOB_CLK_ENABLE();

  23.         /* Configure SPI2 NSS SCK MISO and MOSI pin */
  24.         GPIO_InitStruct.Pin = GPIO_PIN_12 | GPIO_PIN_13 | GPIO_PIN_14 | GPIO_PIN_15;
  25.         GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  26.         GPIO_InitStruct.Pull = GPIO_NOPULL;
  27.         GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;

  28.         DAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
  29.     }
  30. }
  • LCD的SPI驱动配置
这个地方必须要将读的Buff填进去,不能填NULL,不然无法正常发送数据。
  1. void SPI_WriteByte(u8 byte)
  2. {       
  3.         u8 buffer[100];
  4.         DAL_SPI_TransmitReceive(&hspi2, &byte, buffer, 1, 1000U);
  5. }
  1. #define        CS(stat) DAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,stat)
  2. #define        RES(stat) DAL_GPIO_WritePin(GPIOB,GPIO_PIN_11,stat)
  3. #define        DC(stat) DAL_GPIO_WritePin(GPIOB,GPIO_PIN_2,stat)
  4. #define        BLK(stat) DAL_GPIO_WritePin(GPIOC,GPIO_PIN_4,stat)

  1. void LCD_WR_REG(u8 Reg)         
  2. {       
  3.         CS(FALSE);
  4.         DC(FALSE);
  5.         SPI_WriteByte(Reg);
  6.         CS(TRUE);
  7. }
  1. void LCD_WR_DATA(u8 Data)
  2. {
  3.         CS(FALSE);

  4.         DC(TRUE);
  5.         SPI_WriteByte(Data);
  6.         CS(TRUE);
  7. }
将写寄存器和写数据配置完成后就可以刷屏了
可以看的出来,刷屏还是有点慢的,后面再改成DMA发送,这样刷屏会更快一点,还是慢的话就用SPI1+DMA,时钟频率更高点,速度会更快
peek_1.gif


星空魔法师 发表于 2025-8-4 19:45 | 显示全部楼层
非常详细的测评,感谢分享!硬件SPI驱动LCD的配置和引脚接法都很清晰,对于我们这些初学者来说很有帮助。
SpiritSong 发表于 2025-8-7 21:15 | 显示全部楼层
看到其他人的评测,这款LCD屏,如果使用DMA的方式,刷局部效果非常好,全屏的话,速率也能提升不少。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

61

主题

258

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部