你想连接多个 SPI 设备。
办理方案

下面的代码利用 SD 卡读卡器从 SD 卡加载位图图像。这些图像会显示在 TFT 显示屏上。两个设备都是 SPI 设备。图 13-8 显示了连接办法:
/两个 SPI 设备的示例代码从连接的 SD 卡中加载所有位图并在 TFT 屏幕上显示它们。/#include <Adafruit_GFX.h>#include <Adafruit_ILI9341.h>#include <SdFat.h>#include <Adafruit_ImageReader.h>#define SD_CS 4 // SD 读卡器的片选引脚#define TFT_CS 10 // TFT 显示屏的片选引脚#define TFT_DC 9 // TFT 显示屏的数据/命令引脚#define TFT_RST 8 // TFT 显示屏的复位引脚// 为每个 SPI 设备创建工具SdFat SD;Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC, TFT_RST);SdFile root; // SD 卡的根目录Adafruit_ImageReader reader(SD); // 加载和显示图像的工具void setup(void){ Serial.begin(9600); if (!SD.begin(SD_CS, SD_SCK_MHZ(25))) // 以 25MHz 的速率启动 SD 卡读卡器 { Serial.println("Could not initialize SD card"); while (1) ; // 停滞运行 } tft.begin(); // 初始化 TFT 显示屏 if (!root.open("/")) { Serial.println("Could not read SD card directory"); while (1) ; // 停滞运行 }}void loop(){ ImageReturnCode rc; // 图像操作的返回代码 SdFile file; // 当前文件 char filename[256]; // 存储文件名的缓冲区 while (file.openNext(&root, O_RDONLY)) // 找到 SD 卡上的下一个文件 { file.getName(filename, sizeof(filename) / sizeof(filename[0])); if (isBMP(filename)) // 如果是 BMP 文件,则在 TFT 显示屏上显示 { tft.fillScreen(0); rc = reader.drawBMP(filename, tft, 0, 0); delay(2000); // 停息 2 秒 } file.close(); } root.rewind(); // 回到根目录中的第一个文件}// 判断文件是否为位图(BMP)文件int isBMP(char fname[]){ String fn = String(fname); fn.toLowerCase(); return fn.endsWith("bmp");}
SPI连接用于SD卡读卡器和LCD面板
谈论
该办理方案利用了基于ILI9341的TFT LCD显示屏和一个SD卡读卡器扩展板,它们都是SPI设备。你可以从各种供应商那里找到这两种设备。在某些情形下,例如Adafruit 1480型号,microSD卡读卡器被包含在TFT显示屏扩展板上。在这种情形下,你将少连接一些引脚,由于LCD和SD卡扩展板共享MISO、MOSI、SCK、GND和VIN引脚。
办理方案利用了几个库,你须要安装它们。通过Arduino库管理器安装Adafruit GFX、Adafruit ILI9341和Adafruit ImageReader库。虽然Arduino IDE包含了自己的SD卡库,但卖力从卡中加载图像的Adafruit ImageReader库利用了Bill Greiman的SdFat库的修正版,你可以在库管理器中搜索“SdFat - Adafruit Fork”找到它。
SD卡读卡器有各种不同的形式。最大略的形式,比如SparkFun BOB-12941,是一个焊接在一个分立板上的SD卡连接器。这是由于SD卡本身可以作为SPI设备运行(在紧急情形下,您乃至可以直接将电线焊接到SD卡上)。这种类型的读卡器只能以3.3V运行。一些SD卡读卡器,比如Adafruit部件号254,包括电平转换器,因此您可以用5V电源供电,并将5V逻辑引脚连接到它们。
在I2C中,每个设备都有一个唯一的地址。在SPI中,每个设备都有一个芯片选择(CS)线,库利用它来表示它要与该设备通信。在草图中,引脚4用作SD卡的片选线,引脚10用于TFT LCD显示器。Adafruit_ILI9341库还利用数据/命令引脚与显示器进行通信。
草图设置了许多工具:一个表示SD卡的工具,一个用于TFT显示器的工具,另一个表示卡上文件系统的根目录的工具,以及一个用于加载和显示图像的工具。在setup函数中,草图初始化SD卡读卡器和TFT显示器,然后打开根目录以进行读取。在loop中,草图调用openNext()以获取下一个文件,并利用isBMP()函数来决定文件是否为位图。如果是,则草图在停息并移动到下一个之前在屏幕上显示位图。
位图图像必须保存为未压缩的BMP文件,24位色,否则草图将无法加载这些图像。







