在运行ESP32SUPERMINI的SD卡例程时遇到报错,显示初始化不成功,解决方法,使用软件SPI,测试有效,参考代码如下:(后有软件SPISD卡读取文件)
以下是我的解决方案,如果不正确可能是我的资料提供有误,但总体思路是使用软件SPI替代硬件SPI,可以自己去尝试。
示例代码
//调用库及宏定义方面
//OLED相关
#include <U8g2lib.h>
#ifdef U8X8_HAVE_HW_SPI
#include <SPI.h>
#endif
#ifdef U8X8_HAVE_HW_I2C
#include <Wire.h>
#endif
U8G2_SSD1306_128X64_NONAME_F_SW_I2C u8g2(U8G2_R0, /* clock=*/ 3, /* data=*/ 2, /* reset=*/ U8X8_PIN_NONE); //Low spped I2C
//定义OLED屏接口
//micro SD相关
#include <mySD.h>
ext::File root;
//自设定函数
void printDirectory(ext::File dir, int numTabs) {
while(true) {
ext::File entry = dir.openNextFile();
if (! entry) {
break;
}
for (uint8_t i=0; i<numTabs; i++) {
Serial.print('\t'); // we'll have a nice indentation
}
// Print the name
Serial.print(entry.name());
/* 递归目录,否则打印文件大小 */
if (entry.isDirectory()) {
Serial.println("/");
printDirectory(entry, numTabs+1);
} else {
/* files have sizes, directories do not */
Serial.print("\t\t");
Serial.println(entry.size());
}
entry.close();
}
}
//全局变量设置
//设定每行字数变量
int Ln=0;//列数
int col=0;//行数
int page=0;//页数
int num=0;//字数
int by=32;
int i=0;
int j=0;
//设定汉字字符数组尝试
char ch[32]={};
char sram[9600]={};
//设置标志位以确定向后翻页还是向前翻页
int latest=0;//确定最新记录位
//初始化设定
void setup() {
Serial.begin(115200);//启动串口
//oled初始化
u8g2.begin();//u8g2库初始化
u8g2.setFont(u8g2_font_wqy12_t_gb2312b);//设置中文字符集
u8g2.enableUTF8Print(); //启用打印功能
//sd卡初始化
Serial.print("Initializing SD card...");//初始化中
if (!SD.begin(7, 6, 5, 4)) {Serial.println("initialization failed!");return;}
//SD卡接口初始化
Serial.println("initialization done.");//初始化完成
root = SD.open("/");
if (root) {printDirectory(root, 0);root.close();} else {Serial.println("error opening file");}
//验证能否打开文件
root = SD.open("TEXT.txt");//打开TEXT文件
//下一页按钮初始化 0 21
pinMode(0,OUTPUT);
pinMode(21,INPUT);
digitalWrite(0,HIGH);
//上一页按钮初始化 1 20
pinMode(1,OUTPUT);
pinMode(20,INPUT);
digitalWrite(1,HIGH);
}
void loop() {
if(digitalRead(21)==1){nextpage();}
if(digitalRead(20)==1){lastpage();}
if(num==1500){while(sram[i]){sram[i]=0;i++;}i=0;latest=0;num=0;}Serial.println(num);
//if(digitalRead(21==1)&&digitalRead(20)==1){delay(50);if(digitalRead(21==1)&&digitalRead(20)==1)j=100;}
//if(digitalRead(21==1)&&digitalRead(20)==1){delay(50);if(digitalRead(21==1)&&digitalRead(20)==1)while(j<100){nextpage();j++;if(num==1500){while(sram[i]){sram[i]=0;i++;}i=0;latest=0;num=0;}}j=0;}
u8g2.sendBuffer();
}
//下一页函数
void nextpage()
{
page++;
u8g2.clearBuffer();
//先判断是否到达最新进度
if(num>=latest)
{ //第一行
u8g2.setCursor(0, 12);
if(root){while(Ln<by){ sram[num]=root.read(); ch[Ln] =sram[num] ;u8g2.print(ch[Ln]);Ln++;num++;}}
Ln=0;
//第二行
u8g2.setCursor(0, 24);
if(root){while(Ln<by){ sram[num]=root.read(); ch[Ln] =sram[num] ;u8g2.print(ch[Ln]);Ln++;num++;}}
Ln=0;
//第三行
u8g2.setCursor(0, 36);
if(root){while(Ln<by){ sram[num]=root.read(); ch[Ln] =sram[num] ;u8g2.print(ch[Ln]);Ln++;num++;}}
Ln=0;
//第四行
u8g2.setCursor(0, 48);
if(root){while(Ln<by){ sram[num]=root.read(); ch[Ln] =sram[num] ;u8g2.print(ch[Ln]);Ln++;num++;}}
Ln=0;
//第五行
u8g2.setCursor(0, 60);
if(root){while(Ln<by-10){ sram[num]=root.read(); ch[Ln] =sram[num] ;u8g2.print(ch[Ln]);Ln++;num++;}}
Ln=0;
u8g2.setCursor(110, 60);
u8g2.print(page);
}
//如果进度不是最新的
if(num<latest)
{u8g2.setCursor(0, 12);
while(Ln<by){ ch[Ln] =sram[num] ;u8g2.print(ch[Ln]);Ln++;num++;}
Ln=0;
//第二行
u8g2.setCursor(0, 24);
while(Ln<by){ ch[Ln] =sram[num] ;u8g2.print(ch[Ln]);Ln++;num++;}
Ln=0;
//第三行
u8g2.setCursor(0, 36);
while(Ln<by){ ch[Ln] =sram[num] ;u8g2.print(ch[Ln]);Ln++;num++;}
Ln=0;
//第四行
u8g2.setCursor(0, 48);
while(Ln<by){ ch[Ln] =sram[num] ;u8g2.print(ch[Ln]);Ln++;num++;}
Ln=0;
//第五行
u8g2.setCursor(0, 60);
while(Ln<by-10){ ch[Ln] =sram[num] ;u8g2.print(ch[Ln]);Ln++;num++;}
}
u8g2.setCursor(110, 60);
u8g2.print(page);
Ln=0;if(num>=latest){latest=num;} u8g2.sendBuffer();
}
//上一页函数
void lastpage()
{
page--;
u8g2.clearBuffer();
if( num>=316 )
{
num=num-316;
}
//第一行
u8g2.setCursor(0, 12);
while(Ln<32){ ch[Ln] =sram[num] ;u8g2.print(ch[Ln]);Ln++;num++;}
Ln=0;
//第二行
u8g2.setCursor(0, 24);
while(Ln<32){ ch[Ln] =sram[num] ;u8g2.print(ch[Ln]);Serial.print(ch[Ln]);Ln++;num++;}
Ln=0;
//第三行
u8g2.setCursor(0, 36);
while(Ln<32){ ch[Ln] =sram[num] ;u8g2.print(ch[Ln]);Serial.print(ch[Ln]);Ln

最低0.47元/天 解锁文章
1690

被折叠的 条评论
为什么被折叠?



