硬汉嵌入式论坛

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

[STM32H7] 参考H7 TOOL ST7789驱动 无法正常运行的问题

[复制链接]

18

主题

321

回帖

375

积分

高级会员

积分
375
发表于 2020-4-22 10:38:45 | 显示全部楼层 |阅读模式
板子是H743VIT6核心板,ST7789接在SPI1,copy的H7 TOOL的驱动与H7 TOOL的区别:
1.无电源控制引脚
2.使用IO控制,直接点亮
3.无片选引脚,默认拉低
4.使用SPI1
5.时钟配置使用CUBEMX自动生成

问题:逻辑分析仪抓到的报文都是FF,DMA发送完成回调能正常触发。
另外:H7 TOOL调用了 HAL_SPI_INIT 并没有取回调 HAL_SPI_MspInit 这个地方已经处理过了。
驱动代码如下:
  1. void ST7789_InitHard(void)
  2. {
  3.     ST7789_ConfigGPIO();

  4.     ST7789_initial();
  5. }

  6. static void ST7789_ConfigGPIO(void)
  7. {
  8.     //完成 RS 和 RESET 两个脚的的初始化
  9.     /* 配置GPIO */
  10.     {
  11.         GPIO_InitTypeDef gpio_init;

  12.         /* 打开GPIO时钟 */
  13.         ALL_LCD_GPIO_CLK_ENABLE();

  14.         //LCD_SCK_1();

  15.         gpio_init.Mode = GPIO_MODE_OUTPUT_PP;   /* 设置推挽输出 */
  16.         gpio_init.Pull = GPIO_NOPULL;           /* 上下拉电阻不使能 */
  17.         gpio_init.Speed = GPIO_SPEED_FREQ_HIGH; /* GPIO速度等级 */

  18.         gpio_init.Pin = GPIO_PIN_5; //命令控制脚LCD_RS_PIN
  19.         HAL_GPIO_Init(GPIOC, &gpio_init);

  20.         gpio_init.Pin = GPIO_PIN_4;//复位引脚
  21.         HAL_GPIO_Init(GPIOC, &gpio_init);
  22.     }

  23.     bsp_InitSPI1_Fast();
  24. }

  25. void bsp_InitSPI1_Fast(void)
  26. {
  27.     //完成SPI的引脚配置
  28.     GPIO_InitTypeDef GPIO_InitStruct;

  29.     __HAL_RCC_GPIOA_CLK_ENABLE();

  30.     __HAL_RCC_SPI1_CLK_ENABLE();

  31.     GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  32.     GPIO_InitStruct.Pull = GPIO_PULLUP; /* 上拉  GPIO_PULLUP*/
  33.     GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
  34.     GPIO_InitStruct.Alternate = GPIO_AF5_SPI1;

  35.     GPIO_InitStruct.Pin = GPIO_PIN_5;
  36.     HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  37.     GPIO_InitStruct.Pin = GPIO_PIN_7;
  38.     GPIO_InitStruct.Alternate = GPIO_AF5_SPI1;
  39.     HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  40.     bsp_InitSPI1ParamFast();
  41. }

  42. void bsp_InitSPI1ParamFast(void)
  43. {
  44.     hspi1.Instance = SPI1;
  45.     hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2;
  46.     hspi1.Init.Direction         = SPI_DIRECTION_2LINES;
  47.     hspi1.Init.CLKPhase          = SPI_PHASE_1EDGE;
  48.     hspi1.Init.CLKPolarity       = SPI_POLARITY_HIGH;
  49.     hspi1.Init.DataSize          = SPI_DATASIZE_16BIT;
  50.     hspi1.Init.FirstBit          = SPI_FIRSTBIT_MSB;
  51.     hspi1.Init.TIMode            = SPI_TIMODE_DISABLE;
  52.     hspi1.Init.CRCCalculation    = SPI_CRCCALCULATION_DISABLE;
  53.     hspi1.Init.CRCPolynomial     = 7;
  54.     hspi1.Init.CRCLength         = SPI_CRC_LENGTH_8BIT;
  55.     hspi1.Init.NSS               = SPI_NSS_SOFT;
  56.     hspi1.Init.NSSPMode          = SPI_NSS_PULSE_DISABLE;
  57.     hspi1.Init.MasterKeepIOState = SPI_MASTER_KEEP_IO_STATE_ENABLE; /* Recommanded setting to avoid glitches */
  58.     hspi1.Init.Mode              = SPI_MODE_MASTER;
  59.     hspi1.Init.IOSwap            = SPI_IO_SWAP_ENABLE;
  60.     hspi1.Init.FifoThreshold     = SPI_FIFO_THRESHOLD_01DATA;

  61.     HAL_SPI_Init(&hspi1);

  62.     __HAL_RCC_DMA1_CLK_ENABLE();
  63.     __HAL_RCC_DMA2_CLK_ENABLE();

  64.     hdma_tx.Instance                 = DMA1_Stream3;
  65.     hdma_tx.Init.FIFOMode            = DMA_FIFOMODE_DISABLE;
  66.     hdma_tx.Init.FIFOThreshold       = DMA_FIFO_THRESHOLD_FULL;
  67.     hdma_tx.Init.MemBurst            = DMA_MBURST_SINGLE;
  68.     hdma_tx.Init.PeriphBurst         = DMA_PBURST_SINGLE;
  69.     hdma_tx.Init.Request             = DMA_REQUEST_SPI1_TX;
  70.     hdma_tx.Init.Direction           = DMA_MEMORY_TO_PERIPH;
  71.     hdma_tx.Init.PeriphInc           = DMA_PINC_DISABLE;
  72.     hdma_tx.Init.MemInc              = DMA_MINC_ENABLE;
  73.     hdma_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;
  74.     hdma_tx.Init.MemDataAlignment    = DMA_MDATAALIGN_HALFWORD;

  75.     hdma_tx.Init.Mode                = DMA_NORMAL;

  76.     hdma_tx.Init.Priority            = DMA_PRIORITY_LOW;

  77.     HAL_DMA_Init(&hdma_tx);

  78.     __HAL_LINKDMA(&hspi1, hdmatx, hdma_tx);

  79.     HAL_NVIC_SetPriority(DMA1_Stream3_IRQn, 1, 1);
  80.     HAL_NVIC_EnableIRQ(DMA1_Stream3_IRQn);

  81.     HAL_NVIC_SetPriority(SPI1_IRQn, 1, 0);
  82.     HAL_NVIC_EnableIRQ(SPI1_IRQn);
  83. }

  84. static void ST7789_initial(void)
  85. {
  86.     rt_thread_delay(10);
  87.     LCD_RESET_0();                  /* 低电平:复位, 只需要大于10us */
  88.                
  89.     rt_hw_us_delay(20);/* 延迟 20us */
  90.    
  91.     LCD_RESET_1();                  /* 高电平:复位结束 */
  92.     //bsp_DelayUS(10 * 1000);         /* 复位之后,要求等待至少5ms, 此处等待10ms */
  93.     rt_thread_delay(10);
  94.    
  95.     Lcd_WriteIndex(0x36);           /* 扫描方向 */
  96.     Lcd_WriteData(0x00);
  97.     /*省略*/
  98. }

  99. void Lcd_WriteIndex(uint8_t data1)
  100. {
  101.     LCD_RS_0();

  102.     ST7789_SendByteQuick(data1);
  103. }

  104. static void ST7789_SendByteQuick(uint8_t data)
  105. {
  106.     SPI1->CFG1 = SPI_BAUDRATEPRESCALER_8 | 7;  //设置单个SPI传输的数据帧的位数是8位
  107.     SPI1->CR1 = SPI_CR1_SSI;//当 SSM 位置 1 时,此位才有效。此位的值将作用到外设 SS 输入上,并忽略 SS 引脚的 I/O 值
  108.     SPI1->CR2 = 1;
  109.     SPI1->CR1 = SPI_CR1_SPE | SPI_CR1_SSI;
  110.     SPI1->CR1 = SPI_CR1_SPE | SPI_CR1_SSI | SPI_CR1_CSTART;

  111.     while ((SPI1->SR & SPI_FLAG_TXE) == 0);

  112.     *((__IO uint8_t *)&SPI1->TXDR) = data;

  113.     while ((SPI1->SR & SPI_SR_TXC) == 0);

  114.     SPI1->IFCR = SPI_IFCR_EOTC | SPI_IFCR_TXTFC;

  115.     SPI1->CR1 &= ~(SPI_CR1_SPE);
  116. }
复制代码



回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106622
QQ
发表于 2020-4-22 10:53:14 | 显示全部楼层
不用DMA正常不。
回复

使用道具 举报

18

主题

321

回帖

375

积分

高级会员

积分
375
 楼主| 发表于 2020-4-22 11:26:16 | 显示全部楼层

注释掉
  1.     __HAL_RCC_DMA1_CLK_ENABLE();
  2.     __HAL_RCC_DMA2_CLK_ENABLE();

  3.     hdma_tx.Instance                 = DMA1_Stream3;
  4.     hdma_tx.Init.FIFOMode            = DMA_FIFOMODE_DISABLE;
  5.     hdma_tx.Init.FIFOThreshold       = DMA_FIFO_THRESHOLD_FULL;
  6.     hdma_tx.Init.MemBurst            = DMA_MBURST_SINGLE;
  7.     hdma_tx.Init.PeriphBurst         = DMA_PBURST_SINGLE;
  8.     hdma_tx.Init.Request             = DMA_REQUEST_SPI1_TX;
  9.     hdma_tx.Init.Direction           = DMA_MEMORY_TO_PERIPH;
  10.     hdma_tx.Init.PeriphInc           = DMA_PINC_DISABLE;
  11.     hdma_tx.Init.MemInc              = DMA_MINC_ENABLE;
  12.     hdma_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;
  13.     hdma_tx.Init.MemDataAlignment    = DMA_MDATAALIGN_HALFWORD;

  14.     hdma_tx.Init.Mode                = DMA_NORMAL;

  15.     hdma_tx.Init.Priority            = DMA_PRIORITY_LOW;

  16.     HAL_DMA_Init(&hdma_tx);

  17.     __HAL_LINKDMA(&hspi1, hdmatx, hdma_tx);

  18.     HAL_NVIC_SetPriority(DMA1_Stream3_IRQn, 1, 1);
  19.     HAL_NVIC_EnableIRQ(DMA1_Stream3_IRQn);

  20.     HAL_NVIC_SetPriority(SPI1_IRQn, 1, 0);
  21.     HAL_NVIC_EnableIRQ(SPI1_IRQn);
复制代码
修改 HAL_SPI_Transmit_DMA(&hspi1, (uint8_t *)(0x30020000),  240 * 240); 为 HAL_SPI_Transmit(&hspi1, (uint8_t *)(0x30020000),  240 * 240,1000);

因为没有CS 逻辑分析仪 选的是低电平捕获。抓到的报文是FF
回复

使用道具 举报

18

主题

321

回帖

375

积分

高级会员

积分
375
 楼主| 发表于 2020-4-22 13:18:43 | 显示全部楼层

非DMA模式 也不正常
  1. static void ST7789_SendByteQuick(uint8_t data)
  2. {
  3.     SPI1->CFG1 = SPI_BAUDRATEPRESCALER_8 | 7;  // 时钟分频 设置为8分频 设置单个SPI传输的数据帧的位数是8位
  4.     SPI1->CR1 = SPI_CR1_SSI;//SSI=1, 设置内部 SS 信号为高电平
  5.     SPI1->CR2 = 1;//设置传输一个字节
  6.     SPI1->CR1 = SPI_CR1_SPE | SPI_CR1_SSI;//使能外设 设置内部 SS 信号为高电平
  7.     SPI1->CR1 = SPI_CR1_SPE | SPI_CR1_SSI | SPI_CR1_CSTART;//设置主站开始传输

  8.     while ((SPI1->SR & SPI_FLAG_TXE) == 0);//判断是否有足够的tx数据包控件

  9.     *((__IO uint8_t *)&SPI1->TXDR) = data;//写入数据

  10.     while ((SPI1->SR & SPI_SR_TXC) == 0);//判断是否发送完成

  11.     SPI1->IFCR = SPI_IFCR_EOTC | SPI_IFCR_TXTFC;//传输结束标志清零   发送填充标志清零

  12.     SPI1->CR1 &= ~(SPI_CR1_SPE);//失能外设 就是完毕SPI
  13. }
复制代码
这个地方的传输 没有使用DMA,抓取到的报文也是FF
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106622
QQ
发表于 2020-4-22 15:19:58 | 显示全部楼层
王海靖 发表于 2020-4-22 13:18
非DMA模式 也不正常
这个地方的传输 没有使用DMA,抓取到的报文也是FF

最早的H7-TOOL代码是没有使用spi dma,那个代码比较好移植,可以试试是否正常。
回复

使用道具 举报

18

主题

321

回帖

375

积分

高级会员

积分
375
 楼主| 发表于 2020-4-22 15:51:39 | 显示全部楼层
eric2013 发表于 2020-4-22 15:19
最早的H7-TOOL代码是没有使用spi dma,那个代码比较好移植,可以试试是否正常。

正在排除问题,有点眉目了,HAL_SPI_Transmit 能正确的发送出一个字节的数据了。继续分析中
回复

使用道具 举报

18

主题

321

回帖

375

积分

高级会员

积分
375
 楼主| 发表于 2020-4-22 16:43:35 | 显示全部楼层
本帖最后由 王海靖 于 2020-4-23 17:55 编辑

屏幕点亮了,但是现在是花屏。先分享一个坑点。
  1. hspi1.Init.IOSwap            = SPI_IO_SWAP_ENABLE;
复制代码
问题出在这了,这个是改变MOSI 和MISO的,这个要根据自己板子来操作。一般来说 都是DISABLE。
今天忙别的去了,继续爬坑中。
回复

使用道具 举报

18

主题

321

回帖

375

积分

高级会员

积分
375
 楼主| 发表于 2020-4-26 17:01:49 | 显示全部楼层
eric2013 发表于 2020-4-22 15:19
最早的H7-TOOL代码是没有使用spi dma,那个代码比较好移植,可以试试是否正常。

硬汉老大,发现HAL_SPI_Transmit_DMA(&hspi1, (uint8_t *)(0x3000000), 240*240);,这里的地址如果写成0x3000000的话 就一定会触发DMA传输错误,如果是AXI区域就没有问题。这里是什么原因导致的呢?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106622
QQ
发表于 2020-4-26 20:03:47 | 显示全部楼层
王海靖 发表于 2020-4-26 17:01
硬汉老大,发现HAL_SPI_Transmit_DMA(&hspi1, (uint8_t *)(0x3000000), 240*240);,这里的地址如果写成0x ...

我记得你之前是不是反馈过一次类似的问题。

感觉即使MPU配置不合理,也不至于硬件异常。
回复

使用道具 举报

18

主题

321

回帖

375

积分

高级会员

积分
375
 楼主| 发表于 2020-4-27 08:34:15 | 显示全部楼层
eric2013 发表于 2020-4-26 20:03
我记得你之前是不是反馈过一次类似的问题。

感觉即使MPU配置不合理,也不至于硬件异常。

以前那个是UART7,是硬件错误
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106622
QQ
发表于 2020-4-27 08:41:31 | 显示全部楼层
王海靖 发表于 2020-4-27 08:34
以前那个是UART7,是硬件错误

有必要换个别的板子测测。
回复

使用道具 举报

18

主题

321

回帖

375

积分

高级会员

积分
375
 楼主| 发表于 2020-4-27 09:01:36 | 显示全部楼层
eric2013 发表于 2020-4-27 08:41
有必要换个别的板子测测。

人为BUG,0x3000 0000少写了一个0
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106622
QQ
发表于 2020-4-27 09:06:27 | 显示全部楼层
王海靖 发表于 2020-4-27 09:01
人为BUG,0x3000 0000少写了一个0



这个0x3000000在我眼前晃来晃去的,我竟然没有多看他一眼。。。

后面交流问题,建议这种地址分开写0x300 0000,这样就很容易发现问题了。这个小习惯还是挺管用的。
回复

使用道具 举报

18

主题

321

回帖

375

积分

高级会员

积分
375
 楼主| 发表于 2020-4-27 09:59:24 | 显示全部楼层
微信图片_20200427095711.jpg
  1. void emwin_thread_entry(void *parameter)
  2. {
  3.     while(1)
  4.     {
  5.         rt_thread_delay(500);
  6.         LCD_ClrScr(0xFFFF);
  7.         rt_thread_delay(500);
  8.         LCD_ClrScr(0x0000);
  9.     }
  10. }

  11. void lcd_thread_entry(void *parameter)
  12. {
  13.     LCD_InitHard();
  14.     rt_thread_delay(100);
  15.     LCD_ClrScr(0x5555);
  16.     while(1)
  17.     {
  18.         rt_thread_delay(50);
  19.         LCD_Task();
  20.     }
  21. }
复制代码
这里开了两个任务,一个刷LCD 一个写数据,发现刷不满。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106622
QQ
发表于 2020-4-27 10:38:09 | 显示全部楼层
王海靖 发表于 2020-4-27 09:59
这里开了两个任务,一个刷LCD 一个写数据,发现刷不满。

DMA开成循环模式,不单独处理刷新,看看是否正常。
回复

使用道具 举报

18

主题

321

回帖

375

积分

高级会员

积分
375
 楼主| 发表于 2020-4-27 10:45:29 | 显示全部楼层
eric2013 发表于 2020-4-27 10:38
DMA开成循环模式,不单独处理刷新,看看是否正常。

循环模式,只能点亮屏,是花屏显示。
另外普通模式 刷一会,屏就没有显示了。
回复

使用道具 举报

18

主题

321

回帖

375

积分

高级会员

积分
375
 楼主| 发表于 2020-4-27 14:56:16 | 显示全部楼层
eric2013 发表于 2020-4-27 10:38
DMA开成循环模式,不单独处理刷新,看看是否正常。

老大 EMWIN已经跑起来了,屏幕显示还是很流畅的,现在SPI的速度是50MHZ,任务是50ms刷一次。跑了一下emwin的demo,pixels/sec = 1491000。
回头我整理一下,把demo发上来
回复

使用道具 举报

18

主题

321

回帖

375

积分

高级会员

积分
375
 楼主| 发表于 2020-4-28 08:59:34 | 显示全部楼层
stm32h743-mini.7z (10.06 MB, 下载次数: 111)
STM32H743VIT6 ST7789 EMWIN RT-Thread 使用SPI1.不定时的会画面不显示了,板子显示在对插的,怀疑硬件问题。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106622
QQ
发表于 2020-4-28 13:59:44 | 显示全部楼层
王海靖 发表于 2020-4-28 08:59
STM32H743VIT6 ST7789 EMWIN RT-Thread 使用SPI1.不定时的会画面不显示了,板子显示在对插的,怀疑硬件问 ...

谢谢分享。
回复

使用道具 举报

0

主题

4

回帖

4

积分

新手上路

积分
4
发表于 2023-5-30 16:01:32 | 显示全部楼层
你好想请问下老哥,dma spi屏幕刷不满怎么解决的呀
回复

使用道具 举报

0

主题

4

回帖

4

积分

新手上路

积分
4
发表于 2023-5-30 16:02:11 | 显示全部楼层
你好想请问下老哥,dma spi屏幕刷不满怎么解决的呀
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106622
QQ
发表于 2023-5-30 18:47:25 | 显示全部楼层
longgege2000 发表于 2023-5-30 16:02
你好想请问下老哥,dma spi屏幕刷不满怎么解决的呀

你的玩法也是开显存刷吗,还是什么方式。
回复

使用道具 举报

0

主题

4

回帖

4

积分

新手上路

积分
4
发表于 2023-5-30 23:21:34 来自手机 | 显示全部楼层
eric2013 发表于 2023-5-30 18:47
你的玩法也是开显存刷吗,还是什么方式。

也是开显存刷,使用dma发送,现在遇到问题就是屏幕刷不满
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106622
QQ
发表于 2023-5-31 00:36:05 | 显示全部楼层
longgege2000 发表于 2023-5-30 23:21
也是开显存刷,使用dma发送,现在遇到问题就是屏幕刷不满

这种的应该是你的DMA配置问题了。
回复

使用道具 举报

0

主题

4

回帖

4

积分

新手上路

积分
4
发表于 2023-5-31 09:09:13 来自手机 | 显示全部楼层
eric2013 发表于 2023-5-31 00:36
这种的应该是你的DMA配置问题了。

好的谢谢大佬,我再仔细看看
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-27 04:41 , Processed in 0.248226 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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