硬汉嵌入式论坛

 找回密码
 立即注册
查看: 2577|回复: 3
收起左侧

[STM32H7] SPI LCD Ili9488驱动问题

[复制链接]

2

主题

1

回帖

7

积分

新手上路

积分
7
发表于 2021-12-25 16:13:53 | 显示全部楼层 |阅读模式
硬汉哥以及各位大佬,你们好,我目前在用STM32H750驱动一个SPI接口的LCD ili9488,目前驱动起来会一直卡在while (__HAL_SPI_GET_FLAG(bsp_lcd_manager.spi_port, SPI_FLAG_RXNE ) == RESET);语句中

跪求帮助,
代码如下:
  1. static void MX_SPI4_Init(void)
  2. {

  3.   /* USER CODE BEGIN SPI4_Init 0 */

  4.   /* USER CODE END SPI4_Init 0 */

  5.   /* USER CODE BEGIN SPI4_Init 1 */

  6.   /* USER CODE END SPI4_Init 1 */
  7.   /* SPI4 parameter configuration*/
  8.   hspi4.Instance = SPI4;
  9.   hspi4.Init.Mode = SPI_MODE_MASTER;
  10.   hspi4.Init.Direction = SPI_DIRECTION_2LINES;
  11.   hspi4.Init.DataSize = SPI_DATASIZE_8BIT;
  12.   hspi4.Init.CLKPolarity = SPI_POLARITY_LOW;
  13.   hspi4.Init.CLKPhase = SPI_PHASE_1EDGE;
  14.   hspi4.Init.NSS = SPI_NSS_SOFT;
  15.   hspi4.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_8;
  16.   hspi4.Init.FirstBit = SPI_FIRSTBIT_MSB;
  17.   hspi4.Init.TIMode = SPI_TIMODE_DISABLE;
  18.   hspi4.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
  19.   hspi4.Init.CRCPolynomial = 0x0;
  20.   hspi4.Init.NSSPMode = SPI_NSS_PULSE_ENABLE;
  21.   hspi4.Init.NSSPolarity = SPI_NSS_POLARITY_LOW;
  22.   hspi4.Init.FifoThreshold = SPI_FIFO_THRESHOLD_01DATA;
  23.   hspi4.Init.TxCRCInitializationPattern = SPI_CRC_INITIALIZATION_ALL_ZERO_PATTERN;
  24.   hspi4.Init.RxCRCInitializationPattern = SPI_CRC_INITIALIZATION_ALL_ZERO_PATTERN;
  25.   hspi4.Init.MasterSSIdleness = SPI_MASTER_SS_IDLENESS_00CYCLE;
  26.   hspi4.Init.MasterInterDataIdleness = SPI_MASTER_INTERDATA_IDLENESS_00CYCLE;
  27.   hspi4.Init.MasterReceiverAutoSusp = SPI_MASTER_RX_AUTOSUSP_DISABLE;
  28.   hspi4.Init.MasterKeepIOState = SPI_MASTER_KEEP_IO_STATE_DISABLE;
  29.   hspi4.Init.IOSwap = SPI_IO_SWAP_DISABLE;
  30.   if (HAL_SPI_Init(&hspi4) != HAL_OK)
  31.   {
  32.     Error_Handler();
  33.   }
  34.   /* USER CODE BEGIN SPI4_Init 2 */
  35.         __HAL_SPI_ENABLE(&hspi4);
  36.   /* USER CODE END SPI4_Init 2 */

  37. }
复制代码
  1. void HAL_SPI_MspInit(SPI_HandleTypeDef* hspi)
  2. {
  3.   GPIO_InitTypeDef GPIO_InitStruct = {0};
  4.   RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};
  5.   if(hspi->Instance==SPI4)
  6.   {
  7.   /* USER CODE BEGIN SPI4_MspInit 0 */

  8.   /* USER CODE END SPI4_MspInit 0 */
  9.   /** Initializes the peripherals clock
  10.   */
  11.     PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_SPI4;
  12.     PeriphClkInitStruct.Spi45ClockSelection = RCC_SPI45CLKSOURCE_D2PCLK1;
  13.     if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)
  14.     {
  15.       Error_Handler();
  16.     }

  17.     /* Peripheral clock enable */
  18.     __HAL_RCC_SPI4_CLK_ENABLE();

  19.     __HAL_RCC_GPIOE_CLK_ENABLE();
  20.     /**SPI4 GPIO Configuration
  21.     PE4     ------> SPI4_NSS
  22.     PE5     ------> SPI4_MISO
  23.     PE6     ------> SPI4_MOSI
  24.     PE12     ------> SPI4_SCK
  25.     */
  26.     GPIO_InitStruct.Pin = GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_12;
  27.     GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  28.     GPIO_InitStruct.Pull = GPIO_NOPULL;
  29.     GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  30.     GPIO_InitStruct.Alternate = GPIO_AF5_SPI4;
  31.     HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);

  32.   /* USER CODE BEGIN SPI4_MspInit 1 */

  33.   /* USER CODE END SPI4_MspInit 1 */
  34.   }

  35. }
复制代码
uint8_t bsp_lcd_init(SPI_HandleTypeDef *hspi) 中调用第一条spi写数据 _bsp_lcd_write_reg
  1. static uint8_t _bsp_lcd_write_reg(uint8_t reg_index)
  2. {
  3.     LCD_DC_L;
  4.     _protocol_spi_read_write_byte(reg_index);

  5.     return 0;
  6. }
复制代码
  1. static uint8_t _protocol_spi_read_write_byte(uint8_t tx_data)
  2. {
  3. #if 0
  4.         HAL_SPI_Transmit(bsp_lcd_manager.spi_port, &tx_data, 1, 1);
  5. #else
  6.     while (__HAL_SPI_GET_FLAG(bsp_lcd_manager.spi_port, SPI_FLAG_TXE ) == RESET);

  7.     WRITE_REG(bsp_lcd_manager.spi_port->Instance->TXDR, tx_data);

  8.     while (__HAL_SPI_GET_FLAG(bsp_lcd_manager.spi_port, SPI_FLAG_RXNE ) == RESET);

  9.     return READ_REG(bsp_lcd_manager.spi_port->Instance->RXDR);
  10. #endif

  11. }
复制代码
然后就会卡在while (__HAL_SPI_GET_FLAG(bsp_lcd_manager.spi_port, SPI_FLAG_RXNE ) == RESET);


整个工程如附件

TEST - 副本 (2).7z

20.48 MB, 下载次数: 7

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106934
QQ
发表于 2021-12-25 17:26:56 | 显示全部楼层
可以参考下我们H7-TOOL的BOOT V1.X代码。

用的是SPI驱动的ST7789,boot里面是硬件SPI方式。

而里面的APP V1.X是SPI DMA方式,都可以参考下。
https://www.armbbs.cn/forum.php?mod=viewthread&tid=95468
回复

使用道具 举报

18

主题

321

回帖

375

积分

高级会员

积分
375
发表于 2021-12-25 22:53:46 | 显示全部楼层
eric2013 发表于 2021-12-25 17:26
可以参考下我们H7-TOOL的BOOT V1.X代码。

用的是SPI驱动的ST7789,boot里面是硬件SPI方式。

ILI9488 在 SPI 模式下是 RGB666 ,分比率是 480 * 320,按照 TOOL 的这种搞法不是太合适。局部刷新才能做到不卡顿。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106934
QQ
发表于 2021-12-26 12:50:54 | 显示全部楼层
王海靖 发表于 2021-12-25 22:53
ILI9488 在 SPI 模式下是 RGB666 ,分比率是 480 * 320,按照 TOOL 的这种搞法不是太合适。局部刷新才能 ...

可以参考,H7的SPI支持4-32bit数据发送。BOOT程序是简单的SPI硬件控制,没有使用DMA,没有做显存。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-10 16:19 , Processed in 0.162040 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表