/**
****************************************************************************************************
* @file spilcd.cpp
* @author 正点原子团队(ALIENTEK)
* @version V1.0
* @date 2023-12-01
* @brief SPILCD 驱动代码
* @license Copyright (c) 2020-2032, 广州市星翼电子科技有限公司
****************************************************************************************************
* @attention
*
* 实验平台:正点原子 ESP32S3 开发板
* 在线视频:www.yuanzige.com
* 技术论坛:www.openedv.com
* 公司网址:www.alientek.com
* 购买地址:openedv.taobao.com
*
* 修改说明
* V1.0 20231201
* 第一次发布
*
****************************************************************************************************
*/
#include "spilcd.h"
#include "font.h"
#include <SPI.h>
#include "xl9555.h"
#define SPI_LCD_TYPE 1 /* SPI接口屏幕类型(1:2.4寸SPILCD 0:1.3寸SPILCD) */
/* LCD的宽和高定义 */
#if SPI_LCD_TYPE /* 2.4寸SPI_LCD屏幕 */
uint16_t spilcd_width = 240; /* 屏幕的宽度 240(竖屏) */
uint16_t spilcd_height = 320; /* 屏幕的宽度 320(竖屏) */
#else
uint16_t spilcd_width = 240; /* 屏幕的宽度 240(竖屏) */
uint16_t spilcd_height = 240; /* 屏幕的宽度 240(竖屏) */
#endif /* 1.3寸SPI_LCD屏幕 */
uint8_t spilcd_dir = 1; /* 默认横屏(1)、竖屏(0) */
#define USE_LCD_BUF 1 /* 默认使用lcd_buf,使用lcd_buf刷屏速度会大幅度提升,牺牲空间提高速度,内存不够时,置0即可 */
#if USE_LCD_BUF
#if SPI_LCD_TYPE
uint16_t lcd_buf[320 * 240]; /* 存放一帧图像数据 */
#else
uint16_t lcd_buf[240 * 240]; /* 存放一帧图像数据 */
#endif
#endif
/* LCD的画笔颜色和背景色 */
uint32_t g_point_color = 0XF800; /* 画笔颜色 */
uint32_t g_back_color = 0XFFFF; /* 背景色 */
static const int SPICLK = 80000000; /* SPI通信速率(屏幕显示异常,调低SPICLK) */
SPIClass* spi_lcd = NULL; /* 定义一个未初始化指向SPI对象的指针 */
/**
* @brief 往LCD写命令
* @param cmd:命令
* @retval 无
*/
static void lcd_write_cmd(uint8_t cmd)
{
LCD_WR(0);
spi_lcd->transfer(cmd);
}
/**
* @brief 往LCD写数据
* @param data:数据
* @retval 无
*/
static void lcd_write_data(uint8_t data)
{
LCD_WR(1);
spi_lcd->transfer(data);
}
/**
* @brief 往LCD写指定数量的数据
* @param data:数据的起始地址
* @param size:发送数据大小
* @return 无
*/
static void lcd_write_bytes(uint8_t *data, uint32_t size)
{
LCD_WR(1);
spi_lcd->transfer(data, size);
}
/**
* @brief 往LCD写像素数据
* @param data:像素数据
* @retval 无
*/
static void lcd_write_pixeldata(uint16_t data)
{
LCD_WR(1);
spi_lcd->transfer16(data);
}
/**
* @brief 设置LCD行列地址
* @param xs: 列起始地址
* ys: 行起始地址
* xe: 列结束地址
* ye: 行结束地址
* @retval 无
*/
void lcd_set_address(uint16_t xs, uint16_t ys, uint16_t xe, uint16_t ye)
{
lcd_write_cmd(0x2A);
lcd_write_data((uint8_t)(xs >> 8) & 0xFF);
lcd_write_data((uint8_t)xs & 0xFF);
lcd_write_data((uint8_t)(xe >> 8) & 0xFF);
lcd_write_data((uint8_t)xe & 0xFF);
lcd_write_cmd(0x2B);
lcd_write_data((uint8_t)(ys >> 8) & 0xFF);
lcd_write_data((uint8_t)ys & 0xFF);
lcd_write_data((uint8_t)(ye >> 8) & 0xFF);
lcd_write_data((uint8_t)ye & 0xFF);
lcd_write_cmd(0x2C);
}
/**
* @brief 设置LCD的自动扫描方向
* @note 一般设置为L2R_U2D即可,如果设置为其他扫描方式,可能导致显示不正常.
* @param dir:0~7,代表8个方向(具体定义见lcd.h)
* @retval 无
*/
void lcd_scan_dir(uint8_t dir)
{
uint16_t regval = 0;
uint16_t dirreg = 0;
uint16_t temp;
if (spilcd_dir == 1) /* 横屏时,需改变扫描方向! */
{
switch (dir) /* 方向转换 */
{
case 0:
dir = 5;
break;
case 1:
dir = 7;
break;
case 2:
dir = 4;
break;
case 3:
dir = 6;
break;
case 4:
dir = 1;
break;
case 5:
dir = 0;
break;
case 6:
dir = 3;
break;
case 7:
dir = 2;
break;
}
}
/* 根据扫描方式 设置 0x36 寄存器 bit 5,6,7 位的值 */
switch (dir)
{
case L2R_U2D:/* 从左到右,从上到下 */
regval |= (0 << 7) | (0 << 6) | (0 << 5);
break;
case L2R_D2U:/* 从左到右,从下到上 */
regval |= (1 << 7) | (0 << 6) | (0 << 5);
break;
case R2L_U2D:/* 从右到左,从上到下 */
regval |= (0 << 7) | (1 << 6) | (0 << 5);
break;
case R2L_D2U:/* 从右到左,从下到上 */
regval |= (1 << 7) | (1 << 6) | (0 << 5);
break;
case U2D_L2R:/* 从上到下,从左到右 */
regval |= (0 << 7) | (0 << 6) | (1 << 5);
break;
case U2D_R2L:/* 从上到下,从右到左 */
regval |= (0 << 7) | (1 << 6) | (1 << 5);
break;
case D2U_L2R:/* 从下到上,从左到右 */
regval |= (1 << 7) | (0 << 6) | (1 << 5);
break;
case D2U_R2L:/* 从下到上,从右到左 */
regval |= (1 << 7) | (1 << 6) | (1 << 5);
break;
}
dirreg = 0x36;
spi_lcd->beginTransaction(SPISettings(SPICLK, MSBFIRST, SPI_MODE3));
LCD_CS(0);
lcd_write_cmd(dirreg);
lcd_write_data(regval);
if (regval & 0x20)
{
if (spilcd_width < spilcd_height) /* 交换X,Y */
{
temp = spilcd_width;
spilcd_width = spilcd_height;
spilcd_height = temp;
}
}
else
{
if (spilcd_width > spilcd_height) /* 交换X,Y */
{
temp = spilcd_width;
spilcd_width = spilcd_height;
spilcd_height = temp;
}
}
lcd_set_address(0, 0, spilcd_width - 1, spilcd_height - 1);
LCD_CS(1);
spi_lcd->endTransaction();
}
/**
* @brief 设置LCD显示方向
* @param dir:0,竖屏; 1,横屏
* @retval 无
*/
void lcd_display_dir(uint8_t dir)
{
spilcd_dir = dir;
if (SPI_LCD_TYPE) /* 2.4寸屏需要做处理,1.3寸屏不需要处理 */
{
if (dir == 0) /* 竖屏 */
{
spilcd_width = 240;
spilcd_height = 320;
}
else /* 横屏 */
{
spilcd_width = 320;
spilcd_height = 240;
}
}
lcd_scan_dir(DFT_SCAN_DIR);
}
/**
* @brief 清屏函数
* @param color: 要清屏的颜色
* @retval 无
*/
void lcd_clear(uint16_t color)
{
uint32_t index = 0;
uint32_t totalpoint = spilcd_width * spilcd_height;
spi_lcd->beginTransaction(SPISettings(SPICLK, MSBFIRST, SPI_MODE3));
LCD_CS(0);
lcd_set_address(0, 0, spilcd_width - 1 ,spilcd_height - 1);
LCD_WR(1);
#if USE_LCD_BUF
uint16_t color_tmp = ((color & 0x00FF) << 8) | ((color & 0xFF00) >> 8); /* 需要转换一下颜色值 */
for (uint32_t i = 0; i < spil
Arduino SPI-SDCARD实验例程【正点原子EPS32S3】
需积分: 0 170 浏览量
更新于2025-04-29
收藏 33KB ZIP 举报
Arduino SPI-SDCARD实验例程是为Arduino爱好者和开发者提供的一个学习资源,该实验例程的开发板是正点原子EPS32S3。通过该例程,用户可以学习到如何在Arduino平台上使用SPI通信协议与SD卡进行数据交互。SPI(Serial Peripheral Interface,串行外设接口)是一种常用的高速、全双工、同步的通信总线,它被广泛应用于微控制器和其他外围设备之间的通信。SD卡(Secure Digital Card)是一种广泛使用的数据存储卡,具有体积小、容量大、性能稳定等优点。
在进行SPI-SDCARD实验之前,需要了解SPI的基本工作原理。SPI通信系统包括一个主设备和一个或多个从设备,主设备负责提供时钟信号,同时控制数据的发送和接收。在Arduino与SD卡的通信中,Arduino作为主设备,而SD卡作为从设备。数据在主设备和从设备之间通过四条线进行传输,分别是MISO(主设备输入,从设备输出)、MOSI(主设备输出,从设备输入)、SCK(时钟信号)和CS(片选信号)。使用SPI协议进行通信时,数据会以位的形式串行传输,时钟信号用于同步数据的发送和接收。
正点原子EPS32S3开发板是一款基于ESP32-S3芯片的开发板,ESP32-S3是一款集成Wi-Fi和蓝牙功能的高性能微控制器,支持多种低功耗模式和丰富的外设接口,非常适合进行物联网(IoT)相关的开发项目。该开发板以其出色的性能和稳定的连接能力,在物联网和无线通信领域得到了广泛的应用。
在进行SPI-SDCARD实验时,开发者通常需要将SD卡通过适配器连接到开发板上,并使用Arduino IDE进行编程。Arduino IDE提供了丰富的库文件,包括用于SPI通信和SD卡读写的库,大大简化了开发者的编程工作。用户在编写程序时,需要初始化SPI接口,设置正确的时钟速率,然后通过编写相应的函数来实现数据的读取和写入。实验过程中,开发者可以参考本人主页上的详细实验说明来逐步完成实验设置和调试工作。
通过完成Arduino SPI-SDCARD实验,开发者不仅可以掌握如何使用SPI协议进行数据通信,还可以学习到如何处理文件系统和管理存储数据。这为开发者在进行更大规模的项目开发时,提供了重要的基础技术能力,比如数据日志记录、多媒体文件存储和播放等应用。同时,ESP32-S3的低功耗特性使得基于SD卡的数据记录方案可以在电池供电的便携式设备中得到应用。
此外,实验例程的实践对于理解物联网系统中数据采集和存储的工作流程也有很大的帮助。随着物联网技术的不断发展和应用范围的扩大,掌握如何高效地在微控制器与存储设备之间进行数据交互变得越来越重要。对于希望深入学习物联网技术的开发者来说,Arduino SPI-SDCARD实验例程是一个很好的起点。


常将有日思无日-
- 粉丝: 418
最新资源
- 计算机软件许可合同.doc
- 人工智能产业发展面临四大问题亟待“求解”.docx
- 2017移动通信复习个人总结.doc
- 中小学信息化教学设计特征分析.docx
- C语言量子化学计算:Gaussian接口开发与分子轨道可视化.pdf
- 全国青少年软件编程(Python)等级考试试卷(二级)练习.doc
- 计算机网络试卷.doc
- 工业互联网标识解析二级节点业务管理系统操作手册.pdf
- C语言量子化学计算:分子模拟算法与高性能优化.pdf
- C语言量子机器学习:QML算法实现与经典-量子混合计算.pdf
- 农业信息化解决方案1.doc
- 盐城市经济和信息化项目专家评审管理办法.doc
- 软件产品采购合同(律师确认).docx
- C语言量子计算入门:QiskitC接口调用与量子门操作,前沿技术解析.pdf
- C语言量子计算入门:QiskitC接口调用实战指南.pdf
- C语言量子机器学习库:QMLib开发与经典AI加速.pdf