在线时间828 小时
UID3079326
注册时间2015-2-11
NXP金币28
TA的每日心情 | 奋斗 2025-5-7 09:07 |
---|
签到天数: 353 天 连续签到: 1 天 [LV.8]以坛为家I
金牌会员
 
- 积分
- 5785
- 最后登录
- 2025-5-7
|
本帖最后由 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的复用功能设置。
- /* SPI3 pins */
- IOCON_PinMuxSet(IOCON, 0, 14, (IOCON_FUNC0 | IOCON_MODE_PULLUP | IOCON_GPIO_MODE | IOCON_DIGITAL_EN)); /* SPI3_CS - FLASH */
- IOCON_PinMuxSet(IOCON, 0, 11, (IOCON_FUNC0 | IOCON_MODE_PULLUP | IOCON_GPIO_MODE | IOCON_DIGITAL_EN)); /* SPI3_SCK */
- IOCON_PinMuxSet(IOCON, 0, 12, (IOCON_FUNC0 | IOCON_MODE_PULLUP | IOCON_GPIO_MODE | IOCON_DIGITAL_EN)); /* SPI3_MOSI */
- //IOCON_PinMuxSet(IOCON, 0, 13, (IOCON_FUNC0 | IOCON_MODE_PULLUP | IOCON_GPIO_MODE | IOCON_DIGITAL_EN)); /* SPI3_MISO */
- IOCON_PinMuxSet(IOCON, 1, 8, (IOCON_FUNC0 | IOCON_MODE_PULLUP | IOCON_GPIO_MODE | IOCON_DIGITAL_EN)); /* DC */
- IOCON_PinMuxSet(IOCON, 1, 9, (IOCON_FUNC0 | IOCON_MODE_PULLUP | IOCON_GPIO_MODE | IOCON_DIGITAL_EN)); /* RST */
复制代码 在函数中开始IO口时钟并初始化这几个管脚。
- gpio_pin_config_t gpioConfig=
- { kGPIO_DigitalOutput, 0};
-
- CLOCK_AttachClk(BOARD_DEBUG_UART_CLK_ATTACH);
- /* enable clock for GPIO*/
- CLOCK_EnableClock(kCLOCK_Gpio0);
- CLOCK_EnableClock(kCLOCK_Gpio1);
- SysTick_Init();
- BOARD_InitPins();
- BOARD_BootClockFROHF48M();
- BOARD_InitDebugConsole();
- GPIO_PinInit(GPIO, 0, 15, &gpioConfig);
- //0.14 CS 0.11 sck 0.12 sda 1.9 RST 1.8DC
- GPIO_PinInit(GPIO, 0, 14, &gpioConfig);
- GPIO_PinInit(GPIO, 0, 11, &gpioConfig);
- GPIO_PinInit(GPIO, 0,12, &gpioConfig);
- GPIO_PinInit(GPIO, 1, 8, &gpioConfig);
- GPIO_PinInit(GPIO, 1, 9, &gpioConfig);
-
- GPIO_SetPinsOutput(GPIO, 0, 1<<14);
- GPIO_SetPinsOutput(GPIO, 0, 1<<11);
- GPIO_SetPinsOutput(GPIO, 0, 1<<12);
- GPIO_SetPinsOutput(GPIO, 1, 1<<8);
- GPIO_SetPinsOutput(GPIO, 1, 1<<9);
复制代码 这样SPI的模拟功能脚初始化完毕。接下来准备OLED驱动文件了。
管脚的写功能
- #define CS_L() GPIO_ClearPinsOutput(GPIO, 0, 1<<14)
- #define CS_H() GPIO_SetPinsOutput(GPIO, 0, 1<<14)
- #define RST_L() GPIO_ClearPinsOutput(GPIO, 1, 1<<9)
- #define RST_H() GPIO_SetPinsOutput(GPIO, 1, 1<<9)
-
- #define DC_L() GPIO_ClearPinsOutput(GPIO, 1, 1<<8)
- #define DC_H() GPIO_SetPinsOutput(GPIO, 1, 1<<8)
- #define SCK_L() GPIO_ClearPinsOutput(GPIO, 0, 1<<11)
- #define SCK_H() GPIO_SetPinsOutput(GPIO, 0, 1<<11)
- #define SDI_L() GPIO_ClearPinsOutput(GPIO, 0, 1<<12)
- #define SDI_H() GPIO_SetPinsOutput(GPIO, 0, 1<<12)
复制代码 驱动OLED主要包括向其写数据、写命令。正常显示前还需要对其初始化,可参考手册中代码。也可直接移植其他OLED驱动。
4线SPI模式下的写操作时序图
在时钟的上升沿,数据移入到SPI从器件。相应的代码如下:
- void Send_Byte(uint8_t dat)
- {
- uint8_t i;
- for(i=0;i<8;i++)
- {
- if(dat&0x80)
- {
- SDI_H();
- }
- else
- SDI_L();
- SCK_L();
- SCK_H();
- dat<<=1;
- }
- }
复制代码 加上片选和DC命令数据选择就可以发送数据或指令了。
- void WriteCommand(uint8_t cmd)
- {
- CS_L();
- DC_L();
- Send_Byte(cmd);
- //Delay_10us(1);
- CS_H();
- }
- void WriteData(uint8_t dat)
- {
-
- CS_L();
- DC_H();
- Send_Byte(dat);
- //Delay_10us(1);
- CS_H();
- }
复制代码 使用模拟的SPI,这几个函数是基本的函数。
剩下的工作就是对OLED初始化,和一些驱动函数了,比如,显示字符,数字和图片等。
在主函数中加入初始化代码和调用一些驱动函数来达到需要的目的。
- oled_init();
-
- oled_page(0);
- oled_column(20);
- DisplayStr("NXP shequ");
-
- oled_page(1);
- oled_column(0);
- DisplayStr("LPC54114 TEST!");
- oled_page(6);
- oled_column(25);
- DisplayStr("---NXP---");
-
复制代码 来个图片吧
|
|