找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 519|回复: 4
打印 上一主题 下一主题
收起左侧

HC32F460JEUA使用SPI无法驱动LCD

[复制链接]
跳转到指定楼层
楼主
ID:1066795 发表于 2025-11-15 16:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
50黑币
LCD的配置是之前点亮过得现在只是换了个芯片 有点不熟悉这款芯片有路过的大佬能指点一下么.c 文件

  1. #include "tftlcd.h"
  2. extern uint32_t test_var;
  3. // 缓冲区定义
  4. #define COLOR_FILL_BUFFER_SIZE (240 * 4)
  5. uint16_t color_fill_buffer[COLOR_FILL_BUFFER_SIZE];

  6. void LCD_GPIO_Init(void)
  7. {
  8.     stc_gpio_init_t stcGpioInit;              // 定义GPIO结构体
  9.     GPIO_SetDebugPort(GPIO_PIN_TDO, DISABLE); // 关闭调试端口,释放相关引脚
  10.     GPIO_SetDebugPort(GPIO_PIN_SWO, DISABLE);

  11.     (void)GPIO_StructInit(&stcGpioInit); // 使用默认参数配置结构体

  12.     stcGpioInit.u16PinState = PIN_STAT_SET;           // 高电平
  13.     stcGpioInit.u16PinDir = PIN_DIR_OUT;              // 输出模式
  14.     stcGpioInit.u16PinOutputType = PIN_OUT_TYPE_CMOS; // 推挽输出
  15.     stcGpioInit.u16PinDrv = PIN_HIGH_DRV;             // 驱动能力高
  16.     stcGpioInit.u16PullUp = PIN_PU_OFF;               

  17.     // SCLK
  18.     (void)GPIO_Init(LCD_POART, LCD_SCLK_PIN, &stcGpioInit);
  19.     // MOSI = SDA
  20.     (void)GPIO_Init(LCD_POART, LCD_MOSI_PIN, &stcGpioInit);
  21.     // RES
  22.     (void)GPIO_Init(LCD_RST_PORT, LCD_RST_PIN, &stcGpioInit);
  23.     // DC
  24.     (void)GPIO_Init(LCD_POART, LCD_DC_PIN, &stcGpioInit);
  25.     // CS
  26.     (void)GPIO_Init(LCD_POART, LCD_CS_PIN, &stcGpioInit);
  27.     // BLK
  28.     (void)GPIO_Init(LCD_POART, LCD_BLK_PIN, &stcGpioInit);

  29.     // SCLK MOSI 引脚设为复用模式
  30.     GPIO_SetFunc(LCD_POART, LCD_SCLK_PIN, LCD_SCLK_FUNC);
  31.     GPIO_SetFunc(LCD_POART, LCD_MOSI_PIN, LCD_MOSI_FUNC);

  32.     stc_spi_init_t stcSpiInit;
  33.     stc_spi_delay_t stcSpiDelayCfg;

  34.     // 使用默认参数初始化结构体
  35.     (void)SPI_StructInit(&stcSpiInit);
  36.     (void)SPI_DelayStructInit(&stcSpiDelayCfg);

  37.     // 开启SPI时钟
  38.     FCG_Fcg1PeriphClockCmd(SPI_FCG, ENABLE);

  39.     // 清空SPI配置
  40.     SPI_DeInit(LCD_SPI);

  41.     // 设置SPI必要参数
  42.     stcSpiInit.u32WireMode = SPI_4_WIRE; // SPI3线模式
  43.     stcSpiInit.u32TransMode = SPI_FULL_DUPLEX;
  44.     stcSpiInit.u32MasterSlave = SPI_MASTER; // SPI主机
  45.     stcSpiInit.u32ModeFaultDetect = SPI_MD_FAULT_DETECT_DISABLE;
  46.     stcSpiInit.u32SuspendMode = SPI_COM_SUSP_FUNC_OFF;  // 不自动挂起
  47.     stcSpiInit.u32Parity = SPI_PARITY_INVD;             // 不开奇偶校验
  48.     stcSpiInit.u32SpiMode = SPI_MD_0;                   // 空闲低电平,奇数边沿采样
  49.     stcSpiInit.u32BaudRatePrescaler = SPI_BR_CLK_DIV64; // 64分频
  50.     stcSpiInit.u32DataBits = SPI_DATA_SIZE_8BIT;        // 一次传输8位
  51.     stcSpiInit.u32FirstBit = SPI_FIRST_MSB;             // 高位在前

  52.     // 初始化SPI
  53.     (void)SPI_Init(LCD_SPI, &stcSpiInit);

  54.     // 配置SPI延时必要参数
  55.     stcSpiDelayCfg.u32IntervalDelay = SPI_INTERVAL_TIME_8SCK; // t3:下次存取延时
  56.     stcSpiDelayCfg.u32ReleaseDelay = SPI_RELEASE_TIME_8SCK;   // t2:振荡停止到片选无效时间
  57.     stcSpiDelayCfg.u32SetupDelay = SPI_SETUP_TIME_1SCK;       // t1:片选有效到开始振荡时间
  58.     (void)SPI_DelayTimeConfig(LCD_SPI, &stcSpiDelayCfg);

  59.     // 使能SPI
  60.     SPI_Cmd(LCD_SPI, ENABLE);

  61.     // // CS 拉高
  62.     LCD_CS_Set();
  63. }

  64. /******************************************************************************
  65.       函数说明:LCD串行数据写入函数
  66.       入口数据:dat  要写入的串行数据
  67.       返回值:  无
  68. ******************************************************************************/
  69. void LCD_Writ_Bus(uint8_t dat)
  70. {
  71.     LCD_CS_Clr();

  72.    
  73.     uint8_t RecvData = 0;

  74.     // 等待发送缓冲区为空
  75.     while( RESET == SPI_GetStatus(LCD_SPI,  SPI_FLAG_TX_BUF_EMPTY) );

  76.     // 发送并接收数据
  77.     SPI_TransReceive(LCD_SPI, &dat, &RecvData, 1, HCLK_VALUE);


  78.     LCD_CS_Set();
  79. }

  80. /******************************************************************************
  81.       函数说明:LCD写入数据
  82.       入口数据:dat 写入的数据
  83.       返回值:  无
  84. ******************************************************************************/
  85. void LCD_WR_DATA8(uint8_t dat)
  86. {
  87.      LCD_DC_Set(); // 写数据
  88.     LCD_Writ_Bus(dat);
  89. }

  90. /******************************************************************************
  91.       函数说明:LCD写入数据
  92.       入口数据:dat 写入的数据
  93.       返回值:  无
  94. ******************************************************************************/
  95. void LCD_WR_DATA(uint16_t dat)
  96. {
  97.         LCD_Writ_Bus(dat >> 8);
  98.         LCD_Writ_Bus(dat & 0xff);
  99. }

  100. /******************************************************************************
  101.       函数说明:LCD写入命令
  102.       入口数据:dat 写入的命令
  103.       返回值:  无
  104. ******************************************************************************/
  105. void LCD_WR_REG(uint8_t dat)
  106. {
  107.         LCD_DC_Clr(); // 写命令
  108.         LCD_Writ_Bus(dat);
  109.         LCD_DC_Set(); // 写数据
  110. }

  111. /**
  112. * @brief       设置显示窗口
  113. * @param       x1:窗口列起始地址
  114. * @param       y1:坐标行起始地址
  115. * @param       x2:窗口列结束地址
  116. * @param       y2:坐标行结束地址
  117. * @retval      无
  118. */
  119. void LCD_Address_Set(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2)
  120. {
  121.     LCD_WR_REG(0x2a); // 列地址设置
  122.     LCD_WR_DATA(x1);
  123.     LCD_WR_DATA(x2);
  124.     LCD_WR_REG(0x2b); // 行地址设置
  125.     LCD_WR_DATA(y1);
  126.     LCD_WR_DATA(y2);
  127.     LCD_WR_REG(0x2c); // 储存器写
  128. }

  129. /**
  130. * @brief LCD初始化
  131. */
  132. void LCD_Init(void)
  133. {
  134.     // 初始化GPIO、SPI和DMA
  135.      LCD_GPIO_Init();

  136.     LCD_RES_Clr(); // 复位
  137.     DDL_DelayMS(120);
  138.     LCD_RES_Set();
  139.     DDL_DelayMS(120);
  140.     LCD_BLK_Set(); // 打开背光
  141.     DDL_DelayMS(120);

  142.     LCD_WR_REG(0x11);
  143.     // 延时至少120ms
  144.     DDL_DelayMS(120);

  145.     LCD_WR_REG(0x36);
  146.     if (USE_HORIZONTAL == 0)
  147.         LCD_WR_DATA8(0x00);
  148.     else if (USE_HORIZONTAL == 1)
  149.         LCD_WR_DATA8(0xC0);
  150.     else if (USE_HORIZONTAL == 2)
  151.         LCD_WR_DATA8(0x70);
  152.     else
  153.         LCD_WR_DATA8(0xA0);

  154.     LCD_WR_REG(0x3A);
  155.     LCD_WR_DATA8(0x05);

  156.     LCD_WR_REG(0xB2);
  157.     LCD_WR_DATA8(0x0C);
  158.     LCD_WR_DATA8(0x0C);
  159.     LCD_WR_DATA8(0x00);
  160.     LCD_WR_DATA8(0x33);
  161.     LCD_WR_DATA8(0x33);

  162.     LCD_WR_REG(0xB7);
  163.     LCD_WR_DATA8(0x35);

  164.     LCD_WR_REG(0xBB);
  165.     LCD_WR_DATA8(0x1A);

  166.     LCD_WR_REG(0xC0);
  167.     LCD_WR_DATA8(0x2C);

  168.     LCD_WR_REG(0xC2);
  169.     LCD_WR_DATA8(0x01);

  170.     LCD_WR_REG(0xC3);
  171.     LCD_WR_DATA8(0x0B);

  172.     LCD_WR_REG(0xC4);
  173.     LCD_WR_DATA8(0x20);

  174.     LCD_WR_REG(0xC6);
  175.     LCD_WR_DATA8(0x0F);

  176.     LCD_WR_REG(0xD0);
  177.     LCD_WR_DATA8(0xA4);
  178.     LCD_WR_DATA8(0xA1);

  179.     LCD_WR_REG(0x21);
  180.     LCD_WR_REG(0xE0);
  181.     LCD_WR_DATA8(0xF0);
  182.     LCD_WR_DATA8(0x00);
  183.     LCD_WR_DATA8(0x04);
  184.     LCD_WR_DATA8(0x04);
  185.     LCD_WR_DATA8(0x04);
  186.     LCD_WR_DATA8(0x05);
  187.     LCD_WR_DATA8(0x29);
  188.     LCD_WR_DATA8(0x33);
  189.     LCD_WR_DATA8(0x3E);
  190.     LCD_WR_DATA8(0x38);
  191.     LCD_WR_DATA8(0x12);
  192.     LCD_WR_DATA8(0x12);
  193.     LCD_WR_DATA8(0x28);
  194.     LCD_WR_DATA8(0x30);

  195.     LCD_WR_REG(0xE1);
  196.     LCD_WR_DATA8(0xF0);
  197.     LCD_WR_DATA8(0x07);
  198.     LCD_WR_DATA8(0x0A);
  199.     LCD_WR_DATA8(0x0D);
  200.     LCD_WR_DATA8(0x0B);
  201.     LCD_WR_DATA8(0x07);
  202.     LCD_WR_DATA8(0x28);
  203.     LCD_WR_DATA8(0x33);
  204.     LCD_WR_DATA8(0x3E);
  205.     LCD_WR_DATA8(0x36);
  206.     LCD_WR_DATA8(0x14);
  207.     LCD_WR_DATA8(0x14);
  208.     LCD_WR_DATA8(0x29);
  209.     LCD_WR_DATA8(0x32);

  210.     LCD_WR_REG(0x20); // 反色St7789

  211.     LCD_WR_REG(0x11);
  212.     LCD_Fill(0, 0, LCD_HEIGHT, LCD_WIDTH, 0x0000);
  213.     LCD_WR_REG(0x29);
  214.     test_var = 1000;
  215. }
  216. void LCD_Fill(uint16_t xsta, uint16_t ysta, uint16_t xend, uint16_t yend, uint16_t color)
  217. {
  218.     uint16_t i, j;
  219.     LCD_Address_Set(xsta, ysta, xend - 1, yend - 1);
  220.     for (i = ysta; i < yend; i++)
  221.     {
  222.         for (j = xsta; j < xend; j++)
  223.         {
  224.             LCD_WR_DATA(color);
  225.         }
  226.     }
  227. }
复制代码
.h文件
  1. #ifndef __LCD_H
  2. #define __LCD_H
  3. #include "main.h"
  4. #include "stdio.h"
  5. #include "lvgl.h"
  6. // LCD的宽和高定义
  7. #define USE_HORIZONTAL 2 // 设置横屏或者竖屏显示 0或1为竖屏 2或3为横屏

  8. #if USE_HORIZONTAL == 0 || USE_HORIZONTAL == 1

  9. #define LCD_WIDTH  240
  10. #define LCD_W      240
  11. #define LCD_HEIGHT 240
  12. #define LCD_H      240

  13. #else
  14. #define LCD_W      240
  15. #define LCD_WIDTH  240

  16. #define LCD_H      320
  17. #define LCD_HEIGHT 320
  18. #endif

  19. // GPIO_SetFunc(GPIO_PORT_B, GPIO_PIN_06, GPIO_FUNC_43); // SPI3_SCK
  20. // GPIO_SetFunc(GPIO_PORT_B, GPIO_PIN_07, GPIO_FUNC_40); // SPI3_MOSI

  21. #define LCD_POART                   GPIO_PORT_B

  22. #define LCD_SCLK_PIN                GPIO_PIN_06
  23. #define LCD_SCLK_FUNC               GPIO_FUNC_43

  24. #define LCD_MOSI_PIN                GPIO_PIN_07
  25. #define LCD_MOSI_FUNC               GPIO_FUNC_40


  26. #define SPI_FCG                     FCG1_PERIPH_SPI3    // 时钟
  27. #define LCD_SPI                     CM_SPI3

  28. #define LCD_CS_PORT  GPIO_PORT_A
  29. #define LCD_CS_PIN   GPIO_PIN_01
  30. #define LCD_DC_PORT  GPIO_PORT_B
  31. #define LCD_DC_PIN   GPIO_PIN_08
  32. #define LCD_RST_PORT GPIO_PORT_B
  33. #define LCD_RST_PIN  GPIO_PIN_09
  34. #define LCD_BLK_PORT GPIO_PORT_B
  35. #define LCD_BLK_PIN  GPIO_PIN_03

  36. // 控制引脚操作宏定义
  37. #define LCD_CS_Clr()  GPIO_ResetPins(LCD_CS_PORT, LCD_CS_PIN)
  38. #define LCD_CS_Set()  GPIO_SetPins(LCD_CS_PORT, LCD_CS_PIN)
  39. #define LCD_DC_Clr()  GPIO_ResetPins(LCD_DC_PORT, LCD_DC_PIN)
  40. #define LCD_DC_Set()  GPIO_SetPins(LCD_DC_PORT, LCD_DC_PIN)



  41. #define LCD_RES_Clr() GPIO_ResetPins(LCD_RST_PORT, LCD_RST_PIN)
  42. #define LCD_RES_Set() GPIO_SetPins(LCD_RST_PORT, LCD_RST_PIN)

  43. #define LCD_BLK_Set() GPIO_ResetPins(LCD_BLK_PORT, LCD_BLK_PIN)
  44. #define LCD_BLK_Clr() GPIO_SetPins(LCD_BLK_PORT, LCD_BLK_PIN)

  45. void LCD_Init(void);
  46. void LCD_Fill(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, uint16_t color);

  47. #endif
复制代码
主循环
  1. int32_t main(void)
  2. {
  3.     /* Register write unprotected for some required peripherals. */
  4.     LL_PERIPH_WE(LL_PERIPH_ALL);
  5.     // Clock Config
  6.     App_ClkCfg();
  7.     // Port Config
  8.     App_PortCfg();

  9.     // Setup
  10.     LCD_Init();
  11.     DDL_DelayMS(1U);

  12.     /* Register write protected for some required peripherals. */
  13.     // LL_PERIPH_WP(LL_PERIPH_ALL);
  14.     for (;;)
  15.     {

  16.         LCD_Fill(0, 0, LCD_WIDTH-1, LCD_HEIGHT-1, 0x0000);
  17.         DDL_DelayMS(500U);
  18.         LCD_Fill(0, 0, LCD_WIDTH-1, LCD_HEIGHT-1, 0xFFFF);
  19.         DDL_DelayMS(500U);
  20.     }
  21. }
复制代码






分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1153607 发表于 2025-11-16 09:02 | 只看该作者
虽说叫SPI不同的工作方式还是存在的,首先要搞清楚芯片的SPI与负载的SPI工作方式是否一致,如果有逻辑分析仪可以看看波形就知道问题在哪里了。
回复

使用道具 举报

板凳
ID:1162651 发表于 2025-11-17 11:33 | 只看该作者
1,背光开没开
2,初始化到底3线还是4线// 设置SPI必要参数
    stcSpiInit.u32WireMode = SPI_4_WIRE; // SPI3线模式
    stcSpiInit.u32TransMode = SPI_FULL_DUPLEX;
3,stcSpiInit.u32SpiMode = SPI_MD_0;这个可能要匹配正确
4,发数据,你的DC线呢?发数据前的片选是默认接地了吗
void LCD_Fill(uint16_t xsta, uint16_t ysta, uint16_t xend, uint16_t yend, uint16_t color)
{
    LCD_CS_LOW();
    LCD_Address_Set(xsta, ysta, xend - 1, yend - 1);
    LCD_DC_Set();
.....
}
5,检查你屏幕的时间脉冲间隔,你64分频还延时
回复

使用道具 举报

地板
ID:1066795 发表于 2025-11-18 09:09 | 只看该作者
nglskey 发表于 2025-11-17 11:33
1,背光开没开
2,初始化到底3线还是4线// 设置SPI必要参数
    stcSpiInit.u32WireMode = SPI_4_WIRE; / ...

GPIO没有对应配置
回复

使用道具 举报

5#
ID:1066795 发表于 2025-11-18 09:09 | 只看该作者
  1. #ifndef __LCD_H
  2. #define __LCD_H
  3. #include "main.h"
  4. #include "stdio.h"
  5. #include "lvgl.h"
  6. // LCD的宽和高定义
  7. #define USE_HORIZONTAL 2// 设置横屏或者竖屏显示 0或1为竖屏 2或3为横屏

  8. #if USE_HORIZONTAL == 0 || USE_HORIZONTAL == 1

  9. #define LCD_WIDTH  240
  10. #define LCD_W      240
  11. #define LCD_HEIGHT 320
  12. #define LCD_H      320

  13. #else
  14. #define LCD_W      240
  15. #define LCD_WIDTH  240

  16. #define LCD_H      320
  17. #define LCD_HEIGHT 320
  18. #endif

  19. // GPIO_SetFunc(GPIO_PORT_B, GPIO_PIN_06, GPIO_FUNC_43); // SPI3_SCK
  20. // GPIO_SetFunc(GPIO_PORT_B, GPIO_PIN_07, GPIO_FUNC_40); // SPI3_MOSI

  21. #define LCD_POART                   GPIO_PORT_B

  22. #define LCD_SCLK_PIN                GPIO_PIN_06
  23. #define LCD_SCLK_FUNC               GPIO_FUNC_43

  24. #define LCD_MOSI_PIN                GPIO_PIN_07
  25. #define LCD_MOSI_FUNC               GPIO_FUNC_40


  26. #define SPI_FCG                     FCG1_PERIPH_SPI3    // 时钟
  27. #define LCD_SPI                     CM_SPI3

  28. #define LCD_CS_PORT  GPIO_PORT_A
  29. #define LCD_CS_PIN   GPIO_PIN_01
  30. #define LCD_DC_PORT  GPIO_PORT_B
  31. #define LCD_DC_PIN   GPIO_PIN_08
  32. #define LCD_RST_PORT GPIO_PORT_B
  33. #define LCD_RST_PIN  GPIO_PIN_09
  34. #define LCD_BLK_PORT GPIO_PORT_B
  35. #define LCD_BLK_PIN  GPIO_PIN_03

  36. // 控制引脚操作宏定义
  37. #define LCD_CS_Clr()  GPIO_ResetPins(LCD_CS_PORT, LCD_CS_PIN)
  38. #define LCD_CS_Set()  GPIO_SetPins(LCD_CS_PORT, LCD_CS_PIN)
  39. #define LCD_DC_Clr()  GPIO_ResetPins(LCD_DC_PORT, LCD_DC_PIN)
  40. #define LCD_DC_Set()  GPIO_SetPins(LCD_DC_PORT, LCD_DC_PIN)



  41. #define LCD_RES_Clr() GPIO_ResetPins(LCD_RST_PORT, LCD_RST_PIN)
  42. #define LCD_RES_Set() GPIO_SetPins(LCD_RST_PORT, LCD_RST_PIN)

  43. #define LCD_BLK_Set() GPIO_ResetPins(LCD_BLK_PORT, LCD_BLK_PIN)
  44. #define LCD_BLK_Clr() GPIO_SetPins(LCD_BLK_PORT, LCD_BLK_PIN)

  45. void LCD_Init(void);
  46. void LCD_Fill(uint16_t sx, uint16_t sy, uint16_t ex, uint16_t ey, lv_color_t *color);

  47. #endif
复制代码
  1. #include "tftlcd.h"
  2. extern uint32_t test_var;
  3. // 缓冲区定义
  4. #define COLOR_FILL_BUFFER_SIZE (240 * 4)
  5. uint16_t color_fill_buffer[COLOR_FILL_BUFFER_SIZE];

  6. void LCD_GPIO_Init(void)
  7. {
  8.     stc_gpio_init_t stcGpioInit;              // 定义GPIO结构体
  9.     GPIO_SetDebugPort(GPIO_PIN_TDO, DISABLE); // 关闭调试端口,释放相关引脚
  10.     GPIO_SetDebugPort(GPIO_PIN_SWO, DISABLE);

  11.     (void)GPIO_StructInit(&stcGpioInit); // 使用默认参数配置结构体

  12.     stcGpioInit.u16PinState = PIN_STAT_SET;           // 高电平
  13.     stcGpioInit.u16PinDir = PIN_DIR_OUT;              // 输出模式
  14.     stcGpioInit.u16PinOutputType = PIN_OUT_TYPE_CMOS; // 推挽输出
  15.     stcGpioInit.u16PinDrv = PIN_HIGH_DRV;             // 驱动能力高
  16.     stcGpioInit.u16PullUp = PIN_PU_OFF;

  17.     // SCLK
  18.     (void)GPIO_Init(LCD_POART, LCD_SCLK_PIN, &stcGpioInit);
  19.     // MOSI = SDA
  20.     (void)GPIO_Init(LCD_POART, LCD_MOSI_PIN, &stcGpioInit);
  21.     // RES
  22.     (void)GPIO_Init(LCD_RST_PORT, LCD_RST_PIN, &stcGpioInit);
  23.     // DC
  24.     (void)GPIO_Init(LCD_DC_PORT, LCD_DC_PIN, &stcGpioInit);
  25.     // CS
  26.     (void)GPIO_Init(LCD_CS_PORT, LCD_CS_PIN, &stcGpioInit);
  27.     // BLK
  28.     (void)GPIO_Init(LCD_BLK_PORT, LCD_BLK_PIN, &stcGpioInit);

  29.     // SCLK MOSI 引脚设为复用模式
  30.     GPIO_SetFunc(LCD_POART, LCD_SCLK_PIN, LCD_SCLK_FUNC);
  31.     GPIO_SetFunc(LCD_POART, LCD_MOSI_PIN, LCD_MOSI_FUNC);

  32.     stc_spi_init_t stcSpiInit;
  33.     stc_spi_delay_t stcSpiDelayCfg;

  34.     // 使用默认参数初始化结构体
  35.     (void)SPI_StructInit(&stcSpiInit);
  36.     (void)SPI_DelayStructInit(&stcSpiDelayCfg);

  37.     // 开启SPI时钟
  38.     FCG_Fcg1PeriphClockCmd(SPI_FCG, ENABLE);

  39.     // 清空SPI配置
  40.     SPI_DeInit(LCD_SPI);

  41.     // 设置SPI必要参数
  42.     stcSpiInit.u32WireMode = SPI_3_WIRE; // SPI3线模式
  43.     stcSpiInit.u32TransMode = SPI_FULL_DUPLEX;
  44.     stcSpiInit.u32MasterSlave = SPI_MASTER; // SPI主机
  45.     stcSpiInit.u32ModeFaultDetect = SPI_MD_FAULT_DETECT_DISABLE;
  46.     stcSpiInit.u32SuspendMode = SPI_COM_SUSP_FUNC_OFF; // 不自动挂起
  47.     stcSpiInit.u32Parity = SPI_PARITY_INVD;            // 不开奇偶校验
  48.     stcSpiInit.u32SpiMode = SPI_MD_0;                  // 空闲低电平,奇数边沿采样
  49.     stcSpiInit.u32BaudRatePrescaler = SPI_BR_CLK_DIV2; //
  50.     stcSpiInit.u32DataBits = SPI_DATA_SIZE_8BIT;       // 一次传输8位
  51.     stcSpiInit.u32FirstBit = SPI_FIRST_MSB;            // 高位在前

  52.     // 初始化SPI
  53.     (void)SPI_Init(LCD_SPI, &stcSpiInit);

  54.     //         // 配置SPI延时必要参数
  55.     //         stcSpiDelayCfg.u32IntervalDelay = SPI_INTERVAL_TIME_1SCK; // t3:下次存取延时
  56.     //         stcSpiDelayCfg.u32ReleaseDelay = SPI_RELEASE_TIME_1SCK;   // t2:振荡停止到片选无效时间
  57.     //         stcSpiDelayCfg.u32SetupDelay = SPI_SETUP_TIME_1SCK;       // t1:片选有效到开始振荡时间
  58.     //         (void)SPI_DelayTimeConfig(LCD_SPI, &stcSpiDelayCfg);

  59.     // 使能SPI
  60.     SPI_Cmd(LCD_SPI, ENABLE);

  61.     // // CS 拉高
  62.     LCD_CS_Set();
  63. }

  64. /******************************************************************************
  65.       函数说明:LCD串行数据写入函数
  66.       入口数据:dat  要写入的串行数据
  67.       返回值:  无
  68. ******************************************************************************/
  69. void LCD_Writ_Bus(uint8_t dat)
  70. {
  71.     LCD_CS_Clr();

  72.     uint8_t RecvData = 0;

  73.     // 等待发送缓冲区为空
  74.     while (RESET == SPI_GetStatus(LCD_SPI, SPI_FLAG_TX_BUF_EMPTY))
  75.         ;

  76.     // 发送并接收数据
  77.     SPI_TransReceive(LCD_SPI, &dat, &RecvData, 1, HCLK_VALUE);

  78.     LCD_CS_Set();
  79. }

  80. /******************************************************************************
  81.       函数说明:LCD写入数据
  82.       入口数据:dat 写入的数据
  83.       返回值:  无
  84. ******************************************************************************/
  85. void LCD_WR_DATA8(uint8_t dat)
  86. {
  87.     LCD_DC_Set(); // 写数据
  88.     LCD_Writ_Bus(dat);
  89. }

  90. /******************************************************************************
  91.       函数说明:LCD写入数据
  92.       入口数据:dat 写入的数据
  93.       返回值:  无
  94. ******************************************************************************/
  95. void LCD_WR_DATA(uint16_t dat)
  96. {
  97.     LCD_Writ_Bus(dat >> 8);
  98.     LCD_Writ_Bus(dat & 0xff);
  99. }

  100. /******************************************************************************
  101.       函数说明:LCD写入命令
  102.       入口数据:dat 写入的命令
  103.       返回值:  无
  104. ******************************************************************************/
  105. void LCD_WR_REG(uint8_t dat)
  106. {
  107.     LCD_DC_Clr(); // 写命令
  108.     LCD_Writ_Bus(dat);
  109.     LCD_DC_Set(); // 写数据
  110. }

  111. /**
  112. * @brief       设置显示窗口
  113. * @param       x1:窗口列起始地址
  114. * @param       y1:坐标行起始地址
  115. * @param       x2:窗口列结束地址
  116. * @param       y2:坐标行结束地址
  117. * @retval      无
  118. */
  119. void LCD_Address_Set(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2)
  120. {
  121.     if (USE_HORIZONTAL == 0)
  122.     {
  123.         LCD_WR_REG(0x2a); // 列地址设置
  124.         LCD_WR_DATA(x1);
  125.         LCD_WR_DATA(x2);
  126.         LCD_WR_REG(0x2b); // 行地址设置
  127.         LCD_WR_DATA(y1);
  128.         LCD_WR_DATA(y2);
  129.         LCD_WR_REG(0x2c); // 储存器写
  130.     }
  131.     else if (USE_HORIZONTAL == 1)
  132.     {
  133.         LCD_WR_REG(0x2a); // 列地址设置
  134.         LCD_WR_DATA(x1);
  135.         LCD_WR_DATA(x2);
  136.         LCD_WR_REG(0x2b); // 行地址设置
  137.         LCD_WR_DATA(y1);
  138.         LCD_WR_DATA(y2);
  139.         LCD_WR_REG(0x2c); // 储存器写
  140.     }
  141.     else if (USE_HORIZONTAL == 2)
  142.     {
  143.         LCD_WR_REG(0x2a); // 列地址设置
  144.         LCD_WR_DATA(x1);
  145.         LCD_WR_DATA(x2);
  146.         LCD_WR_REG(0x2b); // 行地址设置
  147.         LCD_WR_DATA(y1);
  148.         LCD_WR_DATA(y2);
  149.         LCD_WR_REG(0x2c); // 储存器写
  150.     }
  151.     else
  152.     {
  153.         LCD_WR_REG(0x2a); // 列地址设置
  154.         LCD_WR_DATA(x1);
  155.         LCD_WR_DATA(x2);
  156.         LCD_WR_REG(0x2b); // 行地址设置
  157.         LCD_WR_DATA(y1);
  158.         LCD_WR_DATA(y2);
  159.         LCD_WR_REG(0x2c); // 储存器写
  160.     }
  161. }

  162. /**
  163. * @brief LCD初始化
  164. */
  165. void LCD_Init(void)
  166. {
  167.     // 初始化GPIO、SPI和DMA
  168.     LCD_GPIO_Init();

  169.     LCD_RES_Clr(); // 复位
  170.     DDL_DelayMS(120);
  171.     LCD_RES_Set();
  172.     DDL_DelayMS(120);
  173.     LCD_BLK_Set(); // 打开背光
  174.     DDL_DelayMS(120);

  175.     LCD_WR_REG(0x11);
  176.     // 延时至少120ms
  177.     DDL_DelayMS(120);

  178.     LCD_WR_REG(0x36);
  179.     if (USE_HORIZONTAL == 0)
  180.         LCD_WR_DATA8(0x00);
  181.     else if (USE_HORIZONTAL == 1)
  182.         LCD_WR_DATA8(0xC0);
  183.     else if (USE_HORIZONTAL == 2)
  184.         LCD_WR_DATA8(0x70);
  185.     else
  186.         LCD_WR_DATA8(0xA0);

  187.     LCD_WR_REG(0x3A);
  188.     LCD_WR_DATA8(0x05);

  189.     LCD_WR_REG(0xB2);
  190.     LCD_WR_DATA8(0x0C);
  191.     LCD_WR_DATA8(0x0C);
  192.     LCD_WR_DATA8(0x00);
  193.     LCD_WR_DATA8(0x33);
  194.     LCD_WR_DATA8(0x33);

  195.     LCD_WR_REG(0xB7);
  196.     LCD_WR_DATA8(0x35);

  197.     LCD_WR_REG(0xBB);
  198.     LCD_WR_DATA8(0x1A);

  199.     LCD_WR_REG(0xC0);
  200.     LCD_WR_DATA8(0x2C);

  201.     LCD_WR_REG(0xC2);
  202.     LCD_WR_DATA8(0x01);

  203.     LCD_WR_REG(0xC3);
  204.     LCD_WR_DATA8(0x0B);

  205.     LCD_WR_REG(0xC4);
  206.     LCD_WR_DATA8(0x20);

  207.     LCD_WR_REG(0xC6);
  208.     LCD_WR_DATA8(0x0F);

  209.     LCD_WR_REG(0xD0);
  210.     LCD_WR_DATA8(0xA4);
  211.     LCD_WR_DATA8(0xA1);

  212.     LCD_WR_REG(0x21);
  213.     LCD_WR_REG(0xE0);
  214.     LCD_WR_DATA8(0xF0);
  215.     LCD_WR_DATA8(0x00);
  216.     LCD_WR_DATA8(0x04);
  217.     LCD_WR_DATA8(0x04);
  218.     LCD_WR_DATA8(0x04);
  219.     LCD_WR_DATA8(0x05);
  220.     LCD_WR_DATA8(0x29);
  221.     LCD_WR_DATA8(0x33);
  222.     LCD_WR_DATA8(0x3E);
  223.     LCD_WR_DATA8(0x38);
  224.     LCD_WR_DATA8(0x12);
  225.     LCD_WR_DATA8(0x12);
  226.     LCD_WR_DATA8(0x28);
  227.     LCD_WR_DATA8(0x30);

  228.     LCD_WR_REG(0xE1);
  229.     LCD_WR_DATA8(0xF0);
  230.     LCD_WR_DATA8(0x07);
  231.     LCD_WR_DATA8(0x0A);
  232.     LCD_WR_DATA8(0x0D);
  233.     LCD_WR_DATA8(0x0B);
  234.     LCD_WR_DATA8(0x07);
  235.     LCD_WR_DATA8(0x28);
  236.     LCD_WR_DATA8(0x33);
  237.     LCD_WR_DATA8(0x3E);
  238.     LCD_WR_DATA8(0x36);
  239.     LCD_WR_DATA8(0x14);
  240.     LCD_WR_DATA8(0x14);
  241.     LCD_WR_DATA8(0x29);
  242.     LCD_WR_DATA8(0x32);

  243.     LCD_WR_REG(0x20); // 反色St7789

  244.     LCD_WR_REG(0x11);
  245.     LCD_Fill(0, 0, LCD_HEIGHT, LCD_WIDTH, 0x0000);
  246.     LCD_WR_REG(0x29);
  247.     test_var = 1000;
  248. }
  249. // void LCD_Fill(uint16_t xsta, uint16_t ysta, uint16_t xend, uint16_t yend, uint16_t color)
  250. // {
  251. //     uint16_t i, j;
  252. //     LCD_Address_Set(xsta, ysta, xend - 1, yend - 1);
  253. //     for (i = ysta; i < yend; i++)
  254. //     {
  255. //         for (j = xsta; j < xend; j++)
  256. //         {
  257. //             LCD_WR_DATA(color);
  258. //         }
  259. //     }
  260. // }
  261. void LCD_Fill(uint16_t sx, uint16_t sy, uint16_t ex, uint16_t ey, lv_color_t *color)
  262. {
  263.     uint16_t i, j;
  264.     uint32_t k = 0;
  265.     uint32_t x = 0, y = 0;
  266.     uint16_t height, width;
  267.     width = ex - sx + 1;  // 得到填充的宽度
  268.     height = ey - sy + 1; // 高度

  269.     LCD_Address_Set(sx, sy, ex, ey);

  270.     for (y = 0; y < width * height; y++)
  271.     {
  272.         LCD_WR_DATA(color->full);
  273.         color++;
  274.     }
  275. }
复制代码

回复

使用道具 举报

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

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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