极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 22857|回复: 7

菜鸟的烦恼:SD 硬SPI 遇上 OLED 的软SPI,然后就悲剧了

[复制链接]
发表于 2014-2-12 11:38:47 | 显示全部楼层 |阅读模式
先上接法图:




再上程序
#include <Adafruit_SSD1306.h>
#include <Adafruit_GFX.h>
#include <Wire.h>
#include <SPI.h>

#define OLED_RESET 2//OLED -- RST
#define OLED_DC 3  //OLED -- D/C
#define OLED_CS 5  //OLED -- C/S
#define OLED_MOSI 12 //OLED -- SDA
#define OLED_CLK 13 //OLED -- SCL

#include <SD.h>
Adafruit_SSD1306 display(OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);


const unsigned char PROGMEM demo [] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0xC1, 0xF9, 0xF0, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x01, 0x8C, 0xC1, 0x81, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
0x04, 0xC1, 0x81, 0x8C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x06, 0xC1, 0x81, 0x84, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x06, 0xC1, 0xF9, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x01, 0x06, 0xC1, 0x81, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0xC1, 0x81, 0x8C,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x8C, 0xC1, 0x81, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x78, 0xFD, 0xF9, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xE1,
0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xE3, 0xE0, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x01, 0xE1, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
0xF1, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF3, 0xE7, 0xC0, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF1, 0xE7, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0xFB, 0xE7, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xEF, 0xC0, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xEF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x7F, 0xEF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0x80,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFF, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x0F, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0xFE,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x1F, 0x1F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x0F,
0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x0F, 0xFF, 0xC0, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x1F, 0x1F, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F,
0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0xFF, 0xE0, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x07, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xE0, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};


int x=0,y=0;
void setup()   
{               
  display.begin(SSD1306_SWITCHCAPVCC);  // Switch OLED
  pinMode(10, OUTPUT);
  

}

void loop ()
{

  display.clearDisplay();  // Clear OLED

      display.drawBitmap(x, y,  demo, 88, 64, 1); // drawbitmap (X,Y,*unsigned char,W,H,1)

  // text display tests
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(x,0);
  display.println("Hello, world!");
  
  

  
  display.display(); // display OLED

   delay(80);        
x++;
if(x<0)y++;
else y--;
if(x==64)x=-64;
}
在不改动Adafruit_SSD1306库文件的情况下,一旦引用#include <SD.h>,Adafruit_SSD1306的文字就功能就没用了,即"Hello, world!"无法显示,图像显示不受影响;去掉#include <SD.h>,文字、图像都正常显示

----------------------------------------

引用网上大神的做法,据说是让OLED使用硬件SPI的SCK与MOSI,发现文字依旧无法显示T_T

  1. 手工改了Adafruit_SSD1306.cpp,将其中的
  2. /////////////////////////////////////////////////////////
  3. inline void Adafruit_SSD1306::fastSPIwrite(uint8_t d) {
  4.   
  5.   for(uint8_t bit = 0x80; bit; bit >>= 1) {
  6.     *clkport &= ~clkpinmask;
  7.     if(d & bit) *mosiport |=  mosipinmask;
  8.     else        *mosiport &= ~mosipinmask;
  9.     *clkport |=  clkpinmask;
  10.   }
  11.   //*csport |= cspinmask;

  12. }
  13. /////////////////////////////////////////////////(直写)

  14. 改成了
  15. /////////////////////////////////////////////////////////
  16. inline void Adafruit_SSD1306::fastSPIwrite(uint8_t d) {
  17. SPI.transfer(d);
  18. }
  19. /////////////////////////////////////////////////////////
  20. 当然,还要在上面引用一下<SPI.h>
  21. (订正:要引用SPI.h的包括Adafruit_SSD1306本身,和你的Arduino主程序本身。不清楚为什么只在库中引用无法通过编译。感谢 覺觀自然 实践检验时跳了此坑)
复制代码

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

发表于 2014-2-12 13:18:34 | 显示全部楼层
同求....................
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-2-12 16:14:11 | 显示全部楼层
Cupid 发表于 2014-2-12 13:18
同求....................

除此之外,SD.h的引入还会导致OLED刷新时屏幕的闪动··············

眼都看花了,悲剧···········
回复 支持 反对

使用道具 举报

发表于 2014-2-13 08:16:40 | 显示全部楼层
别较劲了,整个IIC的OLED吧。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-2-13 14:22:09 | 显示全部楼层
本帖最后由 hi55234 于 2014-2-13 14:50 编辑
zintiger 发表于 2014-2-13 08:16
别较劲了,整个IIC的OLED吧。


╮(╯▽╰)╭,其实吧,iic、spi、8线都是可以调出来的··········

oled 专门有3个脚来控制这个,可是俺依旧想解决这个问题·········

PS:我会告诉你我现在死专spi是因为焊工差修改焊点困难吗?

回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-2-13 15:53:59 | 显示全部楼层
zintiger 发表于 2014-2-13 08:16
别较劲了,整个IIC的OLED吧。

最后不得已,改为I2C模式

点了很久都没点亮,最后发现问题


When I2C mode is selected, D2, D1 should be tied together and serve as SDAout, SDAinin application and D0 is the serial clock input, SCL


D2,D1应绑在一起,并作为SDA,D0是SCL


SSD1306
Pin Name
I2C
BS0  0  
BS1  1
BS2  0

例子直接用:ssd1306_128x64_i2c

回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-2-15 13:12:06 | 显示全部楼层
生命不息,折腾不止。I2C的代码看不懂不说,还经常点不亮,算了回归硬spi,用U8glib库,目前摸索代码中
回复 支持 反对

使用道具 举报

发表于 2015-3-25 15:43:09 | 显示全部楼层
你这个问题解决没?
回复 支持 反对

使用道具 举报

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

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-8 03:33 , Processed in 0.038825 second(s), 21 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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