Renesas MCU之SCI_SPI接口驱动LCD

news2024/10/7 4:35:25

目录

概述

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     :  tangmingfei2013@126.com
 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)改变屏幕的颜色:蓝色

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

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

相关文章

地理信息系统(ArcGIS)在水文水资源、水环境中的实践技术应用及案例分析教程

原文链接&#xff1a;地理信息系统&#xff08;ArcGIS&#xff09;在水文水资源、水环境中的实践技术应用及案例分析教程https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247606047&idx5&sn8c9701518e13b85d8429186fcfe98ad8&chksmfa821ef8cdf597ee7a8a1…

容器环境中安全性的演变

近年来&#xff0c;容器已成为现代IT基础设施中不可或缺的一部分。它们在部署应用程序时提供了极大的灵活性和效率。 然而&#xff0c;随着容器化的普及&#xff0c;保护这些环境的需求也随之增长。容器安全被定义为在容器化环境中防范威胁并确保符合安全标准。它已成为解决使…

Android音频API介绍

Android系统提供了四个层面的音频API&#xff1a; Java层MediaRecorder&MediaPlayer系列&#xff1b;Java层AudioTrack&AudioRecorder系列&#xff1b;Jni层opensles&#xff1b;JNI层AAudio&#xff08;Android O引入&#xff09; 下面分别介绍这些API的使用及特点。…

Ubuntu18.04 文件管理器无法打开的解决方法

问题&#xff1a;打开Ubuntu虚拟机发现文件管理器无法打开,一直在转圈圈 在终端中输入 nautilus 显示如下信息 nautilus: symbol lookup error: /usr/lib/x86_64-linux-gnu/tracker-2.0/libtracker-data.so.0: undefined symbol: sqlite3_bind_pointer 解决措施&#xff1a…

【quarkus系列】实战自定义注解实现策略模式分发

目录 序言自定义注解业务接口渠道消息实现策略分发测试知识扩展AnyAnnotationLiteral 应用场景和语法 序言 策略模式大家都应该了解或者使用过&#xff0c;此篇文章中就不再阐述&#xff0c;之前springboot项目中小编也真正的实战应用过。现在换Quarkus框架开发项目&#xff0…

【数据库】MySQL概述(初阶)

文章目录 一、mysql概述1、数据库基本概念&#xff1a;2. 数据模型2.1 关系型数据库2.2 理解数据模型 更多数据库MySQL系统内容就在以下专栏&#xff1a; 专栏链接&#xff1a;数据库MySQL 一、mysql概述 1、数据库基本概念&#xff1a; 数据库&#xff1a; 数据存储的仓库。数…

自然语言处理(NLP)—— 神经网络语言处理

1. 总体原则 1.1 深度神经网络&#xff08;Deep Neural Network&#xff09;的训练过程 下图展示了自然语言处理&#xff08;NLP&#xff09;领域内使用的深度神经网络&#xff08;Deep Neural Network&#xff09;的训练过程的简化图。 在神经网络的NLP领域&#xff1a; 语料…

winscp无法上传,删除,修改文件并提示权限不够的分析

使用winscp删除文件,报了个错如下 根据这个错就去百度,网上大部分都是通过下面这种方法解决: 在winscp端进行设置 输入主机名(即IP地址)、用户名和密码,然后点击高级 在箭头所指位置输入sudo + sftp应用程序的路径 先查询 sudo find / -name sftp-server -print点击Sh…

C语言课程设计-抽奖系统

请勿直接引用&#xff0c;此内容为本人课程设计报告&#xff0c;上传意为记录自己的经历 题目&#xff1a;基于C语言的抽奖系统 摘要&#xff1a; 本文介绍了一种基于C语言的简易抽奖系统的设计与实现。系统通过用户输入与随机数生成技术相结合&#xff0c;模拟现实中的抽奖…

【渗透测试】DC-1靶机实战(下)SSH爆破提权

【渗透测试】DC-1靶机实战&#xff08;上&#xff09;漏洞扫描获取反弹shell-CSDN博客 7.SSH爆破 hydra ssh://172.20.10.4 -l flag4 -P /usr/share/john/password.lst -t 64 -f -vV -o /tmp/hydra.sshssh://10.10.10.31&#xff1a;指定了要攻击的 SSH 服务的地址。 -l flag…

Windows开启远程桌面

搜索并进入【远程桌面设置】 ​​ 开启远程桌面 ​​​ ipconfig​命令查看ip地址&#xff0c;并使用地址在另一台电脑远程登录此电脑 选择其他账户登录&#xff0c;输入用户和密码 ​​ ​​ 成功登录 ​​

基于Django+MySQL的智慧校园系统

此项目基于Django MySQL HTML CSS JS jQuery bootstrap实现的功能有 学生管理部门管理代办清单管理校园论坛校园医疗服务校园看点校园生活助手常用功能入口 1. 一些注意点 1. 页面body会自动有一些边界距&#xff0c;处理方法&#xff1a; <head><style>b…

C++ | Leetcode C++题解之第134题加油站

题目&#xff1a; 题解&#xff1a; class Solution { public:int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {int n gas.size();int i 0;while (i < n) {int sumOfGas 0, sumOfCost 0;int cnt 0;while (cnt < n) {int j (i …

C++ | Leetcode C++题解之第133题克隆图

题目&#xff1a; 题解&#xff1a; class Solution { public:Node* cloneGraph(Node* node) {if (node nullptr) {return node;}unordered_map<Node*, Node*> visited;// 将题目给定的节点添加到队列queue<Node*> Q;Q.push(node);// 克隆第一个节点并存储到哈希…

Nginx漏洞解析及复现

Nginx漏洞 Nginx能做到正向代理、反向代理、负载均衡、HTTP服务器等&#xff0c;强大的功能不言而喻&#xff0c;但也伴随着使用 上的风险&#xff0c;深入理解Nginx的漏洞有助于创建安全的业务系统。 Nginx解析漏洞 漏洞原理 Nginx的解析漏洞的出现和Nginx的版本没有关系&…

数据库(24)——外键约束

概念 外键用来让两张表的数据之间建立连接&#xff0c;从而保证数据的一致性和完整性。 具有外键的表称为子表&#xff0c;关联的表称为父表。 语法 添加外键 CREATE TABLE 表名( 字段名 数据类型, .. [CONSTRAINT] [外键名称] FOREIGN KEY (外键字段名) REFERENCES 主表(主…

升级HarmonyOS 4.2,开启健康生活篇章

夏日来临&#xff0c;华为智能手表携 HarmonyOS 4.2 版本邀您体验&#xff0c;它不仅可以作为时尚单品搭配夏日绚丽服饰&#xff0c;还能充当你的健康管家&#xff0c;从而更了解自己的身体&#xff0c;开启智能健康生活篇章。 高血糖风险评估优化&#xff0c;健康监测更精准 …

2024首发!会声会影2024旗舰版,专业编辑新体验!

会声会影2024最新旗舰版是一款专业的视频编辑软件&#xff0c;它集成了多种高级功能&#xff0c;为用户带来极致的视频编辑体验。在这篇文章中&#xff0c;我们将详细介绍该软件的功能和特色&#xff0c;帮助用户更好地了解和使用它。 会声会影全版本绿色安装包获取链接&#…

在 LLM 架构中应用多专家模型

本文转载自&#xff1a;在 LLM 架构中应用多专家模型 2024年 3月 14日 By Kyle Kranen and Vinh Nguyen https://developer.nvidia.cn/zh-cn/blog/applying-mixture-of-experts-in-llm-architectures/ 文章目录 一、概述二、LLM 架构领域的专家齐聚一堂1、模型容量2、MoE 在降低…

Nginx源码编译安装

Nginx NginxNginx的特点Nginx的使用场景Nginx 有哪些进程root 和 alias 指定路径的区别root&#xff08;根目录&#xff09;alias&#xff08;别名目录、虚拟目录&#xff09; 使用源码编译安装Nginx准备工作安装依赖包编译安装Nginx检查、启动、重启、停止 nginx服务配置 Ngin…