菜鸟的烦恼: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 static/image/common/back.gif
同求....................
除此之外,SD.h的引入还会导致OLED刷新时屏幕的闪动··············
眼都看花了,悲剧··········· 别较劲了,整个IIC的OLED吧。 本帖最后由 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是因为焊工差修改焊点困难吗?
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
生命不息,折腾不止。I2C的代码看不懂不说,还经常点不亮,算了回归硬spi,用U8glib库,目前摸索代码中 你这个问题解决没?
页:
[1]