一、为什么关注贴片式TF卡
最近在做一个户外数据采集器,遇到了一个老生常谈的问题:存储方案怎么选?
设备要求不高:每5分钟记录一次传感器数据,存成CSV文件,一个月导出一次。但有几个硬性约束:
设备安装在户外配电箱里,夏天内部温度可能超过60℃
配电箱有振动(旁边是变压器)
PCB空间非常有限,主控板只有一张名片大小
希望设备能稳定运行3-5年不维护
常规思路是放一个TF卡槽。但这个方案被否决了:卡座占地方,振动环境可能接触不良,普通TF卡的宽温表现我心里没底。
后来在论坛上看到有人用贴片式TF卡。研究了一下,觉得挺有意思,决定试一试。这次拿到的是米客方德的MK SD NAND样品。
二、贴片式TF卡是什么
简单说,就是一颗可以焊在板子上的TF卡。
它内部集成了NAND闪存和SD控制器,对外提供标准的SD接口。开发者直接用SD卡驱动就能操作它,不需要关心底层的坏块管理、ECC纠错这些麻烦事。
我拿到的是LGA-8封装的样品,6x8mm。拿卡尺量了一下,比TF卡本身还小一圈。焊盘在芯片底部,直接贴片。
几个关键参数:
容量:256MB(2Gbit)
闪存类型:SLC
擦写寿命:标称10万次
工作温度:-40℃ ~ +85℃
接口:支持SPI模式
SLC颗粒加上宽温,这两点是我选它的主要原因。
三、硬件设计
3.1 引脚连接
SPI模式下只用4根信号线:CS、DI、CLK、DO。加上电源和地,共6根线。
参考数据手册,原理图做了几处处理:
CMD(DI)和DAT0(DO)各用10kΩ电阻上拉到3.3V
CLK线上串了22Ω电阻
PCB Layout时注意了几点:
CLK线尽量短,两侧包地
数据线长度尽量一致
GND焊盘用十字花连接(数据手册特别提醒的,说是防止散热太快导致虚焊)
板子回来后,手工焊了一片,用热风枪350℃吹了约20秒,焊得还算规整。批量肯定走机器贴片,手工只是验证。
3.2 兼容设计
我在板上同时留了TF卡槽的焊盘。SD NAND焊盘和卡槽的SDIO信号并在一起,用0Ω电阻选择。这样同一块板子既可以贴SD NAND,也可以插TF卡,方便对比测试。
四、驱动开发
主控用的是STM32F407,没有SDIO接口(或者说不想占用那么多引脚),所以用SPI模式。
4.1 初始化
初始化和普通SD卡一模一样:
c
// 上电后发80个时钟
for (int i = 0; i < 10; i++) {
spi_write(0xFF);
}
// CMD0复位
sd_cmd(CMD0, 0, 0x95); // 应返回0x01
// CMD8检测电压
sd_cmd(CMD8, 0x1AA, 0x87); // 应返回0x01
// 循环发CMD55+ACMD41直到初始化完成
do {
sd_cmd(CMD55, 0, 0x01);
r1 = sd_cmd(ACMD41, 0x40000000, 0x01);
} while (r1 != 0x00);
踩了一个坑:初始化时钟必须低于400kHz。一开始没注意,直接用了10MHz,CMD0死活没响应。后来降到250kHz,一次过。
4.2 读写
读写扇区的代码也是标准的:
c
// 读一个扇区
sd_cmd(CMD17, sector, 0x01);
while (spi_read() != 0xFE); // 等待数据令牌
for (int i = 0; i < 512; i++) {
buf[i] = spi_read();
}
spi_read(); spi_read(); // 丢掉CRC
// 写一个扇区
sd_cmd(CMD24, sector, 0x01);
spi_write(0xFE); // 数据令牌
for (int i = 0; i < 512; i++) {
spi_write(buf[i]);
}
spi_write(0xFF); spi_write(0xFF); // 伪CRC
while (spi_read() != 0xFF); // 等待写入完成
写操作后面的忙检测很重要。如果省略,下一笔数据可能会丢。
4.3 文件系统
挂载了FatFs,调用f_open、f_write、f_read、f_close。和操作普通SD卡完全一样,代码一行都不用改。
五、测试数据
5.1 功耗
用万用表串在3.3V电源上测的:
| 状态 | 电流 |
| 待机(CS拉高) | 128μA |
| 连续读 | 31mA |
| 连续写 | 41mA |
待机128μA,对于电池供电的设备可以接受。工作电流30-40mA,在SPI模式下属于正常水平。
5.2 速度
用H2testw在PC上测(通过读卡器):
读:约21.8 MB/s
写:约10.1 MB/s
在STM32上,SPI时钟25MHz,实测:
读:约2.5 MB/s
写:约1.8 MB/s
受限于SPI总线,速度比SDIO模式慢很多。但对于我的应用(每5分钟写几百字节),完全够用。如果追求速度,可以考虑换带SDIO接口的主控。
5.3 温度测试
放进高低温箱跑了24小时:
-40℃:启动正常,读写正常
+85℃:启动正常,读写正常
常温下连续写入一周,没出问题。宽温指标没有虚标。
5.4 与TF卡的对比
在同一块板子上对比了TF卡槽+普通TF卡(闪迪Class 10):
| 项目 | 贴片式TF卡 | TF卡槽+普通卡 |
| 占板面积 | 6x8mm | 卡+卡座约180mm² |
| 振动测试 | 通过(焊接) | 500次后偶尔掉卡 |
| 高温写入 | 85℃正常 | 70℃以上偶发错误 |
| 待机功耗 | 128μA | 卡座本身无功耗,卡约150μA |
| 可更换 | 否 | 是 |
振动测试是用一个小振动台做的,频率50Hz,振幅1mm。贴片式的一直正常,TF卡槽的大约500次后开始偶尔掉卡——应该是卡座弹片疲劳了。
六、SMART功能
这颗芯片支持SMART,可以读健康状态。通过CMD56命令获取512字节数据,里面包含:
总写入数据量
出厂坏块数、新增坏块数
剩余寿命百分比
正常/异常掉电次数
我写了一个简单的读取函数,每星期读一次,通过串口打印。目前新增坏块数还是0,剩余寿命100%。
这个功能对工业设备来说很实用。可以在芯片寿命快用完之前提前预警,而不是等坏了再去换。
七、几个踩过的坑
坑1:初始化失败
现象:上电后CMD0没响应。
原因:上电后没发够时钟脉冲。SD卡需要至少74个时钟才能完成内部初始化。
解决:上电后先发10个0xFF(80个时钟),再发CMD0。
坑2:高温写入错误
现象:常温正常,60℃以上偶尔写失败。
原因:CLK信号过冲,高温下信号质量变差。
解决:CLK线上串22Ω电阻,同时把SPI时钟从25MHz降到20MHz,问题消失。
坑3:手工焊接
LGA封装手工焊有点难度。第一次焊,用热风枪吹了40秒,结果芯片没坏但板子起泡了。后来控制在20秒左右,配合助焊剂,焊得还不错。批量还是建议机器贴片。
这颗MK SD NAND贴片式TF卡用下来,总体感受是:省心。
不需要管坏块管理,不需要管ECC纠错,驱动用现成的SD卡代码就行。焊接在板子上,不用担心振动松脱。宽温和SLC寿命,用在户外设备上心里有底。
适合的场景:
户外设备、车载设备(振动、宽温)
空间紧凑的PCB(6x8mm)
需要频繁写入、长期运行的应用(SLC长寿命)
对可靠性要求较高的工业产品
不适合的场景:
需要用户自己换卡的产品
成本极度敏感的项目(比普通TF卡贵)
需要超大容量的应用(目前最大64GB)
如果你的项目正好落在前面的区间里,贴片式TF卡值得一试。如果不需要宽温和长寿命,普通TF卡加卡槽可能更经济。
299