查看: 3583|回复: 0

[原创] 【LPC54114】学习9: oled测试

[复制链接]
  • TA的每日心情
    奋斗
    2025-5-7 09:07
  • 签到天数: 353 天

    连续签到: 1 天

    [LV.8]以坛为家I

    141

    主题

    8056

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    5785
    最后登录
    2025-5-7
    发表于 2017-5-1 23:03:18 | 显示全部楼层 |阅读模式
    本帖最后由 wambob 于 2017-5-1 23:22 编辑

            还是没读懂SDK2.2库的SPI代码,使用SPI驱动oled没成功。
    使用模拟SPI测试下吧。
    OLED一共需要7根线。除了电源和地外。需要使用5个IO口。
    //0.14 CS 0.11 sck 0.12 sda 1.9 RST 1.8DC
    首先设置这几个IO的复用功能设置。
    1. /* SPI3 pins */
    2.         IOCON_PinMuxSet(IOCON, 0,  14, (IOCON_FUNC0 | IOCON_MODE_PULLUP | IOCON_GPIO_MODE | IOCON_DIGITAL_EN));  /* SPI3_CS - FLASH */
    3.         IOCON_PinMuxSet(IOCON, 0, 11, (IOCON_FUNC0 | IOCON_MODE_PULLUP | IOCON_GPIO_MODE | IOCON_DIGITAL_EN));  /* SPI3_SCK        */
    4.         IOCON_PinMuxSet(IOCON, 0,  12, (IOCON_FUNC0 | IOCON_MODE_PULLUP | IOCON_GPIO_MODE | IOCON_DIGITAL_EN));  /* SPI3_MOSI       */
    5.         //IOCON_PinMuxSet(IOCON, 0,  13, (IOCON_FUNC0 | IOCON_MODE_PULLUP | IOCON_GPIO_MODE | IOCON_DIGITAL_EN));  /* SPI3_MISO       */
    6.         IOCON_PinMuxSet(IOCON, 1,  8, (IOCON_FUNC0 | IOCON_MODE_PULLUP | IOCON_GPIO_MODE | IOCON_DIGITAL_EN));  /* DC      */
    7.         IOCON_PinMuxSet(IOCON, 1,  9, (IOCON_FUNC0 | IOCON_MODE_PULLUP | IOCON_GPIO_MODE | IOCON_DIGITAL_EN));  /* RST       */
    复制代码
    在函数中开始IO口时钟并初始化这几个管脚。
    1. gpio_pin_config_t gpioConfig=
    2.     { kGPIO_DigitalOutput, 0};
    3.         
    4.         CLOCK_AttachClk(BOARD_DEBUG_UART_CLK_ATTACH);
    5.     /* enable clock for GPIO*/
    6.     CLOCK_EnableClock(kCLOCK_Gpio0);
    7.     CLOCK_EnableClock(kCLOCK_Gpio1);
    8.     SysTick_Init();
    9.     BOARD_InitPins();
    10.      BOARD_BootClockFROHF48M();
    11.     BOARD_InitDebugConsole();
    12.     GPIO_PinInit(GPIO, 0, 15, &gpioConfig);
    13.         //0.14 CS 0.11 sck 0.12 sda 1.9 RST 1.8DC
    14.          GPIO_PinInit(GPIO, 0, 14, &gpioConfig);
    15.          GPIO_PinInit(GPIO, 0, 11, &gpioConfig);
    16.          GPIO_PinInit(GPIO, 0,12, &gpioConfig);
    17.          GPIO_PinInit(GPIO, 1, 8, &gpioConfig);
    18.          GPIO_PinInit(GPIO, 1, 9, &gpioConfig);
    19.       
    20.       GPIO_SetPinsOutput(GPIO, 0, 1<<14);
    21.       GPIO_SetPinsOutput(GPIO, 0, 1<<11);
    22.       GPIO_SetPinsOutput(GPIO, 0, 1<<12);
    23.       GPIO_SetPinsOutput(GPIO, 1, 1<<8);
    24.       GPIO_SetPinsOutput(GPIO, 1, 1<<9);      
    复制代码
    这样SPI的模拟功能脚初始化完毕。接下来准备OLED驱动文件了。
    管脚的写功能
    1. #define CS_L() GPIO_ClearPinsOutput(GPIO, 0, 1<<14)
    2. #define CS_H() GPIO_SetPinsOutput(GPIO, 0, 1<<14)        

    3. #define RST_L() GPIO_ClearPinsOutput(GPIO, 1, 1<<9)
    4. #define RST_H() GPIO_SetPinsOutput(GPIO, 1, 1<<9)       
    5.        
    6. #define DC_L() GPIO_ClearPinsOutput(GPIO, 1, 1<<8)
    7. #define DC_H() GPIO_SetPinsOutput(GPIO, 1, 1<<8)        

    8. #define SCK_L() GPIO_ClearPinsOutput(GPIO, 0, 1<<11)
    9. #define SCK_H() GPIO_SetPinsOutput(GPIO, 0, 1<<11)

    10. #define SDI_L() GPIO_ClearPinsOutput(GPIO, 0, 1<<12)
    11. #define SDI_H() GPIO_SetPinsOutput(GPIO, 0, 1<<12)   
    复制代码
    驱动OLED主要包括向其写数据、写命令。正常显示前还需要对其初始化,可参考手册中代码。也可直接移植其他OLED驱动。
    4线SPI模式下的写操作时序图
    无标题.png
    在时钟的上升沿,数据移入到SPI从器件。相应的代码如下:
    1. void Send_Byte(uint8_t dat)
    2. {
    3.     uint8_t i;   
    4.     for(i=0;i<8;i++)
    5.     {
    6.         if(dat&0x80)
    7.     {
    8.             SDI_H();
    9.     }
    10.         else
    11.             SDI_L();
    12.          SCK_L();
    13.      SCK_H();
    14.      dat<<=1;            
    15.     }
    16. }
    复制代码
    加上片选和DC命令数据选择就可以发送数据或指令了。
    1. void WriteCommand(uint8_t cmd)
    2. {   
    3.         CS_L();
    4.         DC_L();
    5.         Send_Byte(cmd);
    6.         //Delay_10us(1);
    7.         CS_H();
    8. }

    9. void WriteData(uint8_t dat)
    10. {
    11.         
    12.     CS_L();
    13.         DC_H();
    14.         Send_Byte(dat);
    15.         //Delay_10us(1);
    16.         CS_H();
    17. }
    复制代码
    使用模拟的SPI,这几个函数是基本的函数。
    剩下的工作就是对OLED初始化,和一些驱动函数了,比如,显示字符,数字和图片等。
    在主函数中加入初始化代码和调用一些驱动函数来达到需要的目的。
    1. oled_init();
    2.             
    3.           oled_page(0);
    4.     oled_column(20);
    5.           DisplayStr("NXP shequ");
    6.         
    7.     oled_page(1);
    8.     oled_column(0);
    9.           DisplayStr("LPC54114 TEST!");
    10. oled_page(6);
    11.         oled_column(25);
    12.                 DisplayStr("---NXP---");

    13.          
    复制代码
    来个图片吧
    IMG_20170501_231126.jpg

    该会员没有填写今日想说内容.
    回复

    使用道具 举报

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

    本版积分规则

    关闭

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

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

    GMT+8, 2025-7-25 08:51 , Processed in 0.080344 second(s), 20 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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