找回密码
 立即注册
查看: 4182|回复: 9

开天斧三.1板测试——硬件SPI驱动三线SPI_TFT屏(代码分享)

[复制链接]
  • 打卡等级:以坛为家II
  • 打卡总天数:441
  • 最近打卡:2025-05-02 09:05:39

45

主题

176

回帖

1735

积分

金牌会员

积分
1735
发表于 2023-2-22 15:29:03 | 显示全部楼层 |阅读模式
本帖最后由 乐此不疲 于 2023-2-22 15:41 编辑

自从去年年底收到STC的开天斧、屠龙刀实验板后一直在做各种功能的测试,最近得闲分享一点新手的实验心得以供新手参考,前些时发帖分享了STC8H8K64TL的触摸按键的使用经验:
STC8H触摸按键的简单应用与经验分享
https://www.stcaimcu.com/forum.php?mod=viewthread&tid=974&fromuid=292
(出处: 国芯论坛-STC全球32位8051爱好者互助交流社区)

这次用STC8H8K64U的开天斧实验板的硬件SPI接口驱动三线SPI的ILI9481串口TFT480*320-3.5"屏成功后也分享到这里,也是保留一点资料在这里,高手可以无视。

开天斧板具有硬件USB-ISP功能,上手应用时感觉挺爽,但是每次下载都要配合按键就感觉不是很方便,仍然使用已经用了十几年的USB转串口的自动断电下载线(第三方设备),因为我得到的开天斧、屠龙刀板子没有配STC-USB Link1D,所以真的不知道官方的下载线会是怎样的效果另外也无法测试USB仿真功能。

我的这个串口TFT屏的所谓三线SPI即缺少指令/数据(D/CX或RS)线的9bit数据宽度的SPI总线的TFT屏,屏内MCU接口芯片为ILI9481,内定为RGB666-18bit颜色模式,总线时序如下:

8888.jpg

用到这个异类的屏时、我真心的希望STC单片机能再接再厉更上层楼做出1-16位任意设置的硬件SPI接口,使STC51单片机打破各种神话。
观察上述时序图可以得到下述特征:
1.时钟空闲时为高电平。
2.时钟下降沿(前沿驱动)与数据变化起始点对齐,时钟的上升沿处于数据的稳定区域(后沿采样)。
3.数据或指令的字节宽度为1+8=9bit。
4.先发送高位数据。
上述图片恰好与STC数据手册19.5给出的最后一幅参考图片一致:

777.jpg

根据以上的特征,可以配置STC单片机SPI主机模式的控制寄存器SPCTL=1101 11xx,后两位的xx用于设置时钟频率,单片机的硬件SPI通讯的配置真的很简单,只要配置好了寄存器SPCTL就可以使用了,而对于STC8单片机还可以切换不同的端口作为通讯引脚,此时只要配置寄存器P_SW1即可,这款单片机的SPI应用真是没得说。
最后需要说明的是对于8位数据的硬件SPI总线是无法真的发送9位数据的,只能通过两次发送8位数据的模式来发送9位数据,其效率是有折扣的,但这并不影响刷屏速度,因为串口TFT屏本身就不适合过高的速度,另外,对于ILI9481的三线SPI模式而言,手册中给出的数据宽度为9-16bit,也就是说虽然我们分两次为屏幕的显存送人了16bit数据但这是被允许的并不影响正常的显示,具体描述如下:
Each byte is either nine or sixteen write cycles in length. If the optional D/CX signal is used a byte is eight  我不懂英语但用百度翻译的结果为:每个字节的长度为九个或十六个写入周期。如果使用可选的D/CX信号,则字节为8

下面给出STC8H硬件SPI相关代码:
//使用STC8H单片机SPI通道2(开天斧三.1实验板的J8接口)
sbit reset     =P2^0;
sbit cs        =P2^1;
sbit scl       =P2^5;
sbit sda       =P2^3;
//====硬件SPI初始化函数=========================
//SPCTL=0xDC,0xDD,0xDE,0xDF;分别对应1/4,1/8,1/16,1/2分频
void spi_init()
{
    P_SW1|=1<<2;         //使用SPI通道2时需要切换引脚
    SPDAT = 0;                 //清空数据寄存器
    SPSTAT = 0xC0;         //清除所有标志(共两个)
    SPCTL = 0xDF;        //忽略SS-使能SPI-高位先行-主机模式-时钟空闲时为高、上升沿(第二个边沿)采样
}
//====硬件SPI发送一个字节函数==============
//查询方式
void SPI_WriteByte(unsigned char temp)
{
    SPDAT = temp;                        //待发送数据存入数据寄存器
    while(!(SPSTAT & 0x80));//等待传输完成SPIF=0
    SPSTAT = 0xC0;                        //传输完成后置SPIF=1、WCOL=1清除标志
}
//==============LCD写指令函数======================
void write_command(uchar comd)
{
cs=0;
    SPI_WriteByte(comd>>1);                //发送DC加数据的前7位
    SPI_WriteByte(comd<<7);                //发送数据的最低位
    cs=1;
}
//===============LCD写数据函数==================
void write_data(uchar dat)
{
    cs=0;
    SPI_WriteByte((dat>>1)|(0x80));                //发送DC加数据的前7位
    SPI_WriteByte(dat<<7);                                //发送数据的最低位
    cs=1;
}

如果屏幕可以设定为RGB565-16bit颜色数据模式的话,只要有了上述底层代码就可以点亮屏幕了,但对于我手里这个RGB666-18bit颜色数据模式的屏幕还需要有一个颜色数据写入的函数,首先看看手册中给出的颜色数据格式:

666.jpg

以下为代码:

//====写18位颜色数据函数===============
//18bpp Frame Memory Write模式、RGB三色各6位数据写入3个8位寄存器中、高位对齐忽略低2位
//RGB565-16位色值经过对R、B插值变成RGB666-18位色值后分别写入显存
void LCD_WR_DATA(u16 da)
{
    write_data(((da>>8)&0xf8)|0x04);  //将R值移动到低8位、取出5位色值再插入1位色值
    write_data((da>>3)&0xFC);   //将G值移动到低8位、取出6位色值
    write_data((da<<3)|0x04);   //将B值移动到高位对齐、再插入1位色值
}

至此,三线SPI这点事儿就全部说清了,请高手指正!

001.jpg

002.jpg

回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:56
  • 最近打卡:2025-05-03 10:05:34

718

主题

1万

回帖

1万

积分

管理员

积分
15646
发表于 2023-2-22 22:59:50 | 显示全部楼层
感谢分享
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:37
  • 最近打卡:2025-04-24 09:00:03

2

主题

36

回帖

134

积分

注册会员

积分
134
发表于 2024-1-3 00:23:18 | 显示全部楼层
感谢分享
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:415
  • 最近打卡:2025-05-03 07:54:16

5

主题

296

回帖

2068

积分

金牌会员

积分
2068
发表于 2024-1-3 01:51:43 | 显示全部楼层
感谢分享
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:338
  • 最近打卡:2025-05-03 06:02:59

0

主题

6

回帖

812

积分

高级会员

积分
812
发表于 2024-1-31 19:52:24 | 显示全部楼层
感谢分享
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:397
  • 最近打卡:2025-05-02 17:15:54

6

主题

101

回帖

415

积分

中级会员

积分
415
发表于 2025-3-17 09:24:39 | 显示全部楼层
求大神分享一个stc8H驱动三线SPI_TFT屏的案例,本人小白玩不转三线SPI屏
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:441
  • 最近打卡:2025-05-02 09:05:39

45

主题

176

回帖

1735

积分

金牌会员

积分
1735
发表于 2025-3-18 10:49:56 | 显示全部楼层
manz*** 发表于 2025-3-17 09:24
求大神分享一个stc8H驱动三线SPI_TFT屏的案例,本人小白玩不转三线SPI屏

我发这贴也没有写完整工程代码,我今天又重新用开天斧板子测试了我的屏幕,这里分享给你点亮这个屏的测试代码,后期的应用都是在这个工程的基础上改编的,你也可以用我的测试代码测试下,点亮了屏幕后再根据本帖的代码逐步升级吧。


STC8H测试代码.zip (38.62 KB, 下载次数: 16)



回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:397
  • 最近打卡:2025-05-02 17:15:54

6

主题

101

回帖

415

积分

中级会员

积分
415
发表于 2025-3-19 08:39:31 | 显示全部楼层
乐此*** 发表于 2025-3-18 10:49
我发这贴也没有写完整工程代码,我今天又重新用开天斧板子测试了我的屏幕,这里分享给你点亮这个屏的测试 ...

谢谢
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:397
  • 最近打卡:2025-05-02 17:15:54

6

主题

101

回帖

415

积分

中级会员

积分
415
发表于 2025-3-22 09:31:44 | 显示全部楼层
今天测试了一下,一次点亮,谢谢
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:441
  • 最近打卡:2025-05-02 09:05:39

45

主题

176

回帖

1735

积分

金牌会员

积分
1735
发表于 2025-3-22 09:40:35 | 显示全部楼层
manz*** 发表于 2025-3-22 09:31
今天测试了一下,一次点亮,谢谢

能点亮就好接下来愉快玩耍吧。
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-3 12:34 , Processed in 0.125151 second(s), 118 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表