硬汉嵌入式论坛

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

[FMC] 求教关于MCU屏的问题,驱动ILI9488

[复制链接]

9

主题

78

回帖

105

积分

初级会员

积分
105
发表于 2022-3-18 09:37:48 | 显示全部楼层 |阅读模式
关于MCU屏驱动(ILI9488)的问题,之前使用spi操作没有问题,后来硬件改为了并口操作,使用的主控芯片是STM32H7B0VBT6,使用的是FMC驱动方式,现在的问题是LCD ID号读出的都是0了。

下面是FMC的初始化代码(cubemx生成的):
  1. /* USER CODE BEGIN Header */
  2. /**
  3.   ******************************************************************************
  4.   * File Name          : FMC.c
  5.   * Description        : This file provides code for the configuration
  6.   *                      of the FMC peripheral.
  7.   ******************************************************************************
  8.   * @attention
  9.   *
  10.   * Copyright (c) 2022 STMicroelectronics.
  11.   * All rights reserved.
  12.   *
  13.   * This software is licensed under terms that can be found in the LICENSE file
  14.   * in the root directory of this software component.
  15.   * If no LICENSE file comes with this software, it is provided AS-IS.
  16.   *
  17.   ******************************************************************************
  18.   */
  19. /* USER CODE END Header */

  20. /* Includes ------------------------------------------------------------------*/
  21. #include "fmc.h"

  22. /* USER CODE BEGIN 0 */

  23. /* USER CODE END 0 */

  24. SRAM_HandleTypeDef hsram1;

  25. /* FMC initialization function */
  26. void MX_FMC_Init(void)
  27. {
  28.   /* USER CODE BEGIN FMC_Init 0 */

  29.   /* USER CODE END FMC_Init 0 */

  30.   FMC_NORSRAM_TimingTypeDef Timing = {0};
  31.   FMC_NORSRAM_TimingTypeDef ExtTiming = {0};

  32.   /* USER CODE BEGIN FMC_Init 1 */

  33.   /* USER CODE END FMC_Init 1 */

  34.   /** Perform the SRAM1 memory initialization sequence
  35.   */
  36.   hsram1.Instance = FMC_NORSRAM_DEVICE;
  37.   hsram1.Extended = FMC_NORSRAM_EXTENDED_DEVICE;
  38.   /* hsram1.Init */
  39.   hsram1.Init.NSBank = FMC_NORSRAM_BANK1;
  40.   hsram1.Init.DataAddressMux = FMC_DATA_ADDRESS_MUX_DISABLE;
  41.   hsram1.Init.MemoryType = FMC_MEMORY_TYPE_SRAM;
  42.   hsram1.Init.MemoryDataWidth = FMC_NORSRAM_MEM_BUS_WIDTH_16;
  43.   hsram1.Init.BurstAccessMode = FMC_BURST_ACCESS_MODE_DISABLE;
  44.   hsram1.Init.WaitSignalPolarity = FMC_WAIT_SIGNAL_POLARITY_LOW;
  45.   hsram1.Init.WaitSignalActive = FMC_WAIT_TIMING_BEFORE_WS;
  46.   hsram1.Init.WriteOperation = FMC_WRITE_OPERATION_ENABLE;
  47.   hsram1.Init.WaitSignal = FMC_WAIT_SIGNAL_DISABLE;
  48.   hsram1.Init.ExtendedMode = FMC_EXTENDED_MODE_ENABLE;
  49.   hsram1.Init.AsynchronousWait = FMC_ASYNCHRONOUS_WAIT_DISABLE;
  50.   hsram1.Init.WriteBurst = FMC_WRITE_BURST_DISABLE;
  51.   hsram1.Init.ContinuousClock = FMC_CONTINUOUS_CLOCK_SYNC_ONLY;
  52.   hsram1.Init.WriteFifo = FMC_WRITE_FIFO_ENABLE;
  53.   hsram1.Init.PageSize = FMC_PAGE_SIZE_NONE;
  54.   /* Timing */
  55.   Timing.AddressSetupTime = 0;
  56.   Timing.AddressHoldTime = 0;
  57.   Timing.DataSetupTime = 10;
  58.   Timing.BusTurnAroundDuration = 0;
  59.   Timing.CLKDivision = 0;
  60.   Timing.DataLatency = 0;
  61.   Timing.AccessMode = FMC_ACCESS_MODE_A;
  62.   /* ExtTiming */
  63.   ExtTiming.AddressSetupTime = 0;
  64.   ExtTiming.AddressHoldTime = 0;
  65.   ExtTiming.DataSetupTime = 10;
  66.   ExtTiming.BusTurnAroundDuration = 0;
  67.   ExtTiming.CLKDivision = 0;
  68.   ExtTiming.DataLatency = 0;
  69.   ExtTiming.AccessMode = FMC_ACCESS_MODE_A;

  70.   if (HAL_SRAM_Init(&hsram1, &Timing, &ExtTiming) != HAL_OK)
  71.   {
  72.     Error_Handler( );
  73.   }

  74.   /* USER CODE BEGIN FMC_Init 2 */

  75.   /* USER CODE END FMC_Init 2 */
  76. }

  77. static uint32_t FMC_Initialized = 0;

  78. static void HAL_FMC_MspInit(void){
  79.   /* USER CODE BEGIN FMC_MspInit 0 */

  80.   /* USER CODE END FMC_MspInit 0 */
  81.   GPIO_InitTypeDef GPIO_InitStruct = {0};
  82.   if (FMC_Initialized) {
  83.     return;
  84.   }
  85.   FMC_Initialized = 1;
  86.   RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};

  87.   /** Initializes the peripherals clock
  88.   */
  89.     PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_FMC;
  90.     PeriphClkInitStruct.FmcClockSelection = RCC_FMCCLKSOURCE_D1HCLK;
  91.     if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)
  92.     {
  93.       Error_Handler();
  94.     }

  95.   /* Peripheral clock enable */
  96.   __HAL_RCC_FMC_CLK_ENABLE();

  97.   /** FMC GPIO Configuration
  98.   PE5   ------> FMC_A21
  99.   PE7   ------> FMC_D4
  100.   PE8   ------> FMC_D5
  101.   PE9   ------> FMC_D6
  102.   PE10   ------> FMC_D7
  103.   PE11   ------> FMC_D8
  104.   PE12   ------> FMC_D9
  105.   PE13   ------> FMC_D10
  106.   PE14   ------> FMC_D11
  107.   PE15   ------> FMC_D12
  108.   PD8   ------> FMC_D13
  109.   PD9   ------> FMC_D14
  110.   PD10   ------> FMC_D15
  111.   PD14   ------> FMC_D0
  112.   PD15   ------> FMC_D1
  113.   PD0   ------> FMC_D2
  114.   PD1   ------> FMC_D3
  115.   PD4   ------> FMC_NOE
  116.   PD5   ------> FMC_NWE
  117.   PD7   ------> FMC_NE1
  118.   */
  119.   /* GPIO_InitStruct */
  120.   GPIO_InitStruct.Pin = GPIO_PIN_5|GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9
  121.                           |GPIO_PIN_10|GPIO_PIN_11|GPIO_PIN_12|GPIO_PIN_13
  122.                           |GPIO_PIN_14|GPIO_PIN_15;
  123.   GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  124.   GPIO_InitStruct.Pull = GPIO_NOPULL;
  125.   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
  126.   GPIO_InitStruct.Alternate = GPIO_AF12_FMC;

  127.   HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);

  128.   /* GPIO_InitStruct */
  129.   GPIO_InitStruct.Pin = GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_14
  130.                           |GPIO_PIN_15|GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_4
  131.                           |GPIO_PIN_5|GPIO_PIN_7;
  132.   GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  133.   GPIO_InitStruct.Pull = GPIO_NOPULL;
  134.   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
  135.   GPIO_InitStruct.Alternate = GPIO_AF12_FMC;

  136.   HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);

  137.   /* USER CODE BEGIN FMC_MspInit 1 */

  138.   /* USER CODE END FMC_MspInit 1 */
  139. }

  140. void HAL_SRAM_MspInit(SRAM_HandleTypeDef* sramHandle){
  141.   /* USER CODE BEGIN SRAM_MspInit 0 */

  142.   /* USER CODE END SRAM_MspInit 0 */
  143.   HAL_FMC_MspInit();
  144.   /* USER CODE BEGIN SRAM_MspInit 1 */

  145.   /* USER CODE END SRAM_MspInit 1 */
  146. }

  147. static uint32_t FMC_DeInitialized = 0;

  148. static void HAL_FMC_MspDeInit(void){
  149.   /* USER CODE BEGIN FMC_MspDeInit 0 */

  150.   /* USER CODE END FMC_MspDeInit 0 */
  151.   if (FMC_DeInitialized) {
  152.     return;
  153.   }
  154.   FMC_DeInitialized = 1;
  155.   /* Peripheral clock enable */
  156.   __HAL_RCC_FMC_CLK_DISABLE();

  157.   /** FMC GPIO Configuration
  158.   PE5   ------> FMC_A21
  159.   PE7   ------> FMC_D4
  160.   PE8   ------> FMC_D5
  161.   PE9   ------> FMC_D6
  162.   PE10   ------> FMC_D7
  163.   PE11   ------> FMC_D8
  164.   PE12   ------> FMC_D9
  165.   PE13   ------> FMC_D10
  166.   PE14   ------> FMC_D11
  167.   PE15   ------> FMC_D12
  168.   PD8   ------> FMC_D13
  169.   PD9   ------> FMC_D14
  170.   PD10   ------> FMC_D15
  171.   PD14   ------> FMC_D0
  172.   PD15   ------> FMC_D1
  173.   PD0   ------> FMC_D2
  174.   PD1   ------> FMC_D3
  175.   PD4   ------> FMC_NOE
  176.   PD5   ------> FMC_NWE
  177.   PD7   ------> FMC_NE1
  178.   */

  179.   HAL_GPIO_DeInit(GPIOE, GPIO_PIN_5|GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9
  180.                           |GPIO_PIN_10|GPIO_PIN_11|GPIO_PIN_12|GPIO_PIN_13
  181.                           |GPIO_PIN_14|GPIO_PIN_15);

  182.   HAL_GPIO_DeInit(GPIOD, GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_14
  183.                           |GPIO_PIN_15|GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_4
  184.                           |GPIO_PIN_5|GPIO_PIN_7);

  185.   /* USER CODE BEGIN FMC_MspDeInit 1 */

  186.   /* USER CODE END FMC_MspDeInit 1 */
  187. }

  188. void HAL_SRAM_MspDeInit(SRAM_HandleTypeDef* sramHandle){
  189.   /* USER CODE BEGIN SRAM_MspDeInit 0 */

  190.   /* USER CODE END SRAM_MspDeInit 0 */
  191.   HAL_FMC_MspDeInit();
  192.   /* USER CODE BEGIN SRAM_MspDeInit 1 */

  193.   /* USER CODE END SRAM_MspDeInit 1 */
  194. }
  195. /**
  196.   * @}
  197.   */

  198. /**
  199.   * @}
  200.   */
复制代码
关于LCD 的硬件接口:
LCD_CS   =====》 FMC_NE1
LCD_RS   =====》 FMC_A21
LCD_WR  =====>  FMC_NWE
LCD_RD   =====>  FMC_NOE

LCD_RS 操作的代码:
  1. #define LCD                 ((__IO _lcd*)(0x60000000 + (1<<22) - 2))
复制代码

硬件是等长线设计的:

LCD硬件设计.JPG
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106685
QQ
发表于 2022-3-18 10:46:07 | 显示全部楼层
MPU必须要配,配置为Device或者Strongly Ordered,否则会出现2次CS、WE信号
回复

使用道具 举报

9

主题

78

回帖

105

积分

初级会员

积分
105
 楼主| 发表于 2022-3-18 13:51:26 | 显示全部楼层
eric2013 发表于 2022-3-18 10:46
MPU必须要配,配置为Device或者Strongly Ordered,否则会出现2次CS、WE信号
  1. void MPU_Config(void)
  2. {
  3.     MPU_Region_InitTypeDef MPU_InitStruct = {0};

  4.     /* Disables the MPU */
  5.     HAL_MPU_Disable();

  6.     /** Initializes and configures the Region and the memory to be protected
  7.     */
  8.     MPU_InitStruct.Enable = MPU_REGION_ENABLE;
  9.     MPU_InitStruct.Number = MPU_REGION_NUMBER0;
  10.     MPU_InitStruct.BaseAddress = 0x60000000;
  11.     MPU_InitStruct.Size = MPU_REGION_SIZE_2MB;
  12.     MPU_InitStruct.SubRegionDisable = 0;
  13.     MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL0;
  14.     MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
  15.     MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE;
  16.     MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;
  17.     MPU_InitStruct.IsCacheable = MPU_ACCESS_NOT_CACHEABLE;
  18.     MPU_InitStruct.IsBufferable = MPU_ACCESS_BUFFERABLE;

  19.     HAL_MPU_ConfigRegion(&MPU_InitStruct);
  20.     /* Enables the MPU */
  21.     HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT);

  22. }
复制代码

你好,硬汉哥,这是我配置的MPU的代码,配置完后,依旧读不出ID,这个有可能是硬件的问题吗?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106685
QQ
发表于 2022-3-18 14:02:45 | 显示全部楼层
悠悠三千载 发表于 2022-3-18 13:51
你好,硬汉哥,这是我配置的MPU的代码,配置完后,依旧读不出ID,这个有可能是硬件的问题吗?

示波器接上看看,驱动9488比较好整。

回复

使用道具 举报

9

主题

78

回帖

105

积分

初级会员

积分
105
 楼主| 发表于 2022-3-18 15:34:37 | 显示全部楼层
eric2013 发表于 2022-3-18 14:02
示波器接上看看,驱动9488比较好整。

用示波器看了下,发现这个NE信号很奇怪啊,这个应该不对吧?代码如下:
  1. void LCD_Init(void)
  2. {
  3.     LCD_BackLed_Ctrl(ENABLE);
  4.     LCD_Rest();
  5.     LCD_GetDevID();

  6.     if(lcddev.dev_id == 0x9488)
  7.     {
  8.         ILI9488_Init();
  9.     }
  10. }
复制代码
  1. void LCD_GetDevID(void)
  2. {
  3.     uint16_t tmp = 0;

  4.     LCD_Write_Cmd(0xD3);
  5.     tmp = LCD_Read_Data();
  6.     tmp = LCD_Read_Data();
  7.     tmp = LCD_Read_Data();
  8.     tmp = tmp << 8;
  9.     tmp |= LCD_Read_Data();

  10.     lcddev.dev_id = tmp;
  11. }
复制代码

微信图片_20220318150458.jpg
回复

使用道具 举报

9

主题

78

回帖

105

积分

初级会员

积分
105
 楼主| 发表于 2022-3-18 15:56:42 | 显示全部楼层
eric2013 发表于 2022-3-18 14:02
示波器接上看看,驱动9488比较好整。

关闭catch后,NE信号如下,但是读取ID读取到94,但是88没有读到,而且这个NE信号震荡了,是不是硬件有问题?
微信图片_20220318155610.jpg
回复

使用道具 举报

9

主题

78

回帖

105

积分

初级会员

积分
105
 楼主| 发表于 2022-3-18 16:14:24 | 显示全部楼层
eric2013 发表于 2022-3-18 14:02
示波器接上看看,驱动9488比较好整。

暂时搞定了,不是cache的问题,是MPU配置中的一处有问题,已经正常了,谢谢硬汉哥的帮忙。
修改的地方是:
  1. MPU_InitStruct.Size = MPU_REGION_SIZE_64MB;
复制代码
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106685
QQ
发表于 2022-3-18 16:24:34 | 显示全部楼层
悠悠三千载 发表于 2022-3-18 16:14
暂时搞定了,不是cache的问题,是MPU配置中的一处有问题,已经正常了,谢谢硬汉哥的帮忙。
修改的地方是 ...

这是MPU配置没有覆盖到FMC的地址范围啊。
回复

使用道具 举报

9

主题

78

回帖

105

积分

初级会员

积分
105
 楼主| 发表于 2022-3-18 17:25:26 | 显示全部楼层
eric2013 发表于 2022-3-18 16:24
这是MPU配置没有覆盖到FMC的地址范围啊。

谢谢硬汉哥解答,我再去好好研究文档,第一次使用H7系列的,很多都是半路上手,囫囵吞枣的,还是需要先把文档看一次,再次感谢
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-29 17:55 , Processed in 0.310418 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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