Renesas MCU之SCI_SPI接口驱动LCD

目录

概述

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.cDescription:  generate pwm by timerAuthor     :  tangmingfei2013@126.comDate       :  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)改变屏幕的颜色:蓝色

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/850573.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OnlyOwner在Solidity中是一个修饰符,TypeError:

目录 OnlyOwner在Solidity中是一个修饰符 TypeError: Data location must be "memory" or "calldata" for parameter in function, but none was given. function AddDOm (address dataOwnermAddress, string dataProduct, string dataNotes) OnlyOwner …

【全开源】Workerman在线客服系统(ThinkPHP+FastAdmin+Workerman)

Workerman在线客服系统&#xff1a;高效沟通的新选择 基于ThinkPHPFastAdminWorkerman开发的一款实时在线客服系统&#xff0c;支持多客服(不限座席)、知识库、离线留言板、离线消息、历史会话、微信小程序接入、Uni-app接入(高级授权)、用户轨迹等功能。​ &#x1f4e2; 一…

如何远程连接Linux服务器?

远程连接Linux服务器是通过网络连接到位于远程位置的Linux服务器&#xff0c;以进行服务器管理和操作。远程连接使得系统管理员可以方便地远程访问服务器&#xff0c;进行配置、维护和故障排除等操作&#xff0c;而不必亲自在服务器前工作。以下是一些常用的远程连接方法&#…

[shell详细知识点]

Shell shell定义 Shell 是一种程序设计语言,他有变量,关键字,各种控制语句和自己的语法结构, 可以编写功能很强,代码简短的程序​#! Shebang 定义解释器#!/usr/bin/python#!/bin/bash shell分类 /bin/sh/bin/bash/sbin/nologin/usr/bin/sh/usr/bin/bash/usr/bin/nologin…

python - Pandas缺失值处理

文中所用数据集已上传,找不到的可以私聊我 学习目标 知道空值和缺失值的区别以及缺失值的影响 知道如何查看数据集缺失值情况的方法 知道缺失值处理的办法 1 NaN简介 好多数据集都含缺失数据。缺失数据有多种表现形式 数据库中&#xff0c;缺失数据表示为NULL 在某些编程语…

java基本数据类型变量间的运算规则及String类的使用

数据类型变量间的运算规则&#xff1a; 1、可以做运算的基本数据类型有7种&#xff0c;不包含boolean类型&#xff1b; 2、运算规则&#xff1a; 1、自动类型提升&#xff08;当容量小的变量与容量大的变量做运算时&#xff0c;结果自动转换为容量大的数据类型。ps:在这里容量…

【C语言】宏详解(上卷)

前言 紧接着预处理详解&#xff08;上卷&#xff09;&#xff0c;接下来我们来讲宏&#xff08;隶属于预处理详解系列&#xff09;。 #define定义宏 #define机制包括了一个规定&#xff0c;允许把参数替换到文本中&#xff0c;这种实现通常称为宏&#xff08;macro&#xff…

AI如何创造情绪价值

随着科技的飞速发展&#xff0c;人工智能&#xff08;AI&#xff09;已经渗透到我们生活的方方面面。从智能家居到自动驾驶&#xff0c;从医疗辅助到金融服务&#xff0c;AI技术的身影无处不在。而如今&#xff0c;AI更是涉足了一个全新的领域——创造情绪价值。 AI已经能够处…

2024年【天津市安全员C证】免费试题及天津市安全员C证试题及解析

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 天津市安全员C证免费试题是安全生产模拟考试一点通生成的&#xff0c;天津市安全员C证证模拟考试题库是根据天津市安全员C证最新版教材汇编出天津市安全员C证仿真模拟考试。2024年【天津市安全员C证】免费试题及天津市…

分享美好,高清无阻 - 直播极简联网解决方案

1、需求背景 随着移动互联网、UGC模式和直播平台的发展&#xff0c;网络直播的门槛日益降低&#xff0c;越来越多的人希望成为直播的主角。基于物联网的户外直播无线联网解决方案应运而生&#xff0c;满足直播者的需求。 户外直播无线联网解决方案提供了无处不在的直播体验&a…

SpringBoot与MyBatis的快速整合(基于注解)

文章目录 创建Spring Boot项目配置数据库连接信息编写MyBatis Mapper接口使用XML文件编写SQL映射配置数据源切换引入Druid依赖配置Druid数据源 配置MyBatis支持事务管理 在使用Spring Boot创建新项目或新模块时&#xff0c;如果需要使用MyBatis来进行数据库操作&#xff0c;可以…

可变类型与不可变类型在命名空间中的一些场景

在Python中&#xff0c;变量空间的概念通常指的是变量在内存中的存储位置。可变类型和不可变类型在变量空间中的表现确实会导致一些常见的误解和错误。以下是一些具体的例子&#xff1a; ### 1. 可变类型作为函数参数 当你将可变类型&#xff08;如列表&#xff09;作为参数传递…

js的锚点

本文描述js的锚点解释及使用方法: 在Web开发中&#xff0c;锚点&#xff08;Anchor&#xff09;通常用于创建页面内的链接&#xff0c;允许用户点击链接直接跳转到同一页面的不同部分。JavaScript可以用来增强锚点的功能&#xff0c;例如实现平滑滚动或动态修改锚点行为。以下…

Python面试宝典:Python中与数据科学概念相关的面试笔试题(1000加面试笔试题助你轻松捕获大厂Offer)

Python面试宝典:1000加python面试题助你轻松捕获大厂Offer【第二部分:Python高级特性:第二十六章:Python与数据科学:第一节:数据科学】 第二十六章:Python与数据科学第一节:数据科学python中与数据科学概念相关的面试笔试题面试题1面试题2面试题3面试题4面试题5更多面试…

uniapp实现微信小程序调用云函数【vue2】

在uniapp中的vue 2框架中想要改变默认的目录结构&#xff0c;将装有云函数的文件夹在运行后一起复制到unpackage 文件下&#xff0c;主要用 copy-webpack-plugin 方法来实现&#xff0c;具体步骤如下&#xff1a; 一、创建一个vue 2 框架的uniapp 二、新建一个文件夹装云函数 …

Git【版本控制命令】

02 【本地库操作】 1.git的结构 2.Git 远程库——代码托管中心 2.1 git工作流程 代码托管中心用于维护 Git 的远程库。包括在局域网环境下搭建的 GitLab 服务器&#xff0c;以及在外网环境下的 GitHub 和 Gitee (码云)。 一般工作流程如下&#xff1a; 1&#xff0e;从远程…

轻松掌握系统概况,提升工作效率

作为 Linux 系统管理员,我们经常需要了解系统的基本状况,比如当前时间、系统版本、内核信息、CPU 型号、内存使用等等。但是每次手动执行各种命令来获取这些信息,无疑是一件非常繁琐的事情。 幸运的是,我们可以通过编写一个简单的 shell 脚本来一键获取这些系统信息。让我们一…

Java 环境配置 -- Java 语言的安装、配置、编译与运行

大家好&#xff0c;我是栗筝i&#xff0c;这篇文章是我的 “栗筝i 的 Java 技术栈” 专栏的第 002 篇文章&#xff0c;在 “栗筝i 的 Java 技术栈” 这个专栏中我会持续为大家更新 Java 技术相关全套技术栈内容。专栏的主要目标是已经有一定 Java 开发经验&#xff0c;并希望进…

【iOS】内存泄漏检查及原因分析

目录 为什么要检测内存泄漏&#xff1f;什么是内存泄漏&#xff1f;内存泄漏排查方法1. 使用Zombie Objects2. 静态分析3. 动态分析方法定位修改Leaks界面分析Call Tree的四个选项&#xff1a; 内存泄漏原因分析1. Leaked Memory&#xff1a;应用程序未引用的、不能再次使用或释…

我的编程语言学习记录:一段不断探索的旅程

目录 我的编程语言学习记录&#xff1a;一段不断探索的旅程 1.引言 2.我的编程之旅开始 第一站&#xff1a;Python — 简洁之美 第二站&#xff1a;JavaScript — 网页的魔法 第三站&#xff1a;Java — 企业级的力量 3.学习过程中的挑战与克服 1.理解概念 3.记忆语法…