乐鑫技术交流
直播中

张鑫

7年用户 1062经验值
私信 关注
[问答]

为什么无法从PLDuino/ESP-02初始化SD卡?

我一直在尝试加快从这个
的日志记录,它是一个集成了 SD 和 ESP8266 的 Arduino Mega,等等。因此,我设法将所有内容从 Mega(板 PLDUINO/Mega2560)记录到 SD 卡中,并尝试通过串行端口发送 mySQL 批处理字符串(ESP8266 通过 Serial2 连接到 Mega),这有点奏效,但是慢慢地。所以我设法用 Mega 上的代码连接到 SD 卡,一旦我加载了旧的 SD 库,版本 1.09。(在此设置中,我无法使用当前的 SD 库 v1.1 及更高版本初始化 SD 卡)。  
所以现在我已经将一些代码加载到附加的 ESP8266 卡(板 PLDuino/ESP-02),我的想法是读取记录到 SD 卡的数据并将 DATA INFILE 语句发送到 mySQL 数据库。
从我包含的简短测试代码中看不出来,但我必须将 ESP8266WiFi.h 加载到 ESP8266 板上,以便在没有 php 页面中介的情况下通过 wifi 直接与 mySQL 数据库通信。我无法通过 wifi 直接从 Mega 向数据库发送语句,ESP8266WiFi 库无法在 Mega 板上编译,必须在 ESP8266 板上编译。
尝试使用 SPI 从 ESP8266 板上读取 SD。Mega2560 芯片选择是 53。我对 ESP8266 芯片选择是什么感到困惑,已经尝试了很多,但我想知道问题是我使用了错误的芯片选择还是需要不同的 SD 库。这是我上传到 Mega 的代码:
代码:全选#include
#include
#include
#include

HardwareSerial &wifi = Serial2;
Sd2Card card;
bool card_initialized;

void logSD(String dataString){
  File dataFile = SD.open("test.txt", FILE_WRITE);
  if (dataFile) {
   // dataFile.println(dataString);
   // dataFile.close();
   // print to the serial port too:
   // Serial.println(dataString);
  }

  File myFile = SD.open("test.txt");
  if (myFile) {
    Serial.println("test.txt:");
    Serial.flush();
    // read from the file until there's nothing else in it:
    while (myFile.available()) {
      Serial.write(myFile.read());
    }
    Serial.flush();
    // close the file:
    myFile.close();
  }
  else {
    // if the file didn't open, print an error:
    Serial.println("error opening test.txt");
    Serial.flush();
  }
  Serial.println("Mtest done.");
  delay(5000);
}

String monitorESP()
{
  String recv = "";
  // Initializing ESP module
  PLDuino::enableESP();

  // Reset ESP
  Serial.println("starting ESP");
  digitalWrite(PLDuino::ESP_RST, LOW);
  delay(500);
  digitalWrite(PLDuino::ESP_RST, HIGH);
  delay(500);
  while (true){
    while (!wifi.available())
      delay(500);
    recv = wifi.readString();

    Serial.println("test:" + recv);
    delay(500);
  }

}

void setup()
{
  // A convenient macro which prints start-up messages to both LCD and Serial.
  #define LOG(msg) {Serial.println(msg); }

  pinMode(38, OUTPUT);
  digitalWrite(38, HIGH);

  pinMode(10, OUTPUT);
  digitalWrite(53, HIGH);

  // NB: This line is necessary in all sketches which use PLDuino library stuff.
  PLDuino::init();

  // Power-on LCD and set it up
  PLDuino::enableLCD();



  // Setup serials. Serial2 is connected to ESP-02 Wi-Fi module.
  Serial.begin(115200);
  Serial2.begin(115200);


  // We need to initialize SD card at startup!
  LOG("Initializing SD card...")

  if (!SD.begin(PLDuino::SD_CS))
    LOG("ERROR: Can't initialize SD card!")
   
  delay(500);

  //write something to SD to see if can read from ESP
  logSD("test SD writes");
digitalWrite(53, LOW);
  monitorESP();


}

void loop() {
  // put your main code here, to run repeatedly:

}


这是 ESP8266 上的代码:
代码:全选#include
#include
#define FILENAME "test.txt"
#define ESP_CS 15 //tried 8, 53, 4, 10

void setup()
{
  // Initializing Serial.
  
  Serial.begin(115200);
  //pinMode(10, OUTPUT);
digitalWrite(SS, LOW);
digitalWrite(ESP_CS,HIGH);
SPI.begin();
//digitalWrite(ESP_SS, LOW);
  // Initializing SD card.
  if (!SD.begin(ESP_CS))
{
    Serial.println("Failed to initialize SD card. Please check it.");
    return;
  } else {
    Serial.println("Initialized!");
  }

  // Trying to create a file
  {
    Serial.println("Creating a file...");

    // Opening a file for writing...
    File f = SD.open(FILENAME, FILE_WRITE);
    if (!f)
    {
      // Stop on error
      Serial.println("Failed to create " FILENAME " file. Stop.");
     // return;
    }
else{
    // Write some data there
    f.println("Test string");
   
    f.close(); // close when done
}
  }

  // Trying to read a file
  {
    Serial.println("Re-opening the file for reading...");

    // Trying to open our file.
    File f = SD.open(FILENAME, FILE_READ);
    if (!f)
    {
      // Stop on error
      Serial.println("Failed to open newly created file " FILENAME ". Stop.");
      return;
    }
   
    Serial.println("File contents: ");
    // Read out file contents and print them to Serial.
    while(!f.available())
      Serial.write(f.read());
    Serial.println(); Serial.println("--end--");
    f.close(); // close when done
  }
}

void loop()
{
}
我不断收到:
无法初始化 SD 卡。请检查
我无法使用 Mega2560 代码执行 SD.open,直到我将 SD 库降级到 1.09。不确定如何使用 ESP8266 代码执行此操作,它使用的是特定于硬件的库。  
可能偏离主题但相关信息:
我尝试刷新各种 NodeMCU 版本,包括包含 FatFS 和 SPI 的自定义版本,但我什至无法获得挂载 SD0 的 lua 初始化代码,所以也不确定那里有什么问题。挂载 SD 的 lua 代码如下所示:
代码:全选spi.setup(1, spi.MASTER, spi.CPOL_LOW, spi.CPHA_LOW, 8, 8)

-- initialize other spi slaves

-- then mount the sd
-- note: the card initialization process during `file.mount()` will set spi divider temporarily to 200 (400 kHz)
-- it's reverted back to the current user setting before `file.mount()` finishes
vol = file.mount("/SD0", 8)   -- 2nd parameter is optional for non-standard SS/CS pin
if not vol then
  print("retry mounting")
  vol = file.mount("/SD0", 8)
  if not vol then
    error("mount failed")
  end
end
file.open("/SD0/path/to/somefile")
print(file.read())
file.close()

更多回帖

发帖
×
20
完善资料,
赚取积分