zrl 发表于 2024-11-18 11:30:56

使用mosi和miso可交换的spi,模拟sd模式时序单线读写sd/tf卡的设想

本帖最后由 zrl 于 2024-11-19 15:21 编辑

0.为什么有这个设想:因为spi和sd的单线读写非常相似,甚至你可以使用单片机的硬件spi对sd卡在sd模式下实现其初始化
1.这种方法对比SPI直接读取sd卡有什么优势:据站内网友的测试sd卡在dma-spi下只能到3MB/s,这个速度是class0速度,也就是时钟频率最大25MHz,而SD模式下,使用CMD6命令切换到高速模式,卡时钟频率可以到50Mhz。
而在sd卡的spi模式是不支持这条命令的。
2.为什么只是设想:因为我手头上只有8h8k64u,它不支持mosi和miso的交换
3.有什么劣势:sd卡的sd模式与spi模式的一个不同点就是,spi模式会他会确保你每次主机硬件spi读取到一个完整的字节,但是sd模式不会,数据准备好只要符合规范时序下一个时钟就可以发,所以不可避免的要使用gpio去模拟时钟进行补偿,不然读到的一个字节,大概率会在不同的两个地方


速度表的数据是在4线模式下的最差性能,除4才是单线的速度

zrl 发表于 2024-11-18 11:38:30

本帖最后由 zrl 于 2024-11-18 11:39 编辑

写命令
将spi的sclk引脚与sd卡的CLK相连,mosi与CMD相连,通过mosi就可以直接向sd卡写命令

zrl 发表于 2024-11-18 11:42:45

读响应
发完命令后将mosi与miso调换,然后关闭spi,让主机操纵sclk口发送时钟直到在CMD上读取到0,后再发送7个时钟,接着启动spi读取响应数据

zrl 发表于 2024-11-18 11:48:23

读数据
mosi与CMD相连,miso与DAT0相连,主机向卡发送CMD17,然后关闭spi,让主机操纵sclk口发送时钟直到在DAT0上读取到0,接着启动spi读取数据

zrl 发表于 2024-11-18 11:49:13

本帖最后由 zrl 于 2024-11-18 13:37 编辑

写数据
mosi与CMD相连,miso与DAT0相连,主机向卡发送CMD24,交换mosi和miso然后发送8个空时钟,数据线上硬件spi发送0xFE,接着写数据,写完数据发送0xFF。单线crc16可以使用硬件crc16直接计算

zrl 发表于 2024-11-18 11:52:50

本帖最后由 zrl 于 2024-11-18 12:10 编辑

卡的初始化
实现了写命令和读响应,就可以实现卡的初始化,但是stc的spi不像stm32的spi一样可以大范围调整时钟速率,而卡的初始化又要求时钟频率不高于400k,所以又两种方法
方法一,主机模拟半双工3线spi(实际上没有cs),写命令和读响应,完成初始化。
方法二,先让外设的频率低于400k,然后再调整时钟设置,使其达到最大值

zrl 发表于 2024-11-18 11:56:51

当然你也可以使用两个io,控制CMD和CLK写命令和读响应,然后用硬件的QSPI读写数据。速度应该至少快3倍,

zrl 发表于 2024-11-18 11:59:26

class10支持的最高时钟频率为50MHz,不知道这样的spi什么时候上市,当然这只是一个设想,能不能成,性能怎样还要看具体情况

神农鼎 发表于 2024-11-18 20:00:31

AI8051U的 MOSI/MISO 通过设置SFR 来交换
https://www.stcaimcu.com/data/download/Datasheet/AI8051U.pdf

页: [1]
查看完整版本: 使用mosi和miso可交换的spi,模拟sd模式时序单线读写sd/tf卡的设想