查看: 1646|回复: 2

[原创] 【MCX-N947分享】+驱动SPI显示屏

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

    连续签到: 59 天

    [LV.10]以坛为家III

    28

    主题

    4398

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    6047
    最后登录
    2025-9-30
    发表于 2024-7-6 15:15:49 | 显示全部楼层 |阅读模式
    本帖最后由 suncat0504 于 2024-7-6 15:20 编辑

    在上次例程的基础上,这次加入SPI通讯的TFT显示屏。开发板上已经提供了一个SPI接口J6,依次为AN、RST、CS、SCK、MISO、MOSI、3V3、GND。我手里的TFT屏提供的接口GND、VDD、SCL、SDA、RST、DC、CS、BLK。

    对接如下:
    开发板                  TFT显示屏
    ------------------------------------------------------
    RST(P1_3)                RST(复位)
    CS(P3_23)                CS(片选)
    SCK(P3_21)               SCL(时钟脉冲)  
    MISO(P3_22)            
    MOSI(P3_20)             SDA(数据)
    P0_10                   RS(命令、数据)
    3V3                     VDD
    GND                    GND
    ------------------------------------------------------
    相关电路:
    图片2.png

    因为TFT显示屏只是单向接收数据,所以不需要使用MOSI引脚,所以悬空。

      显示处理代码是从其它地方移植过来的,之前用的是模拟方式。所以这次虽然使用了SPI接口,但依旧使用模拟方式驱动。将程序移植过来以后,要根据FRDM-MCXN947开发板进行修改,主要就是GPIO口的初始化,高低电平的设置,其它处理逻辑完全不用改动。不过在移植之前需要处理下时间函数,以方便处理代码中的延迟处理。上次的程序中有SysTick_Handler函数,准备在这个基础上进行拓展。


    之前的周期显然是不适合做ms级的处理,所以需要修改调整。因为代码(BOARD_BootClockFRO12M();)的设置,开发板使用12M的主频工作,所以主程序中SysTick_Config(12000000UL);这句设置的处理周期为1S。把数据调小,改成SysTick_Config(12000UL);,理论上Handler的周期应该变成1ms。改完代码,编译,下载,用示波器查看P0_10和P0_27的变化,得到如下结果:

    图片3.png
    确实变成了1ms。
    然后在这个基础上,加入延迟处理:
    void SysTick_Handler(void) {
        if (g_delay_ms>0) {
            g_delay_ms--;
        }
    }
    void delay_ms(uint32_t ms) {
        g_delay_ms = ms;
        while(g_delay_ms>0);
    }
    主程序改为:
    int main(void) {
        /* Board pin init */
        CLOCK_EnableClock(kCLOCK_Gpio0);
        BOARD_InitPins();
        BOARD_BootClockFRO12M();
       
        /* Initialize the systick module. */
        //SysTick_Config(12000000UL);
        SysTick_Config(12000UL);
       
        LED_RED_INIT(LOGIC_LED_OFF);
        LED_GREEN_INIT(LOGIC_LED_ON);
       
        while (1) {
            delay_ms(500);
            LED_GREEN_TOGGLE();
        }
    }
    预想中的绿色LED闪烁结果,竟然没有出现。很奇怪啊。
    改成如下模式就没有问题:
    int main(void) {
        /* Board pin init */
        CLOCK_EnableClock(kCLOCK_Gpio0);
        BOARD_InitPins();
        BOARD_BootClockFRO12M();
       
        /* Initialize the systick module. */
        //SysTick_Config(12000000UL);
        SysTick_Config(12000UL);
       
        LED_RED_INIT(LOGIC_LED_OFF);
        LED_GREEN_INIT(LOGIC_LED_ON);
       
        while (1) {
            g_delay_ms=1000;
            while(1) {
                if (g_delay_ms>500) {
                    LED_GREEN_ON();
                } else {
                    LED_GREEN_OFF();
                }
                
                if (g_delay_ms==0) {
                    break;
                }
            }
        }
    }

    不知道为什么前面的处理会有问题。在不断调试的过程中,终于发现,还是以前遇到的那个问题,就是在死循环中如果没有什么有效的处理代码,这个循环丝毫不起作用。必须追加一行有效代码,那个延迟处理才能正常运转。不过在把变量g_delay_ms的生命中加上volatile修饰符之后,《volatile uint32_t g_delay_ms = 0;》,问题也被解决了。唉,这个问题,真是搞不懂。估计和编译器的设置有关。

    移植过程中,一定要注意,除了IO口的初始化,一定不要忘了设置IO的输出方向。

    在移植完TFT的程序后,编译、测试,
    tft.gif

    哎...今天够累的,签到来了~
    回复

    使用道具 举报

  • TA的每日心情
    开心
    3 小时前
  • 签到天数: 582 天

    连续签到: 2 天

    [LV.9]以坛为家II

    21

    主题

    931

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    2527
    最后登录
    2025-10-1
    发表于 2024-7-12 20:31:45 | 显示全部楼层
    大佬,可以分享一下源码,我学习一下吗?
    哎...今天够累的,签到来了~
    回复 支持 1 反对 0

    使用道具 举报

  • TA的每日心情
    慵懒
    2024-10-6 18:29
  • 签到天数: 3 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    1

    主题

    6

    帖子

    0

    注册会员

    Rank: 2

    积分
    54
    最后登录
    2024-10-31
    发表于 2024-9-19 09:46:22 | 显示全部楼层
    被编译器优化了,很正常
    你好,今天天气不错
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-10-1 09:30 , Processed in 0.089582 second(s), 23 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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