【沁恒微CH32V307评估板试用体验】SPI驱动ST7735时序 - RISC-V MCU技术社区 - 电子技术william hill官网 - 广受欢迎的专业电子william hill官网 - 威廉希尔官方网站
分享 收藏 返回

[问答]

【沁恒微CH32V307评估板试用体验】SPI驱动ST7735时序

驱动LCD是单片常用外设之一,我这里书写SPI驱动后,驱动ST7735不成功,将驱动与时序附下,希望得到沁恒官网的支持:
ST7735初始化:
  1. //              ----------------------------------------------------------------
  2. //              GND   
  3. //              VCC   3.3
  4. //              SCL   PA5
  5. //              SDA   PA7
  6. //              RES   PD2
  7. //              DC    PD3
  8. //              CS    PA4
  9. //              BLK   PD4
  10. //              ----------------------------------------------------------------
  11. #include "ch32v30x.h"



  12. #define SOFTWARE_SPI_ENABLE    1

  13. #define LCD_RES_Clr()   GPIO_ResetBits(GPIOD,GPIO_Pin_2)//RES  rst
  14. #define LCD_RES_Set()  GPIO_SetBits(GPIOD,GPIO_Pin_2)

  15. #define LCD_DC_Clr()    GPIO_ResetBits(GPIOD,GPIO_Pin_3)//DC  data command select
  16. #define LCD_DC_Set()   GPIO_SetBits(GPIOD,GPIO_Pin_3)

  17. #define LCD_BLK_LOW()   GPIO_ResetBits(GPIOD,GPIO_Pin_4)//BLK
  18. #define LCD_BLK_Set()  GPIO_SetBits(GPIOD,GPIO_Pin_4)

  19. #define LCD_CS_Clr()    GPIO_ResetBits(GPIOA,GPIO_Pin_4)//CS
  20. #define LCD_CS_Set()   GPIO_SetBits(GPIOA,GPIO_Pin_4)

  21. void LCD_GPIO_Init(void)
  22. {
  23.     GPIO_InitTypeDef GPIO_InitStructure = {0};
  24.     SPI_InitTypeDef  SPI_InitStructure = {0};

  25.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_SPI1, ENABLE);
  26.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);

  27.     //DCRESBLK
  28.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 ;
  29.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  30.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  31.     GPIO_Init(GPIOD, &GPIO_InitStructure);
  32.     //CS--PA4
  33.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
  34.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  35.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  36.     GPIO_Init(GPIOA, &GPIO_InitStructure);
  37.     /* chip select invalid*/
  38.     LCD_CS_Set();

  39.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
  40.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  41.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  42.     GPIO_Init(GPIOA, &GPIO_InitStructure);

  43.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
  44.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOAtiNG;
  45.     GPIO_Init(GPIOA, &GPIO_InitStructure);

  46.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
  47.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  48.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  49.     GPIO_Init(GPIOA, &GPIO_InitStructure);

  50.     LCD_CS_Set();
  51.     SPI_InitStructure.SPI_Direction = SPI_Direction_1Line_Tx;
  52.     SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
  53.     SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
  54.     SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;
  55.     SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;
  56.     SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
  57.     SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_64;
  58.     SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
  59.     SPI_InitStructure.SPI_CRCPolynomial = 7;
  60.     SPI_Init(SPI1, &SPI_InitStructure);

  61.    SPI_Cmd(SPI1, ENABLE);

  62. }


  63. void LCD_Writ_Bus(uint8_t dat)
  64. {
  65.     LCD_CS_Clr();
  66.     if(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) != RESET)
  67.     {
  68.         SPI_I2S_SendData(SPI1, dat);
  69.     }
  70.     //rt_thread_mdelay(1);
  71.    LCD_CS_Set();
  72. }


  73. /******************************************************************************
  74.       函数说明:LCD写入数据
  75.       入口数据:dat 写入的数据
  76.       返回值:  无
  77. ******************************************************************************/
  78. void LCD_WR_DATA8(uint8_t dat)
  79. {
  80.     LCD_Writ_Bus(dat);
  81. }


  82. /******************************************************************************
  83.       函数说明:LCD写入数据
  84.       入口数据:dat 写入的数据
  85.       返回值:  无
  86. ******************************************************************************/
  87. void LCD_WR_DATA(uint16_t dat)
  88. {
  89.     LCD_Writ_Bus(dat>>8);
  90.     LCD_Writ_Bus(dat);
  91. }


  92. /******************************************************************************
  93.       函数说明:LCD写入命令
  94.       入口数据:dat 写入的命令
  95.       返回值:  无
  96. ******************************************************************************/
  97. void LCD_WR_REG(uint8_t dat)
  98. {
  99.     LCD_DC_Clr();//写命令
  100.     LCD_Writ_Bus(dat);
  101.     LCD_DC_Set();//写数据
  102. }

  103. void LCD_Init(void)
  104. {
  105.     LCD_GPIO_Init();//初始化GPIO

  106.     LCD_RES_Clr();//复位
  107.     rt_thread_mdelay(10);
  108.     LCD_RES_Set();
  109.     rt_thread_mdelay(10);

  110.     LCD_BLK_Set();//打开背光
  111.     rt_thread_mdelay(10);

  112.     //************* Start Initial Sequence **********//
  113.     LCD_WR_REG(0x11); //Sleep out
  114.     rt_thread_mdelay(20);              //Delay 120ms
  115.     //------------------------------------ST7735S Frame Rate-----------------------------------------//
  116.     LCD_WR_REG(0xB1);
  117.     LCD_WR_DATA8(0x05);
  118.     LCD_WR_DATA8(0x3C);
  119.     LCD_WR_DATA8(0x3C);
  120.     LCD_WR_REG(0xB2);
  121.     LCD_WR_DATA8(0x05);
  122.     LCD_WR_DATA8(0x3C);
  123.     LCD_WR_DATA8(0x3C);
  124.     LCD_WR_REG(0xB3);
  125.     LCD_WR_DATA8(0x05);
  126.     LCD_WR_DATA8(0x3C);
  127.     LCD_WR_DATA8(0x3C);
  128.     LCD_WR_DATA8(0x05);
  129.     LCD_WR_DATA8(0x3C);
  130.     LCD_WR_DATA8(0x3C);
  131.     //------------------------------------End ST7735S Frame Rate---------------------------------//
  132.     LCD_WR_REG(0xB4); //Dot inversion
  133.     LCD_WR_DATA8(0x03);
  134.     //------------------------------------ST7735S Power Sequence---------------------------------//
  135.     LCD_WR_REG(0xC0);
  136.     LCD_WR_DATA8(0x28);
  137.     LCD_WR_DATA8(0x08);
  138.     LCD_WR_DATA8(0x04);
  139.     LCD_WR_REG(0xC1);
  140.     LCD_WR_DATA8(0XC0);
  141.     LCD_WR_REG(0xC2);
  142.     LCD_WR_DATA8(0x0D);
  143.     LCD_WR_DATA8(0x00);
  144.     LCD_WR_REG(0xC3);
  145.     LCD_WR_DATA8(0x8D);
  146.     LCD_WR_DATA8(0x2A);
  147.     LCD_WR_REG(0xC4);
  148.     LCD_WR_DATA8(0x8D);
  149.     LCD_WR_DATA8(0xEE);
  150.     //---------------------------------End ST7735S Power Sequence-------------------------------------//
  151.     LCD_WR_REG(0xC5); //VCOM
  152.     LCD_WR_DATA8(0x1A);
  153.     LCD_WR_REG(0x36); //MX, MY, RGB mode
  154.     if(USE_HORIZONTAL==0)LCD_WR_DATA8(0x00);
  155.     else if(USE_HORIZONTAL==1)LCD_WR_DATA8(0xC0);
  156.     else if(USE_HORIZONTAL==2)LCD_WR_DATA8(0x70);
  157.     else LCD_WR_DATA8(0xA0);
  158.     //------------------------------------ST7735S Gamma Sequence---------------------------------//
  159.     LCD_WR_REG(0xE0);
  160.     LCD_WR_DATA8(0x04);
  161.     LCD_WR_DATA8(0x22);
  162.     LCD_WR_DATA8(0x07);
  163.     LCD_WR_DATA8(0x0A);
  164.     LCD_WR_DATA8(0x2E);
  165.     LCD_WR_DATA8(0x30);
  166.     LCD_WR_DATA8(0x25);
  167.     LCD_WR_DATA8(0x2A);
  168.     LCD_WR_DATA8(0x28);
  169.     LCD_WR_DATA8(0x26);
  170.     LCD_WR_DATA8(0x2E);
  171.     LCD_WR_DATA8(0x3A);
  172.     LCD_WR_DATA8(0x00);
  173.     LCD_WR_DATA8(0x01);
  174.     LCD_WR_DATA8(0x03);
  175.     LCD_WR_DATA8(0x13);
  176.     LCD_WR_REG(0xE1);
  177.     LCD_WR_DATA8(0x04);
  178.     LCD_WR_DATA8(0x16);
  179.     LCD_WR_DATA8(0x06);
  180.     LCD_WR_DATA8(0x0D);
  181.     LCD_WR_DATA8(0x2D);
  182.     LCD_WR_DATA8(0x26);
  183.     LCD_WR_DATA8(0x23);
  184.     LCD_WR_DATA8(0x27);
  185.     LCD_WR_DATA8(0x27);
  186.     LCD_WR_DATA8(0x25);
  187.     LCD_WR_DATA8(0x2D);
  188.     LCD_WR_DATA8(0x3B);
  189.     LCD_WR_DATA8(0x00);
  190.     LCD_WR_DATA8(0x01);
  191.     LCD_WR_DATA8(0x04);
  192.     LCD_WR_DATA8(0x13);
  193.     //------------------------------------End ST7735S Gamma Sequence-----------------------------//
  194.     LCD_WR_REG(0x3A); //65k mode
  195.     LCD_WR_DATA8(0x05);
  196.     LCD_WR_REG(0x29); //Display on
  197. }



初始化执行

LCD_Init();
LCD_ShowString(0,0,"CH32V307",WHITE,BLACK,16,0);
得到的时序图为:
ST7735初始化时序图1.png
时序图2.png
时序图3.png
希望得到官方的帮助!

回帖(3)

华仔stm32

2023-5-1 16:42:15
看你的spi驱动初始化,你的spi分频系数太高的。总线速度只能50Hz。

我原来是分为4是可以用的。
  1. void LCD_GPIO_Init(void)
  2. {
  3.     GPIO_InitTypeDef GPIO_InitStructure={0};
  4.     SPI_InitTypeDef SPI_InitStructure={0};
  5.     RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA | RCC_APB2Periph_SPI1, ENABLE );
  6.     /* 初始化CS、BLK、DC、RES  */
  7.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);
  8.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4;
  9.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  10.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  11.     GPIO_Init( GPIOD, &GPIO_InitStructure );
  12.     //CS
  13.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
  14.     GPIO_Init( GPIOA, &GPIO_InitStructure );
  15.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
  16.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  17.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  18.     GPIO_Init( GPIOA, &GPIO_InitStructure );
  19.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
  20.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  21.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  22.     GPIO_Init( GPIOA, &GPIO_InitStructure );
  23.     SPI_InitStructure.SPI_Direction = SPI_Direction_1Line_Tx;
  24.     SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
  25.     SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
  26.     SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;
  27.     SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;
  28.     SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
  29.     SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4;
  30.     SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
  31.     SPI_InitStructure.SPI_CRCPolynomial = 7;
  32.     SPI_Init(SPI1, &SPI_InitStructure);
  33.     SPI_Cmd( SPI1, ENABLE );
  34. }

trucy

2023-5-3 19:02:43
你要确认屏幕是3wire或者4wire还有确认你的操作时序是否正确
你的时序图看着也不对

华仔stm32

2023-6-8 09:19:02
我看了你的时序图,时钟频率50Hz,频率太低了,最小也得400KHz吧。正如楼上所说,你的分频系数太大了,导至频率太低,通信不符合LCD的最低通信速率。

更多回帖

×
发帖