菜鸟ShelbyK60学习笔记001---GPIO模拟SPI驱动OLED

Hasana ·
更新时间:2024-09-21
· 887 次阅读

话不多说,先上代码。

#include "spi.h" #include "gpio.h" #include "oled0.h" #include "GPIO_MK60DZ10.h" //写命令函数 void writecmd(unsigned char cmd) { spi_writebyte(cmd,0);//DC 0 CMD 1 DATA return; } //写数据函数 void writedata(unsigned char data) { spi_writebyte(data,1);//DC 0 CMD 1 DATA return; } //向模块(SSD1306)写入一个字节 8 bit void spi_writebyte(unsigned char data,unsigned char DC) { GPIO_ctrl(PTC,14,1);//RST高电平 oled_delay_ms(1); GPIO_ctrl(PTC,10,0);//cs 低电平 oled_delay_ms(1); GPIO_ctrl(PTC,18,1);//SCLK高电平 oled_delay_ms(1); if(DC==1) { GPIO_ctrl(PTC,12,1); } if(DC==0) { GPIO_ctrl(PTC,12,0); } oled_delay_ms(1); //8 bit for(unsigned char i=0;i<8;i++) { oled_delay_ms(1); GPIO_ctrl(PTC,18,0); oled_delay_ms(1); //判断最高位 if(data&0x80) { GPIO_ctrl(PTC,16,1);//SDA置高 oled_delay_ms(1); } else { GPIO_ctrl(PTC,16,0);//SDA置低 oled_delay_ms(1); } GPIO_ctrl(PTC,18,1);//SCLK高电平 oled_delay_ms(1); data<<=1; //传送下一比特 } return; }

对于OLED的驱动,各个论坛上都有大佬进行了详细的分析,今天我要说的重点在于SPI时序的GPIO模拟,作为一个新手,我在做这个模块时费了很多时间在调试上。刚开始做的时候,仅仅是想把显示屏执行clear的功能,然而程序没有报错,但运行起来,却只能清除page0的内容(或其它单独一页,就是无法一次操作多页),一开始以为是writecmd()写命令太快导致的,于是在oled_fill()函数里加了许多延时如下

//填充屏幕 b=0xff 全亮 b=0x00全暗 void oled_fill(unsigned char b) { for(unsigned char y=0xb0;y<0xb8;y++)//page 0-7 { //oled_delay_ms(1000); writecmd(y); //oled_delay_ms(100); writecmd(0x00); //oled_delay_ms(100); writecmd(0x10); // oled_delay_ms(100); for(unsigned char i=0;i<128;i++)//128列 { writedata(b);//写入一个字节 } } return; }

结果然并卵,经过一波查询,最终在spi_writebyte()里加上了延时。才算是大功告成。
原因分析:让我们回到手册,结合下图可以看出,约定的时间参数都是最小值,对应的都是频率的最大值,那么就需要ARM发过来的数据慢一些,太快的话就会处理不过来,数据就会执行混乱。所以就应该加上适当延时。在这里插入图片描述
今天就先更到这里,也在学习K60的小伙伴可关注一下,一起交流。新手刚上路,写的不好请多批评[汪柴汪柴].


作者:建丰_ini



学习笔记 spi gpio oled 学习

需要 登录 后方可回复, 如果你还没有账号请 注册新账号