使用带有Seeed Studio TFT Touch Shield 2.0的SD卡

时间:2013-12-29 01:35:42

标签: arduino screen storage

我刚刚为Arduino购买了Seeed的TFT Touch Shield 2.0,但我似乎无法弄清楚如何在保持绘制到屏幕的同时访问SD卡。教程和文档非常不实用(对我而言),产品网站上的大多数问题似乎都针对相同的wiki page,除了示例文件绘制位图之外,它没有解释任何有关SD接口的内容。从卡片。

之前我曾经使用过以太网盾的SD接口,但从那时起已经很长时间了,所以我不记得这些来龙去脉了。从我的旧代码来看,似乎对于SD库的正常使用,您只需执行以下操作:

#include <SD.h>

void setup()
{
    pinMode(4, OUTPUT);

    if (!SD.begin(4))
    {
        //Fail
    }

    ...  //Open file, read, etc.
}

要正常使用TFT屏幕(绘制位图除外),请执行以下操作:

#include <SD.h>
#include <TFTv2.h>
#include <SPI.h>

void setup()
{
    TFT_BL_ON; //Enable Backlight

    Tft.TFTinit(); //Initialize TFT Screen

    Tft.drawCircle(100, 100, 30,YELLOW); //Draw
}

在维基页面上提供的用于从SD卡绘制位图的示例程序中,设置代码如下所示:

#include <SD.h>
#include <TFTv2.h>
#include <SPI.h>

#define chipSelect 4

Sd2Card card;

void setup()
{
  pinMode(11,INPUT);
  pinMode(12,INPUT);
  pinMode(13,INPUT);
  TFT_CS_HIGH;
  pinMode(chipSelect,OUTPUT);
  digitalWrite(chipSelect,HIGH);

  Serial.begin(38400);
  SPI.begin(); 
  Tft.TFTinit();
  //SPI.setClockDivider(SPI_CLOCK_DIV4);
  //SDcard_info();
  /**/
  DDRB |= 0x04;
  card.init(SPI_FULL_SPEED,chipSelect);
  if(!SD.begin(chipSelect))//SPI_QUARTER_SPEED,
  { //53 is used as chip select pin
    Serial.println("failed!");
    while(1);
  }
  Serial.println("SD OK!");

  Tft.setCol(0,239);
  Tft.setPage(0,319);
  Tft.sendCMD(0x2c);//start to write to display ram
  TFT_BL_ON;
}

loop()位图中,使用SD.open()依次打开位图,绘制,然后使用SD.close()关闭。

我假设发生的是针对某些SPI相关原因将引脚11到13设置为输入,TFT芯片选择“启用”模式设置为HIGH,然后屏幕随后启用。启动串行监视器,然后是SPI,然后是TFT。在这些事情发生之后,它做了我不知道的事情,启动卡,然后使用标准卡初始化方法。它通过准备绘制位图并发送“命令0x2c”来完成,该命令经常在底层库中用于“开始写入显示ram”。

问题是我尝试使用此代码初始化TFT和SD卡,然后尝试绘制图形,如我的第二个示例所示,但这不起作用。我需要能够从SD卡读取字节,然后能够在屏幕上绘制简单的图形,并重复。

所以我的问题是:是否曾经使用此屏蔽或具有此经验的人能够解释如何编写代码以允许使用SD卡和屏幕或初始化和SPI处理如何工作使这成为可能吗?

提前感谢您的回答!

(另外,如果这不是此问题的正确SE网站,请随时进行相应的迁移。)

1 个答案:

答案 0 :(得分:1)

这个问题的解决方案实际上非常简单,而且在我之前合并源文件时,我一定做错了。

初始化代码如下所示:

#include <SD.h>
#include <TFTv2.h>
#include <SPI.h>

Sd2Card card;

void setup()
{
    pinMode(11, INPUT); //Pin mode changes; not sure what for
    pinMode(12, INPUT);
    pinMode(13, INPUT);
    TFT_CS_HIGH; //Something with chipselect and the TFT
    pinMode(4, OUTPUT); //Set chipselect pin to OUTPUT
    digitalWrite(4, HIGH); //Set chipselect mode

    SPI.begin(); //Start SPI
    Tft.TFTinit(); //Initialize the TFT
    TFT_BL_ON; //Turn on the TFT Backlight
    Serial.begin(9600); //Start serial output

    DDRB |= 0x04; //Some sort of processor IO port?
    if(!SD.begin(4)) //Start the SD card
    {
        while(true) { } //Fail
    }
}

它基本上是位图初始化代码,最后省略了额外的TFT命令。在此之后,屏幕和SD卡都可以使用,如期望的那样。