[开发板] CW32L010开发板尝鲜体验+驱动TFT屏幕ST7735S

[复制链接]
2705|5
 楼主| gaoyang9992006 发表于 2024-11-14 22:02 | 显示全部楼层 |阅读模式
第一句:认真看原理图
SPI的使用其实很简单,但是驱动SPI接口的TFT还需要几个IO配合,RST、CS、DC
根据原理图选择合适的引脚使用,至关重要
  1. #define ST7735_RST_Pin       GPIO_PIN_5
  2. #define ST7735_RST_GPIO_Port CW_GPIOB

  3. #define ST7735_DC_Pin        GPIO_PIN_6
  4. #define ST7735_DC_GPIO_Port  CW_GPIOB

  5. #define ST7735_CS_Pin        GPIO_PIN_2
  6. #define ST7735_CS_GPIO_Port  CW_GPIOA

  7. #define ST7735_SCK_Pin         GPIO_PIN_5
  8. #define ST7735_SCK_GPIO_Port   CW_GPIOA

  9. #define ST7735_MOSI_Pin        GPIO_PIN_4
  10. #define ST7735_MOSI_GPIO_Port  CW_GPIOA

  11. #define ST7735_SPI  CW_SPI
然后就可以愉快的使用这些映射合适引脚的宏和外设了
  1. GPIO_InitTypeDef GPIO_InitStructure;       
  2.                 //推挽输出
  3.         GPIO_InitStructure.Pins = ST7735_CS_Pin;
  4.         GPIO_InitStructure.IT = GPIO_IT_NONE;
  5.         GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;
  6.         GPIO_Init(ST7735_CS_GPIO_Port, &GPIO_InitStructure);       

  7.         GPIO_InitStructure.Pins = ST7735_DC_Pin;
  8.         GPIO_Init(ST7735_DC_GPIO_Port, &GPIO_InitStructure);       

  9.         GPIO_InitStructure.Pins = ST7735_RST_Pin;
  10.         GPIO_Init(ST7735_RST_GPIO_Port, &GPIO_InitStructure);       
  11.        
  12.         GPIO_InitStructure.Pins = ST7735_SCK_Pin;
  13.         GPIO_Init(ST7735_SCK_GPIO_Port, &GPIO_InitStructure);
  14.        
  15.         GPIO_InitStructure.Pins = ST7735_MOSI_Pin;
  16.         GPIO_Init(ST7735_MOSI_GPIO_Port, &GPIO_InitStructure);

  17.         PA05_AFx_SPI1SCK();
  18.         PA04_AFx_SPI1MOSI();
  19.         SYSCTRL_APBPeriphClk_Enable1(SYSCTRL_APB1_PERIPH_SPI, ENABLE);
  20.        
  21.         SPI_InitTypeDef SPI_InitStructure;
  22.         SPI_InitStructure.SPI_Direction = SPI_Direction_1Line_TxOnly;         //单工只发
  23.         SPI_InitStructure.SPI_Mode = SPI_Mode_Master;                         // 主机模式
  24.         SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;                     // 帧数据长度为8bit
  25.         SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;                           // 时钟空闲电平为高
  26.         SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;                          // 第2个边沿采样
  27.         SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;                             // 片选信号由SSI寄存器控制
  28.         SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4;    // 波特率为PCLK的4分频
  29.         SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;                    // 最高有效位 MSB 收发在前
  30.         SPI_InitStructure.SPI_Speed = SPI_Speed_Low;                          // 低速SPI
  31.         SPI_Init(ST7735_SPI, &SPI_InitStructure);
  32.         SPI_Cmd(ST7735_SPI, ENABLE);
接下来就可以调用库函数执行相关的数据传输指令了
  1. void ST7735_delay(uint8_t i)
  2. {
  3.         delay1ms(i);
  4. }

  5. void ST7735_SPI_SendByte(uint8_t byte)
  6. {
  7. //        判断是否可以继续发送放在之后判断可以避免CS拉高后还没发送结束。可以确保每一次发送都是成功的。
  8.         SPI_SendData(ST7735_SPI, byte);
  9.         while(SPI_GetFlagStatus(ST7735_SPI, SPI_FLAG_TXE) == RESET);
  10. }

  11. void ST7735_SPI_RST_SetLow(void)
  12. {
  13.         GPIO_WritePin(ST7735_RST_GPIO_Port,ST7735_RST_Pin,GPIO_Pin_RESET);
  14. }
  15. void ST7735_SPI_RST_SetHigh(void)
  16. {
  17.         GPIO_WritePin(ST7735_RST_GPIO_Port,ST7735_RST_Pin,GPIO_Pin_SET);
  18. }

  19. void ST7735_SPI_CS_SetLow(void)
  20. {
  21.         GPIO_WritePin(ST7735_CS_GPIO_Port,ST7735_CS_Pin,GPIO_Pin_RESET);
  22. }
  23. void ST7735_SPI_CS_SetHigh(void)
  24. {
  25.         GPIO_WritePin(ST7735_CS_GPIO_Port,ST7735_CS_Pin,GPIO_Pin_SET);
  26. }

  27. void ST7735_SPI_DC_SetLow(void)
  28. {
  29.         GPIO_WritePin(ST7735_DC_GPIO_Port,ST7735_DC_Pin,GPIO_Pin_RESET);
  30. }
  31. void ST7735_SPI_DC_SetHigh(void)
  32. {
  33.         GPIO_WritePin(ST7735_DC_GPIO_Port,ST7735_DC_Pin,GPIO_Pin_SET);
  34. }

  35. /*
  36. 以下函数不用修改,以下函数调用上面的几个基础函数完成ST7735接口的操作。
  37. */

  38. void ST7735_Reset(void)
  39. {
  40.         ST7735_SPI_RST_SetLow();
  41.         ST7735_delay(100);
  42.         ST7735_SPI_RST_SetHigh();
  43.         ST7735_delay(100);
  44. }

  45. void ST7735_WriteCommand(uint8_t cmd)
  46. {
  47.         ST7735_SPI_CS_SetLow();
  48.         ST7735_SPI_DC_SetLow();       
  49.         ST7735_SPI_SendByte(cmd);
  50.         ST7735_SPI_CS_SetHigh();
  51. }

  52. void ST7735_WriteByte(uint8_t data)
  53. {
  54.         ST7735_SPI_CS_SetLow();
  55.         ST7735_SPI_DC_SetHigh();
  56.         ST7735_SPI_SendByte(data);
  57.         ST7735_SPI_CS_SetHigh();
  58. }

  59. void ST7735_WriteData(uint8_t *data, size_t data_size)
  60. {
  61.         ST7735_SPI_CS_SetLow();
  62.         ST7735_SPI_DC_SetHigh();
  63.         for(int i=0;i<data_size;i++) ST7735_SPI_SendByte(*(data+i));
  64.         ST7735_SPI_CS_SetHigh();
  65. }
在主函数完成代码
  1. int32_t main(void)
  2. {       

  3.     SYSCTRL_HSI_Enable(SYSCTRL_HSIOSC_DIV12);   
  4.     __SYSCTRL_GPIOA_CLK_ENABLE();
  5.     __SYSCTRL_GPIOB_CLK_ENABLE();         
  6.        
  7.         GPIO_InitTypeDef GPIO_InitStructure;       
  8.                 //推挽输出
  9.         GPIO_InitStructure.IT = GPIO_IT_NONE;
  10.         GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;
  11.         GPIO_InitStructure.Pins = GPIO_PIN_2;
  12.         GPIO_Init(CW_GPIOB, &GPIO_InitStructure);
  13.        
  14.        
  15.         GPIO_InitStructure.Pins = ST7735_CS_Pin;
  16.         GPIO_Init(ST7735_CS_GPIO_Port, &GPIO_InitStructure);       

  17.         GPIO_InitStructure.Pins = ST7735_DC_Pin;
  18.         GPIO_Init(ST7735_DC_GPIO_Port, &GPIO_InitStructure);       

  19.         GPIO_InitStructure.Pins = ST7735_RST_Pin;
  20.         GPIO_Init(ST7735_RST_GPIO_Port, &GPIO_InitStructure);       
  21.        
  22.         GPIO_InitStructure.Pins = ST7735_SCK_Pin;
  23.         GPIO_Init(ST7735_SCK_GPIO_Port, &GPIO_InitStructure);
  24.        
  25.         GPIO_InitStructure.Pins = ST7735_MOSI_Pin;
  26.         GPIO_Init(ST7735_MOSI_GPIO_Port, &GPIO_InitStructure);
  27.        
  28.         SPI_Configuration();
  29.        
  30.         ST7735_Init();
  31.         ST7735_FillScreen(ST7735_BLACK);
  32.         ST7735_DrawRectangle(0,0,10,5,ST7735_YELLOW);
  33.         ST7735_DrawRectangle(15,5,10,20,ST7735_BLUE);       
  34.         ST7735_DrawRectangle(30,25,10,10,ST7735_RED);       
  35.         ST7735_DrawString(0,35,"Hello",ST7735_GREEN,ST7735_BLACK,&Font_11x18);
  36.         ST7735_DrawString(0,55,"Hello",ST7735_MAGENTA,ST7735_BLACK,&Font_7x10);

  37.         while(1)
  38.         {
  39.                 GPIO_WritePin(CW_GPIOB,GPIO_PIN_2,GPIO_Pin_RESET);               
  40.                 Delay(0xFFFF);

  41.                 GPIO_WritePin(CW_GPIOB,GPIO_PIN_2,GPIO_Pin_SET);               
  42.                 Delay(0xFFFF);
  43.         }


  44. }
编译烧录,点亮屏幕
微信图片_20241114220215.jpg
小小蚂蚁举千斤 发表于 2024-11-22 09:29 来自手机 | 显示全部楼层
SPI驱动案例还是非常不错的
 楼主| gaoyang9992006 发表于 2024-11-24 14:29 | 显示全部楼层
中国龙芯CDX 发表于 2024-11-24 19:26 | 显示全部楼层
SPI驱动还是非常有必要的
feifeiniao 发表于 2025-6-26 14:27 | 显示全部楼层
参考参考代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:如果你觉得我的分享或者答复还可以,请给我点赞,谢谢。

2052

主题

16403

帖子

222

粉丝
快速回复 在线客服 返回列表 返回顶部