hi55234 发表于 2014-2-12 11:38:47

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

先上接法图:




再上程序

#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

手工改了Adafruit_SSD1306.cpp,将其中的
/////////////////////////////////////////////////////////
inline void Adafruit_SSD1306::fastSPIwrite(uint8_t d) {

for(uint8_t bit = 0x80; bit; bit >>= 1) {
    *clkport &= ~clkpinmask;
    if(d & bit) *mosiport |=mosipinmask;
    else      *mosiport &= ~mosipinmask;
    *clkport |=clkpinmask;
}
//*csport |= cspinmask;

}
/////////////////////////////////////////////////(直写)

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

Cupid 发表于 2014-2-12 13:18:34

同求....................

hi55234 发表于 2014-2-12 16:14:11

Cupid 发表于 2014-2-12 13:18 static/image/common/back.gif
同求....................

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

眼都看花了,悲剧···········

zintiger 发表于 2014-2-13 08:16:40

别较劲了,整个IIC的OLED吧。

hi55234 发表于 2014-2-13 14:22:09

本帖最后由 hi55234 于 2014-2-13 14:50 编辑

zintiger 发表于 2014-2-13 08:16 static/image/common/back.gif
别较劲了,整个IIC的OLED吧。

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

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

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

hi55234 发表于 2014-2-13 15:53:59

zintiger 发表于 2014-2-13 08:16 static/image/common/back.gif
别较劲了,整个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
BS00
BS11
BS20

例子直接用:ssd1306_128x64_i2c

hi55234 发表于 2014-2-15 13:12:06

生命不息,折腾不止。I2C的代码看不懂不说,还经常点不亮,算了回归硬spi,用U8glib库,目前摸索代码中

echoff 发表于 2015-3-25 15:43:09

你这个问题解决没?
页: [1]
查看完整版本: 菜鸟的烦恼:SD 硬SPI 遇上 OLED 的软SPI,然后就悲剧了