找回密码
 立即注册
楼主: zhp

AiCube图形化程序自动生成【SPI,SPI-DMA,I2C,I2C-DMA】代码,驱动OLED-12864

[复制链接]
  • 打卡等级:常住居民II
  • 打卡总天数:97
  • 最近打卡:2025-07-31 08:20:26
已绑定手机

13

主题

66

回帖

415

积分

中级会员

积分
415
发表于 2025-7-22 23:09:25 | 显示全部楼层
大*** 发表于 2025-7-22 19:15
1. 关于0xB0指令,虽然SSD1306、SSD1309和SSD1315的数据手册里都说的是“Under Page Address Mode”,但是 ...

代码已上传,我再描述一下总体的现象:

1. 40MHz下,当且仅当I2C时钟分频为3时,运行正常,分频大于或小于这个数都不正常。24MHz下,I2C分频小于等于2时均能正常运行。
2. void OLED_Refresh(void)函数中,添加页起始地址命令会使图像整体上移1行,而变更B0-B7没有体现任何变化,注释掉以后则图像恢复正常显示。
麻烦帮忙看下到底问题出在哪里,多谢了

OLED_IIC_DMA.zip

651.56 KB, 下载次数: 5

点评

看了下代码,两个问题都找到原因了。 1、速度的问题 40MHz运行时,因为速度太快,导致硬件I2C的速度高于了OLED允许的速度,所以屏幕不能工作。解决办法是通过降频放慢速度。 用AiCube生成框架的时候,在clock.c文  详情 回复 发表于 2025-7-23 10:12
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:478
  • 最近打卡:2025-07-31 08:17:19

31

主题

366

回帖

3189

积分

荣誉版主

积分
3189
发表于 2025-7-23 10:12:08 | 显示全部楼层
mech*** 发表于 2025-7-22 23:09
代码已上传,我再描述一下总体的现象:

1. 40MHz下,当且仅当I2C时钟分频为3时,运行正常,分频大于或小 ...

看了下代码,两个问题都找到原因了。


1、速度的问题

40MHz运行时,因为速度太快,导致硬件I2C的速度高于了OLED允许的速度,所以屏幕不能工作。解决办法是通过降频放慢速度。
用AiCube生成框架的时候,在clock.c文件里的始终初始化函数里,会有一句设置时钟分频的命令
截图202507230933005122.jpg

你的程序里没有进行降频,所以用40MHz烧录的时候屏幕就懵了。所以在你的代码里,也在时钟初始化函数里添加上降频的命令,屏幕就可以亮了。
经过实际实验,在40MHz下运行时,分频数在2以上,就可以让SSD1306的屏幕工作了。
不同屏幕性能不一样,如果2不行就继续增加。
截图202507230936448072.jpg


=======================================================================

2、0xB0问题

看了下你写的 OLED_Refresh 函数
截图202507230940384815.jpg

先说将指令 0x21 和 0x22 的部分解除注释后可以正常显示,是因为它把显示范围设置在了128列×8行的区域,也就是全屏范围;
而注释掉之后,屏幕上电使用的默认值也是这个范围,所以操作全屏的时候,有没有这两个指令效果是一样的。

然后重点说下0xB0指令出问题的原因,有两个需要注意的地方。

首先是画面偏移的问题
这段代码里设置的是 0xB2,也就是“0xB0+2”,意思是在屏幕显示范围是128列×8行的情况下,从PAGE2开始显示。
又因为屏幕初始化的时候,寻址模式设置的是水平地址模式。
所以接下来用 OLED_WR_DAT(OledCache, 1024); 连续发送1024个数据的话,根据水平地址模式的寻址顺序
截图202507230949179418.jpg

从PAGE2开始,按照PAGE2、PAGE3、PAGE4、PAGE5、PAGE6、PAGE7的顺序一行一行填充,每行128个数据。
当填完屏幕最后一行的最后一列之后,已经填完了(128×6=768)个字节,
剩下的256个字节,会回到屏幕的PAGE0的第0列开始继续填充,刚好填完PAGE0和PAGE1这两行。从而画面就产生偏移了。
如果只是单纯变更B0~B7,结果也只是画面偏移多少行而已。

第二点就是用0xB0定位和发送数据的数量问题
在这段程序里,OLED_WR_DAT(OledCache, 1024); 是一次性发送1024个数据。如果用指令0xB0分别指定每一行,每次只需要发送128个数据就够了(多了浪费,因为还会被下一行重新覆盖掉)。
所以在你的程序里,重新写了一个分行刷新的方式的刷新函数,除了每次定位屏幕上的一个PAGE,每次发送的数据个数,也改成每行对应的128个。
每发完128个数据,就让指针指向(128×page)之后的那个数据。(跟读取字符字库数组的思路一样)
截图202507231008153894.jpg

用这种方式刷新屏幕,即便是SH1106之类没有水平地址模式的屏幕,也可以正常刷新全屏了。(在你的工程里可以正常显示)






1 喜欢他/她就送朵鲜花吧,赠人玫瑰,手有余香!
能体会到发现一个不理解的现象然后找原因然后要么解决掉问题要么被问题解决掉的那种快乐是我的幸运
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民II
  • 打卡总天数:97
  • 最近打卡:2025-07-31 08:20:26
已绑定手机

13

主题

66

回帖

415

积分

中级会员

积分
415
发表于 2025-7-23 21:05:39 | 显示全部楼层
大*** 发表于 2025-7-23 10:12
看了下代码,两个问题都找到原因了。

1. 关于频率

稍微说明一下,我在AI Cube里特意将”选择内部高速IRC频率”这一栏设置为了“ISP下载时动态调节的频率”选项,这样方便在ISP中随时改变“输入用户程序运行时的IRC频率”看看最高多少频率下能够正常运行OLED,所以看不到CLK_SYSCLK_Divider(10)这个函数。如果该选项改为“内部预置频率”,AI Cube的确是会自动生成这条函数的。所以并不是我少写或删除了这条函数。如果该选项改为“内部预置频率”,并保留默认的40MHZ,即使有这条函数,也是无法让OLED除了在I2C分频设置为3以外的情况下正常运行的。但是我不想纠结了,或许是因为我这块OLED情况比较特别,不支持在40MHz下运行,降频情况下能运行我也OK了~ 反复尝试下来在30MHZ以下均能稳定运行,偶而最高能在36.864MHz下运行,但不能稳定复现。
屏幕截图 2025-07-23 194234.png
屏幕截图 2025-07-23 194325.png

2.关于0XB0
我试了一下上楼提供的for循环函数,的确运行正常,说明在水平地址模式下,0xB0确实是起作用的,这个纠正了我之前的错误认识,感谢。不过我上传的代码中,只是恰好留下的设置是 0xB2。事实上不管是0xB0也好,还是0xB几都好,就像我注释里写的和下图显示的,整个图像都会向上偏移一行,与具体数值无关。那究竟是为什么呢,我感觉结合0xB0是会起作用的情况,我现在应该是能想通原因了。

OLED_WR_DAT(OledCache, 1024)这条语句会写入1024个字节的整屏数据。cmd[0] = 0xB0这条语句会让前128个数据写进屏幕的第1行(如果是0xB1就写入第2行)。写完之后剩下1024-128=896个数据怎么办呢。因为屏幕初始化的时候,寻址模式设置的是水平地址模式,且0x22的默认范围是第1行到第7行,所以程序就会继续从第1行屏幕开头开始写入剩余的896个数据。写的时候会顺便覆盖掉一开始通过0xb*命令写入的那行数据。又因为总体少了128个数据,所以最后一行永远是空的。导致最终的现象是图像永远整体上移一行,最后一行是空行

为了进一步验证我的想法,我将0xB0改为0xB7,即cmd[0] = 0xB7。这样一来,一开始的128个数据会写入屏幕最后一行,剩余的896个数据会依此从第1行写到第7行。与其他0xB*情况不同的是,最后一行的数据不会被覆盖掉,会始终随着整体的图像变化而变化。即最终的现象是图像永远整体上移一行,最后一行是原本图像第一行的内容

所以如果希望通过0xb0来控制数据写入位置,就干脆在初始化语句中设为页地址模式来进行操作。如果设为了水平地址模式,就充分发挥这种模式的优势,让数据自己连续写下去就好了。除非运用已经很熟练了,否则不建议在水平地址模式下同时混合操作0xb0,否则容易出错(大佬例外)。

这个案我想到此为止就算是破了,谢谢大佬这几天不厌其烦地耐心分析讲解。感激

IMG_9334.jpg
  1. void OLED_Refresh(void)
  2. {        
  3.    uint8_t cmd[3];
  4.    /*此处变更页起始地址命令会是图像整体上移1行,注释掉以后则正常显示*/   
  5.   cmd[0] = 0xB0;                      //设置页起始地址。除非设为0XB7,其写入的数据都会被后续的数据覆盖掉。
  6.   cmd[1] = 0x00;                      //设置低列起始地址
  7.   cmd[2] = 0x10;                      //设置高列起始地址
  8.   OLED_WR_CMD(cmd, 3);
  9.   OLED_WR_DAT(OledCache, 1024);       //写数据...
  10. }
复制代码



点评

1、显示结果正常就是最终目的,具体怎么用看个人喜好,跟是否大佬无关。 用分成几行单独填充的方式时,水平地址模式和页地址模式效果是一样的,但是兼容性更好,所以网上能找到的几乎所有驱动和例程都是使用0xB0的  详情 回复 发表于 7 天前
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:478
  • 最近打卡:2025-07-31 08:17:19

31

主题

366

回帖

3189

积分

荣誉版主

积分
3189
发表于 7 天前 | 显示全部楼层
mech*** 发表于 2025-7-23 21:05
1. 关于频率

稍微说明一下,我在AI Cube里特意将”选择内部高速IRC频率”这一栏设置为了“ISP下载时动态 ...

1、显示结果正常就是最终目的,具体怎么用看个人喜好,跟是否大佬无关。
用分成几行单独填充的方式时,水平地址模式和页地址模式效果是一样的,但是兼容性更好,所以网上能找到的几乎所有驱动和例程都是使用0xB0的方式进行定位;“0x21、0x22”的方式反而比较小众。

因此“混用”的说法,还是对“0x21、0x22”和“0xB0、0x00、0x10”的关系有误解。
打个比方,
“0x21、0x22”,相当于在一块空地上,选定一个位置,造一个设计好大小的房子;
而“0xB0、0x00、0x10”,则是在房子里面,什么位置摆什么家具。

二者是协作关系,其实一直是共存的。
只用“0x21、0x22”,不用“0xB0”,其实用的是0xB0的默认值(0xB0);
只用“0xB0”,不用“0x21、0x22”,则实际上用的是0x21、0x22的默认值(0x21, 0,127, 0x22,0,7)。

在划好的区域里面,同样遵循三种寻址模式,虽然数据手册里只提到了水平地址模式下的举例。就像前面说的,数据手册里也不完全权威,也会有疏漏。其它元件的也一样,网上也不少看到跟着数据手册进行配置然后掉坑里的抱怨。
下图是经过实测,三种寻址模式的效果。
在连续发送足够多的数据的时候,其中水平和垂直两种模式都支持自动填满;
页地址模式则是在区域里的第一个PAGE里反复填充,要填满就需要用0xB0给每一个PAGE分别填充数据。
截图202507240902226945.jpg

https://www.bilibili.com/video/BV12f421D7xS


2、关于“图像永远整体上移一行,最后一行是空行”
这种现象我也遇到过,还是太快的问题,导致发送数据有误。
数据混乱的结果有很多,花屏、上移一行最后空行、左右偏移、上下翻转、反色等等都有可能,就看混乱的是哪部分数据。
之前遇到这种“图像永远整体上移一行,最后一行是空行”的现象,感觉就好像DMA发丢了一行的数据或者接收第一行数据的时候走神儿了似的。
另外不同芯片的屏幕,对时序的要求也不完全相同。比如DMA方式发送屏幕翻转指令,SSD1306芯片的屏幕,左右翻转的指令有时候会失效,SSD1315芯片的则宽容度比较大,可以正常翻转。

3、既然是速度问题,前面的给系统降频的方法,是让整体速度降到OLED适合的速度,缺点是其它功能也会受到影响。如果不想给时钟整体降频,单独给I2C降频同样也是可以的。
就是只在I2C初始化的时候,对I2C进行降频、以及延长DMA发送间隔时间,同样可以点亮屏幕。

比如还是用你的代码,系统时钟不设置分频(不添加那行分频命令),直接用40MHz烧录运行。
然后硬件I2C使用分频,同样可以把I2C传输速度凑到OLED允许的速度范围,而不会影响其它功能使用40MHz的速度。
截图202507240842584718.jpg 截图202507241720119525.jpg



发现一个有意思的事情,基于你的程序
如果硬件I2C使用P32P33端口,I2C分频需要4,DMA发送间隔需要400,正常显示;
而使用P24P23这组端口,I2C分频3,DMA发送间隔0,就可以正常显示。
程序里用的P32P33,我常用的是P24P23.而我用AiCube生成的干净程序里三组端口速度是一样的。也就是说前面关于速度的讨论,起点就起错了

另外SSD1315的屏幕完全兼容SSD1306的,价格一样,比SSD1306的性能更稳定(比如对速度的宽容度等等),功能也更完善。个别功能可能不及SSD1306效果好(比如对比度指令,SSD1306能实现更丝滑的渐变)。所以选屏幕的时候,我现在也是尽可能选择SSD1315的。






能体会到发现一个不理解的现象然后找原因然后要么解决掉问题要么被问题解决掉的那种快乐是我的幸运
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民II
  • 打卡总天数:97
  • 最近打卡:2025-07-31 08:20:26
已绑定手机

13

主题

66

回帖

415

积分

中级会员

积分
415
发表于 7 天前 | 显示全部楼层
今天又做了一些实验,我想我对于0xB0在水平模式下的作用应该是不存在误解了,昨天的推论应该是正确的。为了避免传输速度可能造成显示效果上的影响,我将mcu频率调到了24MHz,并关闭了DMA传输。


我做了一张32X32的图片如下(即行高为4行),初始放在屏幕左上角。接着在刷新函数中添加0xB*命令如下。首先设为0xB4。如果0xB*在水平地址模式下是一个理想的、扮演定位起始点的命令,那么理论上0xB4会使得整个图像从第5行开始写入,依次写满第5-8行,最终效果为图像垂直偏移到屏幕下半部分。
IMG_9342.jpg
  1. void OLED_Refresh(void)
  2. {       
  3.     uint8_t cmd[3];
  4. cmd[0] = 0xB4;                      //设置页起始地址
  5. cmd[1] = 0x00;                      //设置低列起始地址
  6. cmd[2] = 0x10;                      //设置高列起始地址
  7. OLED_WR_CMD(cmd, 3);
  8.         OLED_WR_DAT(OledCache, 1024);
  9. }
复制代码


但是实际情况是什么呢。图片显示效果如下,就是除了第一行不见了,什么也没发生。其实原因我昨天也已经分析了。OLED_WR_DAT(OledCache, 1024)这条语句会写入1024个字节的整屏数据。cmd[0] = 0xB4这条语句会让前128个数据写进屏幕的第5行。写完之后剩下1024-128=896个数据怎么办呢。因为屏幕初始化的时候,寻址模式设置的是水平地址模式,且0x22的默认范围是第1行到第7行,所以程序就会继续从第1行屏幕开头开始写入剩余的896个数据。写的时候会顺便覆盖掉一开始通过0xb4命令写入的那行数据。又因为总体少了128个数据,所以最后一行是空的。导致最终的现象是图像整体上移一行。如果将0xB4改为0xB5和0xB6,得到的现象是一模一样的,原因分析也是一样。
IMG_9344.jpg

那如果改为0xB7,则情况略有不同,显示效果如下。原因是,一开始的128个数据会写入屏幕最后一行(第8行),剩余的896个数据会依此从第1行写到第7行。因为数据写到第7行就写完了,所以最后一行的数据不会被覆盖掉,即最终的现象是图像整体上移一行,最后一行是原本图像第一行的内容。
IMG_9345.jpg

那要实现通过0xb0命令来控制图像整体下移的方法是什么呢。只有通过以下命令,一行行定位后写入数据才能达成。而这种方式其实就是页地址模式下的操作,它和水平地址的关系已经不大了。只是在水平模式的初始化设置下,实现了页地址模式的写入操作而已。
  1. uint8_t page;
  2. for(page=0;page<8;page++)
  3. {
  4.   cmd[0]=0xB4+page;
  5.   OLED_WR_CMD(cmd, 3);
  6.   OLED_WR_DAT(OledCache+page*128, 128);
  7. }
复制代码
IMG_9343.jpg

所以,结论还是0xB0在水平模式下能用,但也仅仅是能用而已,并无法发挥水平地址模式下数据可以连续写入的优势,应该算不得是水平模式的最佳搭档。如果要正确使用,本质上就是在页地址模式下画图。所以我猜这也就是数据手册不推荐它用在水平地址模式下的原因吧。

如果要实现图像偏移,其实我提供的代码中的实现方式挺好的(不是我写的,是4楼的代码,我拷贝下来学习而已)。它把需要显示的图像数组拷贝到1024大小的OledCache缓存数组的特定位置中,然后只要在默认的设置下通过改变x,y参数就可以实现图像偏移了,充分利用了水平模式下可以连续写入数据的特性。唯一的问题是,它原本的代码中多加了一个0xB0的语句,导致图像向上偏移一行,也就导致了后来以上所有的讨论。其实只要注释掉0xb0,一切就完美了。
  1. void OLED_ShowBMP(int x, int y, int w, int h, uint8_t *bmp, uint8_t rf)
  2. {
  3.     int i, j;
  4.     uint8_t dat;
  5.    
  6.     for (j = 0; j < h; j++)
  7.     {
  8.         for (i = 0; i < w; i++)
  9.         {
  10.             dat = *bmp++;               //读取图片数据
  11.             if (fReverseMode)           //如果反白显示则将数据取反
  12.                 dat = ~dat;
  13.             OledCache[(y+j) * 128 + (x+i)] = dat;
  14.         }
  15.     }
  16.     if (rf)
  17.         OLED_Refresh();                 //刷新显示
  18. }
复制代码


另外,我又看了下数据手册,还发现了一个有趣的命令,就是0xD3,这个似乎是ssd1306专门用于偏移图像所使用的命令。我也小试了一下,能够达到预期效果。
屏幕截图 2025-07-24 214256.png
IMB_JmZEbf.GIF

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民II
  • 打卡总天数:97
  • 最近打卡:2025-07-31 08:20:26
已绑定手机

13

主题

66

回帖

415

积分

中级会员

积分
415
发表于 6 天前 | 显示全部楼层
大*** 发表于 2025-7-24 09:44
1、显示结果正常就是最终目的,具体怎么用看个人喜好,跟是否大佬无关。
用分成几行单独填充的方式时,水 ...

关于速度问题,用逻辑分析仪看了下波形,在40Mhz和i2c 2分频的高速情况下,波形也可以是正常的。这个时候SCL周期已经只有458ns了,远低于手册中最小周期2.5us的规定。所以,确实速度超过手册的要求有时候也是能正常运行的,只是可能不太稳定。比如我改变了显示的内容,发现在40Mhz、i2c 2分频和开启DMA的高速情况下也能正常显示了。所以不想继续纠结速度了,就这样吧。只能保守地认为想要完全稳定运行的话,就把速度降低一点就好了

屏幕截图 2025-07-25 005808.png

总之,感谢这几天以来不厌其烦地交流指导,本来以前用OLED12864都是直接搬代码拿来用就好了。这几天还真是好好读了一下手册,研究了一番,学到了一些细节上的东西。

点评

找到这个讨论的根源在哪了! SSD1306芯片和SSD1315芯片的屏幕,外观上最醒目的区别就是屏幕下方的那个刘海儿(排线)宽度: [attachimg]109792[/attachimg] SSD1306芯片的排线略宽,SSD1315芯片的排线略窄。 [a  详情 回复 发表于 6 天前
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:478
  • 最近打卡:2025-07-31 08:17:19

31

主题

366

回帖

3189

积分

荣誉版主

积分
3189
发表于 6 天前 | 显示全部楼层
mech*** 发表于 2025-7-25 01:11
关于速度问题,用逻辑分析仪看了下波形,在40Mhz和i2c 2分频的高速情况下,波形也可以是正常的。这个时候S ...

找到这个讨论的根源在哪了!


SSD1306芯片和SSD1315芯片的屏幕,外观上最醒目的区别就是屏幕下方的那个刘海儿(排线)宽度:
截图202507251038514458.jpg

SSD1306芯片的排线略宽,SSD1315芯片的排线略窄


截图202507250954045413.jpg

细看了一下你用的屏幕,从下面的刘海儿宽度和凹槽宽度的比例可以看出,你用的屏幕是SSD1315芯片的
而我用来实验的是SSD1306的屏幕


下面是用两种型号的屏幕,同时显示相同的内容,用DMA发送1024字节,
左边SSD1306的屏幕,不论是0xB几,都能正确定位显示;
而右边SSD1315屏幕,的确会出现你说的问题。
【0xB0+4】
截图202507251050034722.jpg
【0xB0+5】
截图202507251005224833.jpg


另外试了下SSD1309芯片的屏幕,也正常显示

截图202507251016104008.jpg

====================================================



点评

实验发现,SSD1315芯片的屏幕,在水平地址模式下,如果要用0xB0指令,发送数据的个数,不能超出PAGE的边界。 比如,先用指令0x21设置区域宽度为50像素(0x21,0,49), 然后用指令0xB0将显示起点设置在任意一行的  详情 回复 发表于 6 天前
能体会到发现一个不理解的现象然后找原因然后要么解决掉问题要么被问题解决掉的那种快乐是我的幸运
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:478
  • 最近打卡:2025-07-31 08:17:19

31

主题

366

回帖

3189

积分

荣誉版主

积分
3189
发表于 6 天前 | 显示全部楼层
大*** 发表于 2025-7-25 10:40
找到这个讨论的根源在哪了!

实验发现,SSD1315芯片的屏幕,在水平地址模式下,如果要用0xB0指令,发送数据的个数,不能超出PAGE的边界

比如,先用指令0x21设置区域宽度为50像素(0x21,0,49),
然后用指令0xB0将显示起点设置在任意一行的第0列,这时连续发送50个以内的数据,则可以正常显示。

如果将显示起点设置在任意一行的第10列,这时连续发送40个以内的数据,就可以正常显示;如果发送大于40个数据,则开始异常了。
同理将显示起点设置在任意一行的第30列,这时连续发送20个以内的数据,可以正常显示;否则就开始异常。

但是SSD1306和SSD1309的屏幕,就不受这个限制,水平地址模式下,只要超出边界,都会自动换到下一行。

【发送不超边界个数的数据】
截图202507251239216437.jpg 截图202507251239416385.jpg


【发送超过边界个数的数据】

截图202507251240159780.jpg 截图202507251240338219.jpg

、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、

这一点的具体表现虽然没有在数据手册里体现,但是说明了SSD1315的指令集更完善,更严格遵循了数据手册提出的用法(Under Page Address Mode)

也说明了那些通用的,用0xB0方式定位的清屏、刷屏之类函数,为什么在任何寻址模式下都能正常工作的原因了(没超边界)



1 喜欢他/她就送朵鲜花吧,赠人玫瑰,手有余香!
能体会到发现一个不理解的现象然后找原因然后要么解决掉问题要么被问题解决掉的那种快乐是我的幸运
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民II
  • 打卡总天数:97
  • 最近打卡:2025-07-31 08:20:26
已绑定手机

13

主题

66

回帖

415

积分

中级会员

积分
415
发表于 6 天前 | 显示全部楼层
大*** 发表于 2025-7-25 12:26
实验发现,SSD1315芯片的屏幕,在水平地址模式下,如果要用0xB0指令,发送数据的个数,不能超出PAGE的边 ...

原来是OLED12864驱动芯片速度的问题。我之前也有想确认过我用的到底是什么芯片,但是没找到方法。看到商家的介绍说是1306,就认为是1306了。所以大家拿着不同的芯片都觉得自己看到的现象才是对的,一场误会另外,看起来高速cpu或i2c下,1315比1306更容易出问题,所以导致我在40mhz下碰到了无法正常运行的问题。要是厂家有丝印标注芯片型号就好了。所以1315更完善指令集的代价是兼容性变差了。

建议可以出一期教程:ssdxx系列傻傻分不清?教你看看手里的oled12864究竟用的什么芯片。

点评

因为大多数时候用的都是通用的功能函数,所以区分型号的问题没专门开过话题,只是在《一起玩OLED屏幕》的系列视频里,遇到需要区分的时候提到过。 比如上面提到的通过看0.96吋屏幕的“刘海儿”宽度,区分SSD1306和S  详情 回复 发表于 6 天前
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:478
  • 最近打卡:2025-07-31 08:17:19

31

主题

366

回帖

3189

积分

荣誉版主

积分
3189
发表于 6 天前 | 显示全部楼层
mech*** 发表于 2025-7-25 12:44
原来是OLED12864驱动芯片速度的问题。我之前也有想确认过我用的到底是什么芯片,但是没找到方法。看到商家 ...

因为大多数时候用的都是通用的功能函数,而且买屏幕的时候找有标注型号的店面一般都挺靠谱。所以区分型号的问题没专门开过话题,只是在《一起玩OLED屏幕》的系列视频里,遇到需要区分的时候提到过。

比如上面提到的通过看0.96吋屏幕的“刘海儿”宽度,区分SSD1306和SSD1315;

SSD1309和SH1106的屏幕,市面上只有1.3吋的,SHxxxx的芯片不支持水平模式,烧个程序看一下就能区分出来;

SSD1306和SSD1315除了外观,指令支持方面也有区别,比如滚屏指令,SSD1315的更完善,有些滚屏效果,SSD1306实现不了(数据手册里可以看出来),同样烧个程序就能分出来;

这次又可添加一种新的区分方式了,就是在水平地址模式下,指令0xB0的边界问题
能体会到发现一个不理解的现象然后找原因然后要么解决掉问题要么被问题解决掉的那种快乐是我的幸运
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-7-31 18:09 , Processed in 0.139755 second(s), 106 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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