找回密码
 立即注册
查看: 2340|回复: 4

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

[复制链接]
  • TA的每日心情
    开心
    昨天 11:56
  • 签到天数: 106 天

    [LV.6]常住居民II

    28

    主题

    103

    回帖

    838

    积分

    高级会员

    积分
    838
    发表于 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

    回复 送花

    使用道具 举报

    该用户从未签到

    550

    主题

    9209

    回帖

    1万

    积分

    管理员

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

    使用道具 举报

  • TA的每日心情
    奋斗
    2024-2-27 16:37
  • 签到天数: 30 天

    [LV.5]常住居民I

    2

    主题

    34

    回帖

    102

    积分

    注册会员

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

    使用道具 举报

  • TA的每日心情
    开心
    昨天 10:20
  • 签到天数: 122 天

    [LV.7]常住居民III

    4

    主题

    235

    回帖

    848

    积分

    高级会员

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

    使用道具 举报

  • TA的每日心情
    开心
    昨天 05:03
  • 签到天数: 39 天

    [LV.5]常住居民I

    0

    主题

    6

    回帖

    178

    积分

    注册会员

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

    使用道具 举报

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

    本版积分规则

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

    GMT+8, 2024-4-26 00:56 , Processed in 0.061107 second(s), 47 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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