无名科技ESP32_SUPERMINI 开发板SD卡读写初始化不成功解决方法(Arduino环境)

在运行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
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值