查看: 855|回复: 1

【瑞萨RA4系列开发板体验】第四章 SPI驱动TFT

[复制链接]

116

主题

134

帖子

3790

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3790
发表于 2023-1-31 14:09:06 | 显示全部楼层 |阅读模式
【瑞萨RA4系列开发板体验】第四章 SPI驱动TFT
作者:无言的朝圣

第四章 SPI驱动TFT
       本章节主要进行SPI的体验,包括FSP的配置和TFT驱动的配合设计。
一、了解SPI
       SPI,是英语Serial Peripheral interface的缩写,顾名思义就是串行外围设备接口,是一种高速全双工的通信总线。
       SPI的通信原理很简单,它以主从方式工作,这种模式通常有一个主设备和一个或多个从设备,需要至少4根线,事实上3根也可以(单向数据传输时)。这四根线分别是MISO、MOSI、SCLK、CS,具体的描述见下表:
      MISO– Master Input Slave Output,主设备数据输入,从设备数据输出;
      MOSI– Master Output Slave Input,主设备数据输出,从设备数据输入;
      SCLK – Serial Clock,时钟信号,由主设备产生;
      CS – Chip Select,从设备使能信号,由主设备控制。
      注意:CS是控制芯片是否被选中的,也就是说只有片选信号为预先规定的使能信号时(一般默认为低电位),对此芯片的操作才有效,这就允许在同一总线上连接多个SPI设备成为可能,通过多个CS来控制。
二、TFT的硬件需求
      本次体验的TFT液晶屏为1.54吋,IPS高清显示,分辨率240*240,驱动芯片为ST7789,支持MCU和SPI两种通信方式,这一次是需要体验SPI,故在设计时M0~M2做出的相对应的选择,同时根据厂家的介绍,SPI通信时只能作为从机接收数据,所以只用到了CS、MOSI和SCK。液晶屏接口如下图:


      除了SPI接口,还需要背光控制、液晶屏复位、命令/数据接口,这三个控制都是通过GPIO输出控制的。
三、SPI输出体验
1、硬件设计


2、软件设计
     在之前工程基础上,打开FSP配置界面。在FSP 配置界面里面点开“Stacks→Connectivity→SPI(r_spi)”,如下图:


      在进行引脚配置时出现了问题,如下图:

      引脚无法配置导致SPI的配置是失败的,一直提示红色:

       引脚都不能配置,难道这个芯片不能用SPI吗?显然是不是的,开发板有外引出两个SCI接口,其中包含SPI,IIC,串口等等,接下来我们就建立一个SCI-SPI,如下图:
      SPI的配置如下:

      接下来是引脚配置,在Pins-Peripherals-Connectivity:SCI-SCI0中配置引脚,注意对应关系,满足第三章第一节的对应.生成代码就可以.
3、工程函数编写
      那需要如何使用生成的函数呢?
      首先需要在需要在 "hal_entry.c"中重新定义sci0_spi0_callback(spi_callback_args_t * p_args),注意这个回调函数是和配置中的回调函数名是一致的;

  1. oid sci0_spi0_callback (spi_callback_args_t * p_args)
  2. {
  3.     if (SPI_EVENT_TRANSFER_COMPLETE == p_args->event)
  4.     {
  5.         g_transfer_complete = true;
  6.     }
  7. }
  8. 接着是打开SPI;
  9. //******************************************************************************
  10. //* 函数名称  : Tmr0_GPT_init
  11. //* 函数描述  : 开启定时器
  12. //* 输入参数  :     
  13. //* 参数描述  : 对应 ms   
  14. //* 输出参数  : 无
  15. //* 返回值    : 无
  16. //******************************************************************************
  17. void SPI0_init(void)
  18. {
  19.   fsp_err_t err = FSP_SUCCESS;
  20.   /* Initialize the SPI module. */
  21.   err = R_SCI_SPI_Open(&g_spi0_ctrl, &g_spi0_cfg);
  22.   /* Handle any errors. This function should be defined by the user. */
  23.   assert(FSP_SUCCESS == err);
  24. }
复制代码
      接下来就是向LCD通过SPI发送数据的控制:
  1. ///************************************宏定义************************************/
  2. #define TFT_RS_set              R_BSP_PinWrite (BSP_IO_PORT_01_PIN_05, BSP_IO_LEVEL_HIGH)
  3. #define TFT_RS_reset            R_BSP_PinWrite (BSP_IO_PORT_01_PIN_05, BSP_IO_LEVEL_LOW)
  4. #define TFT_CS_set              R_BSP_PinWrite (BSP_IO_PORT_01_PIN_06, BSP_IO_LEVEL_LOW)
  5. #define TFT_CS_reset            R_BSP_PinWrite (BSP_IO_PORT_01_PIN_06, BSP_IO_LEVEL_HIGH)
  6. #define TFT_BL_SET              R_BSP_PinWrite (BSP_IO_PORT_01_PIN_14, BSP_IO_LEVEL_HIGH)
  7. #define TFT_BL_RESET            R_BSP_PinWrite (BSP_IO_PORT_01_PIN_14, BSP_IO_LEVEL_LOW)

  8. #define TFT_RESET_set           R_BSP_PinWrite (BSP_IO_PORT_01_PIN_07, BSP_IO_LEVEL_HIGH)
  9. #define TFT_RESET_reset         R_BSP_PinWrite (BSP_IO_PORT_01_PIN_07, BSP_IO_LEVEL_LOW
  10. /***********************************变量声明***********************************/
  11. bool g_transfer_complete = false;

  12. /***********************************函数声明***********************************/
  13. void delay_ms(uint32_t nms);
  14. void SPI0_SendData(uint8_t Data);
  15. void LCD_WR_COMM(uint8_t COMM);
  16. void LCD_WR_DATA(uint8_t DATA);

  17. //******************************************************************************
  18. //* 函数名称  : TFT_WR_COMM(uint8_tCOMM)
  19. //* 函数描述  : 发送指令
  20. //* 输入参数  : COMM
  21. //* 参数描述  : 具体的指令代码
  22. //* 输出参数  : 无
  23. //* 返回值    : 无
  24. //******************************************************************************   
  25. void delay_ms(uint32_t nms)
  26. {                                                            
  27.   R_BSP_SoftwareDelay(nms, BSP_DELAY_UNITS_MICROSECONDS);                                                            
  28. }

  29. //******************************************************************************
  30. //* 函数名称  : TFT_WR_COMM(uint8_tCOMM)
  31. //* 函数描述  : 发送指令
  32. //* 输入参数  : COMM
  33. //* 参数描述  : 具体的指令代码
  34. //* 输出参数  : 无
  35. //* 返回值    : 无
  36. //******************************************************************************   
  37. void SPI0_SendData(uint8_t Data)
  38. {
  39.   
  40.   fsp_err_t err = FSP_SUCCESS;
  41.   TFT_CS_set;
  42.   /* Start a write/read transfer */
  43.   g_transfer_complete = false;
  44.   
  45.   err = R_SCI_SPI_Write (&g_spi0_ctrl,&Data,1, SPI_BIT_WIDTH_8_BITS);
  46.   assert(FSP_SUCCESS == err);
  47.   /* Wait for SPI_EVENT_TRANSFER_COMPLETE callback event. */
  48.   while (false == g_transfer_complete)
  49.   {
  50.       ;
  51.   }
  52.   TFT_CS_reset;
  53.   /* Wait for minimum time required between transfers. */
  54.   R_BSP_SoftwareDelay(3, BSP_DELAY_UNITS_MICROSECONDS);
  55.                                                       
  56. }

  57. //******************************************************************************
  58. //* 函数名称  : TFT_WR_COMM(uint8_tCOMM)
  59. //* 函数描述  : 发送指令
  60. //* 输入参数  : COMM
  61. //* 参数描述  : 具体的指令代码
  62. //* 输出参数  : 无
  63. //* 返回值    : 无
  64. //******************************************************************************   
  65. void LCD_WR_COMM(uint8_t COMM)
  66. {
  67.   TFT_RS_reset;
  68.   SPI0_SendData(COMM);
  69.                                                            
  70. }

  71. //******************************************************************************
  72. //* 函数名称  : TFT_WR_DATA(uint8_t DATA)
  73. //* 函数描述  : 发送数据
  74. //* 输入参数  : DATA
  75. //* 参数描述  : 发送的具体的数据代码
  76. //* 输出参数  : 无
  77. //* 返回值    : 无
  78. //******************************************************************************  
  79. void LCD_WR_DATA(uint8_t DATA)
  80. {
  81.   TFT_RS_set;
  82.   SPI0_SendData(DATA);  
复制代码


      TFT驱动成功!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

3

主题

195

帖子

1168

积分

金牌会员

Rank: 6Rank: 6

积分
1168
发表于 2023-3-14 11:21:01 | 显示全部楼层

不错,学习一下
回复

使用道具 举报

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

本版积分规则

用户排行榜

RA助手

主题: 116帖子:134精华:0

RA_Lance

主题: 93帖子:136精华:9

lugl

主题: 52帖子:150精华:1

xujiwei263

主题: 18帖子:86精华:0

Juggernaut

主题: 12帖子:118精华:0

books咦

主题: 11帖子:11精华:2
快速回复 返回顶部 返回列表