首页 > 其他分享 >Renesas MCU之SCI_SPI接口驱动LCD

Renesas MCU之SCI_SPI接口驱动LCD

时间:2024-06-09 09:58:11浏览次数:16  
标签:SCI spi FSP SPI LCD IO

目录

概述

1 软硬件介绍

1.1 软件版本信息

1.2 ST7796-LCD

1.3 MCU IO与LCD PIN对应关系

2 FSP配置项目

2.1 配置项目参数

2.2 生成项目框架

3 代码实现 

3.1 SPI的库函数

3.1.1 R_SCI_SPI_Open()

3.1.2  R_SCI_SPI_Read()

3.1.3  R_SCI_SPI_Write()

3.2 应用函数接口

3.2.1 SPI初始化函数

3.2.2  读数据接口

3.2.3 写数据接口

3.2.4 回调函数

3.2.5 SPI应用程序源代码 

3.3 LCD驱动程序实现

3.3.1 驱动代码

3.3.2 测试代码实现

4 测试结果


概述

本文主要介绍使用Renesas MCU之SPI读写数据功能,包括硬件资源介绍,FSP配置项目的方法,还介绍了SCI_SPI的接口函数,笔者使用一款SPI接口类型的LCD作为Device,使用SCI_SPI接口驱动该LCD,还编写测试函数验证其功能。

1 软硬件介绍

1.1 软件版本信息

软硬件信息版本信息
Renesas MCUR7FA4M2AD3C
KeilMDK ARM 5.38
FSP 版本5.3.0
调试工具:st-linkST-LINK/V2-1

 注意:

在Keil MDK中可以更改FSP的版本,方法如下

1.2 ST7796-LCD

LCD的PIN引脚功能介绍

序号模块引脚引脚说明
1VCC屏电源正
2GND屏电源地
3LCD_CS液晶屏片选控制信号,低电平有效
4LCD_RST液晶屏复位控制信号,低电平复位
5LCD_RS液晶屏命令/数据选择控制信号

高电平:数据,低电平:命令

6SDI(MOSI)SPI总线写数据信号(SD卡和液晶屏共用)
7SCKSPI总线时钟信号(SD卡和液晶屏共用)
8LED液晶屏背光控制信号(如需要控制,请接引脚,如不需要控制,可以不接)
9SDO(MISO)SPI总线读数据信号(SD卡和液晶屏共用)
10CTP_SCL电容触摸屏IIC总线时钟信号(无触摸屏的模块不需连接)
11CTP_RST电容触摸屏复位控制信号,低电平复位(无触摸屏的模块不需连接)
12CTP_SDA电容触摸屏IIC总线数据信号(无触摸屏的模块不需连接)
13CTP_INT电容触摸屏IIC总线触摸中断信号,产生触摸时,输入低电平到主控(无触摸屏的模块不需连接)
14SD_CSSD卡片选控制信号,低电平有效(不使用SD卡功能,可不接)

实体LCD Port对应关系如下图所示

1.3 MCU IO与LCD PIN对应关系

RA4M2 PIN引脚LCD PIN引脚
BSP_IO_PORT_01_PIN_01MOSI
BSP_IO_PORT_01_PIN_00MISO
BSP_IO_PORT_01_PIN_02SCK
BSP_IO_PORT_01_PIN_05CS
BSP_IO_PORT_01_PIN_06RST
BSP_IO_PORT_01_PIN_03RS

2 FSP配置项目

2.1 配置项目参数

1)配置系统工作时钟,笔者的开发板使用的外部晶振为12M Hz

2) 在Pins面板上使能SCI0配置,选择IO口如下

 3)在stack面板上创建SPI模块

 4)配置SPI的相关参数

2.2 生成项目框架

 完成参数配置之后,就可以生成项目框架,点击Generate project就可以生成项目代码,使用Keil打开项目,其结构如下:

3 代码实现 

3.1 SPI的库函数

3.1.1 R_SCI_SPI_Open()

函数原型:


fsp_err_t R_SCI_SPI_Open( spi_ctrl_t * 	p_api_ctrl,
                              spi_cfg_t const *const 	p_cfg )	

函数功能: 初始化SPI通信模式

该函数的主要任务如下:

1)执行参数检查和处理错误条件。
2)开启SCI通道时钟。
3)使用默认值和用户可配置选项初始化相关的寄存器。
4)提供与其他API函数一起使用的通道句柄。

参数介绍:

p_api_ctrlPointer to the control structure.
p_cfg

Pointer to a configuration structure.

返回值:
FSP_SUCCESSChannel initialized successfully.
FSP_ERR_ASSERTIONAn input parameter is invalid or NULL.
FSP_ERR_ALREADY_OPENThe instance has already been opened.
FSP_ERR_IP_CHANNEL_NOT_PRESENTThe channel number is invalid.

3.1.2  R_SCI_SPI_Read()

函数原型:

fsp_err_t R_SCI_SPI_Read	(	spi_ctrl_t *const 	p_api_ctrl,
                                void * 	p_dest,
                                uint32_t const 	length,
                                spi_bit_width_t const 	bit_width )	

函数功能:从SPI设备接收数据。

该函数的主要任务如下:

1)执行参数检查和处理错误条件。
2)使发射机。
3)使接收机。
4)启用中断。
5)通过向TXD寄存器写入数据来启动数据传输。
6)从接收缓冲区接收数据发生完全中断,并将数据复制到目标缓冲区。
7)通过接收缓冲区完全中断和发送虚拟数据完成数据接收。
8)禁用发射机。
9)禁用接收机。
10)禁用中断。

参数介绍:

p_api_ctrlPointer to the control structure.
p_destPointer to the destination buffer.
lengthThe number of bytes to transfer.
bit_widthInvalid for SCI_SPI (Set to SPI_BIT_WIDTH_8_BITS).
返回值介绍: 
FSP_SUCCESSRead operation successfully completed.
FSP_ERR_ASSERTIONOne of the following invalid parameters passed:
  • Pointer p_api_ctrl is NULL
  • Bit width is not 8 bits
  • Length is equal to 0
  • Pointer to destination is NULL
FSP_ERR_NOT_OPENThe channel has not been opened. Open the channel first.
FSP_ERR_UNSUPPORTEDThe given bit_width is not supported.
FSP_ERR_IN_USEA transfer is already in progress.

3.1.3  R_SCI_SPI_Write()

函数原型:


fsp_err_t R_SCI_SPI_Write	(	spi_ctrl_t *const 	p_api_ctrl,
                                void const * 	p_src,
                                uint32_t const 	length,
                                spi_bit_width_t const 	bit_width )	

函数功能:将数据传输到SPI设备

该函数的主要任务如下:

1)执行参数检查和处理错误条件。
2)使发射机。
3)启用中断。
4)开始数据传输与数据通过传输缓冲区空中断。
5)从源缓冲区复制数据到SPI数据寄存器进行传输。
6)通过传输缓冲区空中断完成数据传输。
7)禁用发射机。
8)禁用接收机。
9)禁用中断。

参数介绍

p_api_ctrlPointer to the control structure.
p_srcPointer to the source buffer.
lengthThe number of bytes to transfer.
bit_widthInvalid for SCI_SPI (Set to SPI_BIT_WIDTH_8_BITS).
返回值
FSP_SUCCESSWrite operation successfully completed.
FSP_ERR_ASSERTIONOne of the following invalid parameters passed:
  • Pointer p_api_ctrl is NULL
  • Pointer to source is NULL
  • Length is equal to 0
  • Bit width is not equal to 8 bits
FSP_ERR_NOT_OPENThe channel has not been opened. Open the channel first.
FSP_ERR_UNSUPPORTEDThe given bit_width is not supported.
FSP_ERR_IN_USEA transfer is already in progress.

3.2 应用函数接口

3.2.1 SPI初始化函数

代码第25行:调用R_SCI_SPI_Open函数初始化SPI接口

3.2.2  读数据接口

代码第48行:调用R_SCI_SPI_Read接口读取数据

代码第50行:等待数据读取完成

3.2.3 写数据接口

代码第37行:调用R_SCI_SPI_Write接口写数据

代码第39行:等待写数据完成

3.2.4 回调函数

代码第14行:检测传输数据事件

代码第15行:数据传输完成,传输数据控制字置位

3.2.5 SPI应用程序源代码 

 /*
 FILE NAME  :  bsp_spi.c
 Description:  generate pwm by timer
 Author     :  [email protected]
 Date       :  2024/06/03
 */
 
#include "bsp_spi.h" 
#include "hal_data.h"

static volatile bool g_transfer_complete = false;
void g_spi0_callback (spi_callback_args_t * p_args)
{
    if (SPI_EVENT_TRANSFER_COMPLETE == p_args->event)
    {
        g_transfer_complete = true;
    }
}

void sci_spi_basic_init (void)
{
    fsp_err_t err = FSP_SUCCESS;
    
    /* Initialize the SPI module. */
    err = R_SCI_SPI_Open(&g_spi0_ctrl, &g_spi0_cfg);
    /* Handle any errors. This function should be defined by the user. */
    assert(FSP_SUCCESS == err);
}

void hal_spi_writebyte( uint8_t byte )
{
    fsp_err_t err = FSP_SUCCESS;
    uint8_t buff[1];
    
    g_transfer_complete = false;
    buff[0] = byte;
    err = R_SCI_SPI_Write(&g_spi0_ctrl, buff, 1, SPI_BIT_WIDTH_8_BITS);
    assert(FSP_SUCCESS == err);
    while (false == g_transfer_complete);
}

uint8_t hal_spi_readbyte(void)
{
    fsp_err_t err = FSP_SUCCESS;
    uint8_t buff[1];
    
    g_transfer_complete = false;
    err =  R_SCI_SPI_Read( &g_spi0_ctrl, buff, 1, SPI_BIT_WIDTH_8_BITS);
    assert(FSP_SUCCESS == err);
    while (false == g_transfer_complete);
    
    return  buff[0];
}
 


/* End of this file */

3.3 LCD驱动程序实现

3.3.1 驱动代码

LCD的驱动代码在改文章中已经实现:

使用SPI驱动串行LCD的驱动实现(STM32F4)_spi+lcd-CSDN博客

这里只需修改SPI相关的接口即可,和LCD相关的代码不需要修改,直接引用。

修改和MCU相关的底代码:

1)SPI接口代码。这里需要编写读写数据函数,其函数原型如下:

 源代码:

void SPI_WriteByte(uint8_t byte)
{
    hal_spi_writebyte(byte);
} 

uint8_t SPI_ReadByte(void)
{
    return hal_spi_readbyte();
} 

2)其他IO库配置

源代码:

#include <stdlib.h>
#include <stdio.h>
#include "bsp_spi.h" 
#include "hal_data.h"


#define LCD_CS_CLR      R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_01_PIN_05, BSP_IO_LEVEL_LOW)
#define LCD_CS_SET      R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_01_PIN_05, BSP_IO_LEVEL_HIGH)

#define LCD_RST_CLR     R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_01_PIN_06, BSP_IO_LEVEL_LOW)
#define LCD_RST_SET     R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_01_PIN_06, BSP_IO_LEVEL_HIGH)

#define LCD_RS_CLR      R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_01_PIN_03, BSP_IO_LEVEL_LOW)
#define LCD_RS_SET      R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_01_PIN_03, BSP_IO_LEVEL_HIGH)

3.3.2 测试代码实现

代码第341行:初始化SPI接口

代码第343行:初始化LCD

 源代码:

void disp_init(void)
{
    sci_spi_basic_init();
    /*You code here*/
    LCD_Init();

    LCD_direction(0);
    LCD_Clear(GREEN);
}

编写一个改变屏幕颜色变化的测试函数

void lcd_test( void )
{
   uint16_t color_list[6]= {BRRED, BLUE, MAGENTA, RED, YELLOW, GREEN};
   static int index = 0;
   
   LCD_Clear( color_list[index] );
   index++;
   R_BSP_SoftwareDelay( 1, BSP_DELAY_UNITS_SECONDS);
   if( index > 6 )
      index = 0;
}

4 测试结果

1)改变屏幕的颜色:粉色

2)改变屏幕的颜色:蓝色

标签:SCI,spi,FSP,SPI,LCD,IO
From: https://blog.csdn.net/mftang/article/details/139458400

相关文章

  • 关于LTspice如何导入第三方的.lib文件进行仿真
    转载自:https://bbs.eeworld.com.cn/thread-1265324-1-1.html1.在芯片官网找到对应的PSPICE模型下载后,将.lib文件移入到路径下的sub文件夹中。(例如C:\Users\\'username'\Documents\LTspiceXVII\lib\sub)2.将.lib文件拖入LTspice后右键单击.subckt后的芯片名称,选择CreatSymbol,即......
  • AXI Quad SPI IP核基于AXI-Lite接口的标准SPI设计指南
    在标准SPI配置下,SPI设备除了包含基本的SPI特性外,还具备以下一些标准功能,这些功能如下所示:支持FPGA内部的多主设备配置,其中使用单独的_I(输入)、_O(输出)、_T(三态)表示三态端口。这种配置允许在FPGA内部有多个主设备共享SPI总线,通过三态驱动器来实现。在默认配置下支持N次8位数据字......
  • 计算机SCI期刊,中科院2区,IF=6.9,收稿范围非常广泛
    一、期刊名称JournalofKingSaudUniversity—ComputerandInformationSciences二、期刊简介概况期刊类型:SCI学科领域:计算机科学影响因子:6.9中科院分区:2区三、期刊征稿范围《沙特国王大学计算机与信息科学杂志》是一本国际性的参考期刊,涵盖了计算机基础及其实......
  • Spire.PDF for Java 10.6.0 支持 PDF to SVG, Word and OFD
    Spire.PDFforJava10.6.0enhancestheconversionsfromPDFtoSVG,WordandOFDSpire.DocforJavaisaprofessionalWordAPIthatempowersJavaapplicationstocreate,convert,manipulateandprintWorddocumentswithoutdependencyonMicrosoftWord.B......
  • WPF grid column resize via GridSpitter, when you can drag to enlarge or shrink t
    <Windowx:Class="WpfApp137.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.microsoft......
  • PLA2216 Logic Analyser Probes for Rigol DHO900 and MSO5000 Oscilloscopes
    TheoriginalPLA2216fromRigolisexpensive.Peoplemadetheirownandopensourcedthedesign. TheearlyteardownandDIYishere: September28,2019,07:23:29amfrom https://www.eevblog.com/forum/testgear/rpl1116-active-logic-probe-pod-for-1000z-seri......
  • STM32 HAL库开发——入门篇(3):OLED、LCD
    源自正点原子视频教程:【正点原子】手把手教你学STM32HAL库开发全集【真人出镜】STM32入门教学视频教程单片机嵌入式_哔哩哔哩_bilibili一、OLED二、内存保护(MPU)实验2.1内存保护单元 三、LCD3.1显示屏分类3.2LCD简介 3.3LCD驱动原理  ......
  • 400、基于51单片机的电压表(1路,ADC0832,LCD1602)(程序+Proteus仿真+原理图+流程图+元器件
    毕设帮助、开题指导、技术解答(有偿)见文未目录方案选择单片机的选择显示器选择方案一、设计功能二、Proteus仿真图单片机模块设计三、原理图四、程序源码资料包括:需要完整的资料可以点击下面的名片加下我,找我要资源压缩包的百度网盘下载地址及提取码。方案选择......
  • GD32F4xx+RT-Thread,SPI驱动、文件系统挂载应该怎么写
    在GD32F470芯片上使用RT-Thread操作系统,配合NORFlash(GD25Q256)编写SPI驱动、文件系统驱动以及挂载关联,可以按照以下步骤进行:1.SPI驱动编写首先需要编写SPI驱动来控制GD32F470与NORFlash之间的通信。这包括初始化SPI接口,配置SPI时钟、极性、相位等参数,并实现SPI传输函数。S......
  • 【Unity美术】spine软件的使用—2D动画的制作
    ......