查看: 772|回复: 0

[评测分享] 【NXP OKdo E1双核Cortex M33开发板】Core1通过SPI接口驱动OLED

[复制链接]
  • TA的每日心情
    开心
    2022-11-7 10:36
  • 签到天数: 898 天

    连续签到: 1 天

    [LV.10]以坛为家III

    发表于 2020-11-16 08:04:51 | 显示全部楼层 |阅读模式
    分享到:
    基于Keil双核架构的研究1
    -core1作为显示核心
    1.  设计思想
    LPC55S69具有2个相同的Cortex-M33内核,Core0作为主核心,Core1作为辅助核心。使用Core1驱动Oled显示器,作为显示模块使用。可以大大的解放Core0的工作量,完成数据的采集和运行,让后将结果通过Core1显示出来。
    显示模块为0.96寸的Oled显示器,采用SPI接口通讯。为了充分的设计验证,分别采用GPIO的方式模拟SPI时序和SPI硬件方式驱动oled显示器。基本引脚引用关系为:
      
    序号
      
    oled引脚
    GPIO模式引脚
    SPI模式引脚
    1
    CS
    PIO 0_14
    FC1 CS
    2
    MOSI
    PIO 1_10
    FC1 SDA
    3
    SCK
    PIO 1_9
    FC1 SCK
    4
    RS
    PIO 0_13
    PIO 0_13
    5
    RST
    PIO 1_8
    PIO 1_8
    2.  软件实践2.1. 资源配置
    通过Config tools工具完成对于Core1引脚使用的配置。
    GPIO模式下的配置:
    1.png
    SPI模式下的配置:
    2.png
    3.png
    配置完成后生成驱动代码。
    2.2. 增加OLED驱动到Core1工程中
    4.png
    如图所示,将oled.c oled.h font.h增加到Core1的工程中。
    2.3. 修改oled驱动
    移植oled驱动中写入字节的函数,完成驱动修改。GPIO模式如下所示:
    void OLED_WR_Byte(u8 dat,u8 cmd)
    {
       u8 i;
    //  OLED_RS=cmd;//命令、数据选择
    //  OLED_CS=0;
           GPIO_PinWrite(BOARD_INITPINS_CORE1_LCD_RS_GPIO,BOARD_INITPINS_CORE1_LCD_RS_PORT, (BOARD_INITPINS_CORE1_LCD_RS_PIN),cmd);
           GPIO_PinWrite(BOARD_INITPINS_CORE1_LCD_CS_GPIO,BOARD_INITPINS_CORE1_LCD_CS_PORT, (BOARD_INITPINS_CORE1_LCD_CS_PIN),0);
           //数据移位输出,msb first
           for(i=0;i<8;i++)
           {
    //     OLED_SCLK=0;
               GPIO_PinWrite(BOARD_INITPINS_CORE1_LCD_SCK_GPIO,BOARD_INITPINS_CORE1_LCD_SCK_PORT, (BOARD_INITPINS_CORE1_LCD_SCK_PIN),0);
               if(dat&0x80)
    //         OLED_SDIN=1;
                  GPIO_PinWrite(BOARD_INITPINS_CORE1_LCD_SDA_GPIO,BOARD_INITPINS_CORE1_LCD_SDA_PORT, (BOARD_INITPINS_CORE1_LCD_SDA_PIN),1);
               else
    //         OLED_SDIN=0;
                  GPIO_PinWrite(BOARD_INITPINS_CORE1_LCD_SDA_GPIO,BOARD_INITPINS_CORE1_LCD_SDA_PORT, (BOARD_INITPINS_CORE1_LCD_SDA_PIN),0);
    //     OLED_SCLK=1;
               GPIO_PinWrite(BOARD_INITPINS_CORE1_LCD_SCK_GPIO,BOARD_INITPINS_CORE1_LCD_SCK_PORT, (BOARD_INITPINS_CORE1_LCD_SCK_PIN),1);
               dat<<=1;
           }
    //  OLED_CS=1;
    //  OLED_RS=1;
           GPIO_PinWrite(BOARD_INITPINS_CORE1_LCD_CS_GPIO,BOARD_INITPINS_CORE1_LCD_CS_PORT, (BOARD_INITPINS_CORE1_LCD_CS_PIN),1);
           GPIO_PinWrite(BOARD_INITPINS_CORE1_LCD_RS_GPIO,BOARD_INITPINS_CORE1_LCD_RS_PORT, (BOARD_INITPINS_CORE1_LCD_RS_PIN),1);
    }
    SPI模式如下所示:
    void OLED_WR_Byte(u8 dat,u8 cmd)
    {
       spi_transfer_t xfer            ={0};
       
           GPIO_PinWrite(BOARD_INITPINS_LCD_RS_GPIO,BOARD_INITPINS_LCD_RS_PORT, (BOARD_INITPINS_LCD_RS_PIN),cmd);
           srcBuff[0]= dat;
       /*Start Transfer*/
       xfer.txData      = srcBuff;
       xfer.rxData      = destBuff;
       xfer.dataSize    = 1;
       xfer.configFlags = kSPI_FrameAssert;
       SPI_MasterTransferBlocking(SPI1, &xfer);
           GPIO_PinWrite(BOARD_INITPINS_LCD_RS_GPIO,BOARD_INITPINS_LCD_RS_PORT, (BOARD_INITPINS_LCD_RS_PIN),1);
    }
    2.4. 初始化和显示刷新
    Core1的main函数中,增加Oled的初始化函数,显示刷新函数。
        OLED_Init();
        OLED_ShowString(10,0,"OKDoE1 NXP");
        OLED_Refresh_Gram();  
          
       for (;;)
        {
                  lcd_count++;
                  if((lcd_count% 500) == 0)
                  {
    GPIO_PortToggle(GPIO, BOARD_INITPINS_CORE1_LED_R_PORT,
    1u <<BOARD_INITPINS_CORE1_LED_R_PIN);
                  }
                  sprintf((char*)lcd_disp,"%05d",lcd_count);
                  OLED_ShowString(20,25,lcd_disp);
                  OLED_Refresh_Gram();  
               
    }
    显示效果为在屏幕上刷新一个自增的16位数字,增加到65535后自动变为0.
    3.  效果验证
    通过GPIO模式和SPI模式都可以在core1中正确运行,驱动显示刷新。
    1.gif
    实际显示效果展示,通过Core1完成了oled的显示驱动。

    回复

    使用道具 举报

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

    本版积分规则

    关闭

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

    手机版|小黑屋|与非网

    GMT+8, 2024-3-29 02:57 , Processed in 0.108719 second(s), 17 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2020, Tencent Cloud.