• [笔记]SD卡相关资料


     ESD静电放电模块

    • 我知道的flash分为两种NOR flash和NAND flash,NOR falsh容量一般为1~16M用于单片机代码存储,NAND flash最小的是8M最大的现在听说有90G还可能更大,一般用在大容量存储方面。
    • VGA芯片AD8367是AD公司推出的
    • 镁光(Micron)身为世界第二大内存颗粒制造商,OWD22-D9LCQ  做DDR3用的。
    • 三星的FLASH芯片NAND 容量的K9F1G08U00,配置STM32 ARM芯片用。

    来源:http://blog.sina.com.cn/s/blog_4ada01d8010006h7.html

    来源:DDR内存条比较http://wenku.baidu.com/link?url=WgIvJUndrCDTj9gvCHnFlJv2PtHEkefYFko8twldRiT7THj2e-t5pbCq8rZDwaWIWCwC50jYEiquIh2zGd00wcrnDOQ8QgeW6xCtM93U5Wu

    bandwidth - 硬件带宽,单位为Hz(赫兹)。单位时间中线路(传输系统)中电信号的最大振荡频率,超过此频率硬件将无法保证信号传输的正确性。

    data rate - 数据传输率,单位为bps(bits per second),单位传输的二进制位的数目。

    throughtput - 吞吐量,单位为bps(bits per second),数据通过网络的传输速率。

     吞吐量是通过频率和带宽算出来的,带宽和频率。比如PCI,IDE,AGP,USB。

    计算公式:数据带宽=时钟频率×数据总线位数/8(单位:byte/s)

    内存带宽计算公式:带宽=内存核心频率×内存总线位数×倍增系数。

    DDR3预读取位数8bit需要4个时钟周期完成,所以DDR3的I/O时钟频率是存储单元核心频率的4倍,由于是上下沿都在传输数据,所以实际有效的数据传输频率达到核心频率的8倍。 

    内存标准核心频率,I/O 频率,有效传输频率,单通道带宽,双通道带宽。。

    内存条有三种不同的频率指标,它们分别是核心频率、时钟频率和有效数据传输频率。核心频率即为内存Cell阵列(Memory Cell Array)的工作频率,它是内存的真实运行频率;时钟频率即I/O Buffer(输入/输出缓存)的传输频率(预读取位数8位);而有效数据传输频率则是指数据传送的频率(时钟的上升沿和下降沿都采集数据)。Cell和Bank。数据总线位宽一直是64bit。

    DDR3-800内存有效数据传输频率为800MHz,其I/O频率为400MHz,核心频率只有100MHz。

    DDR3-1600有效数据传输频率为1600MHZ,I/O时钟频率800MHZ,核心频率是200MHZ。

    AGP总线带宽:
    AGP1x总线带宽=66MHZ*32bit/8=264MB/s
    AGP8x总线带宽=66MHZ*32bit/8=2.1GB/s
    PCI总线带宽:PCI带宽=33MH*32bit/8=133MB/S
    32bit @ 33MHz 数据吞吐量为33MHZ*32bit/8=132MB/S

    USB 3.0 最大传输速率5Gbps, 向下兼容USB 1.0/1.1/2.0

    Mbps和MBps的区别:数据在传输过程中是以二进制位的形式,用bit来表示。在衡量储存容量时,用byte来表示。
    Mbps(Million bits per second) - 每秒xx百万位
    MBps(Million bytes per second) - 每秒xx百万字节

    低速USB的时钟频率是1.5MHz
    全速USB的时钟频率是12MHz
    高速USB的时钟频率是480MHz
    USB传输又分四种:控制、中断、成组和同步(Control,Interrupt,BulkandIsochronous)。
    不同的传输速度下不同的传输方式有不同的理论传输速度,不能笼统地说。
    不管哪种传输速度,同步传输的理论传输速度最快,控制传输的理论传输速度最慢。
    USB系统要保留10%的带宽
    usb1.1  12Mb/s(12Mbps/8=1.5MBps),极限速度是1MB/s,接口效率为1MB/1.5MB*100%=66.7%
    usb2.0  480Mb/s(480Mbps/8=60MBps),极限速度约40MB/s,接口效率为40MB/60MB*100%=66.7%
    移动硬盘USB2.0写速度需要在20MB/s左右~.

    PCI 总线位宽是 32位,总线频率 33 MHz,每时钟传输 1 组数据,它的带宽为 127.2 MB/s,即 1017.6 Mbps。
    ●PCI 2.1 总线位宽是 64位,总线频率 66 MHz,每时钟传输 1 组数据,它的带宽为 508.6 MB/s,即 4068.8 Mbps。
    ●AGP 总线位宽是 32位,总线频率 66 MHz,每时钟传输 1 组数据,它的带宽为 254.3 MB/s,即 2034.4 Mbps。
    ●AGP Pro 总线位宽是 32位,总线频率 66 MHz,每时钟传输 1 组数据,它的带宽为 254.3 MB/s,即 2034.4 Mbps。

    AGP Pro 是 AGP 的改进型,它使工作站级主板也能利用 AGP 的加速性能,降低了 AGP 所需的电压供应,并没有什么太大的改变。
    ●AGP 2X 总线位宽是 32位,总线频率 66 MHz,每时钟传输 2 组数据,它的带宽为 508.6 MB/s,即 4068.8 Mbps。
    ●AGP 4X 总线位宽是 32位,总线频率 66 MHz,每时钟传输 4 组数据,它的带宽为 1017.3 MB/s,即 8138.4 Mbps。
    ●AGP 8X 总线位宽是 32位,总线频率 66 MHz,每时钟传输 8 组数据,它的带宽为 2034.6 MB/s,即 16276.8 Mbps。

    图片存储在带文件系统的SD卡中如何解出RGB:http://www.blogjava.net/georgehill/articles/6549.html

    BMP文件格式。

    Altera固化到Flash的文件是JIC,而ISE固化到Flash的文件是MCS

    来源:http://wenku.baidu.com/link?url=0Ju7D8JGRJpDBQN_z_FYAgx8aUq1HELen1GVJvzSL30iY2B5VmzQlDsrbOkI-FnbGw0-ZV6RjXhhZ2s5Mr2EKP2E1a_QSJ3EMcNuS1yG8KG SPI模式下,SD卡在时钟上升沿读数据。

    来源:http://wenku.baidu.com/view/af0de2e74afe04a1b071de49.html?re=view

    STM32学习笔记之SD卡V2.0协议初始化,解释得很具体

    http://blog.sina.com.cn/s/blog_4f09c0b50101636h.html 每个命令的位介绍。

    来源:http://wenku.baidu.com/link?url=w7enVFMgall62cMzaxEyPGq10gwdyZkE_UBZHyUim4kp_U5I97FhUSHob-bHHqqh44-0kHP3hf7W94S5ZyXnmQIQJfSSC0h6UgiSmNL7w7_

    v2.0版SD卡协议中命令CMD8的使用详解

    SDHC是“High Capacity SD Memory Card”的缩写,即“高容量SD存储卡”,这里的HC指的是High Capacity,高容量。2006年5月,SD协会发布了最新版的SD 2.0的系统规范,在其中规定SDHC是符合新的规范,且容量大于2GB小于等于32GB的SD卡。另外SDHC至少要符合Class 2的速度等级,并且在卡片上必须有SDHC标志和速度等级标志。

    SD卡最大支持2GB容量,SDHC 最大支持32GB容量,SDXC 最大支持2TB(2048GB)容量

    来源:http://bbs.ednchina.com/BLOG_ARTICLE_269804.HTM

     在单片机读写SD卡后,如果需要查看读写的效果,可以利用winhex软件在计算机端直接观察到SD卡中的数据内容。

            今天用PIC单片机将SD卡的第一个扇区数据读取出来后,通过串口发送到PC上观察,发现读取的数据与在PC上用winhex软件查看的第一个扇区的数据不一致,老是以为单片机端得读取程序有问题,修改了很多次也没有效果,后上网发现winhex软件在打开磁盘的对话框时,有两种打开方式,一种是逻辑驱动器,另一种是物理驱动器,如果希望看到与单片机读取扇区一致的数据,需以物理驱动器方式打开SD卡,此时看到的第一扇区就与单片机所选择的扇区一致了,可以很直观的看到SD卡中的对应数据了,不过要注意,前面的扇区最好不要随便通过单片机写入数据,防止破坏了SD卡上的文件系统,导致无法再次在PC机上打开SD卡了。

    来源:http://wenku.baidu.com/link?url=oC1-1QghHU5_tfoBdnprae3_PFlfbz-ceJ5jGXoOh_irHmwg_0mEYkj37JFePpoHsLcWFrOvrPrdEYjaP3IDDPjPyMOiMgAX9rfNRK4qujW

    SD卡命令解读。

    来源:http://dontium.blog.163.com/blog/static/342952722009419114113217/

    sd卡分为mmc卡,sd v1.0,sd v2.0三个版本

    cmd0是{0x40,0x00,0x00,0x00,0x00,0x95}  --0x01
    cmd1是{0x41,0x00,0x00,0x00,0x00,0xff}    --0x01
    cmd24是{0x58,0x00,0x00,0x00,0x00,0xff}  --0x01
    cmd16是{0x51,0x00,0x00,0x00,0x00,0xff}   --0x01

    cmd17是{0x51,0x00,0x00,0x00,0x00,0xff}  --0x01

    cmd8是{0x48,0x00,0x00,0x01,0xaa,0x87}   --0x01
    cmd55是{0x77,0x00,0x00,0x00,0x00,0xff}   --0x01
    acmd41是{0x69,0x40,0x00,0x00,0x00,0xff}  --0x00
    如果是sd v1.0版本,直接发CMD55+ACMD41
    如果是sd v2.0版本,先发cmd8再发CMD55+ACMD41
     
    1 . 命令变量

    大容量SD卡,存储器访问命令的32位变量是对块寻址的存储器访问(是决定块的块变量)。块的固定大小为512字节。而标准容量的SD卡,32位变量是对字节寻址,块长度由CMD16命令决定。

    5、读写超时检查

    读:对标准容量的SD卡,读超时的时间设定为大于典型读出时间的100倍,或者设置为100mS。卡参数的读时间为:CSD中的TAACT NSAC参数的两倍。

    写:对标准容量的SD卡,写超时的时间设定为大于典型编程时间的100倍,或者设置为250mS。卡参数的写时间为:CSD中的R2W_FACTOR

    对于大容量卡,CSD中的参数为因定值,因此最好使用>100mS作为读超时,>250mS作为写超时。

    五、关于命令索引

    “命令索引”在SD协议中并没有明确指出,但综合参考三星程序及网上文章,认为这种说法是正确的:“命令索引”中的数字就是其“索引值”。对于ACMD类的命令,可以看作为“复合命令”,即在执行时,前面先执行CMD55,然后再执行“去掉ACMDn前的‘A’的命令”

    来源:http://www.doc88.com/p-348627971214.html  单片机用SPI模式控制SD卡读写

    4G以上的SD不能用SPI模式吗?

    容量与SPI总线无关,2G是个分水岭,2G以上是SD2.0协议,与2G以下的卡驱动不兼容。很多老设备(俺家的佳能A530相机就是一例)用不了2G以上的卡,也就是这个原因。

    #define ACMD41  41      //命令41,应返回0x00
    #define CMD55   55      //命令55,应返回0x01

    看了2.0的协议,在网上查了sdhc的初始化方法,到目前已经把csd读出来了,下一步该弄读写了。

    SD卡2G及以下是按字节寻址的,更大的是SD2.0协议,但还要读取OCR数据,判断是SD2.0还是SD2.0HC卡,只有SD2.0HC卡才是按扇区寻址的,所以卡的初始化时先要读取卡的类型,这点要特别注意。这个好像SD2.0卡也是按扇区寻址的吧?SD1.X才是字节寻址吧。

    SD卡简介:
    SD卡的技术规范经过几次升级,与最初版本已有很大不同,本文基于Ver 3.01讨论
    从容量上分
     容量 命名  简称 
     0G<容量<2G Standard Capacity SD Memory Card   SDSC或SD
     2G<容量<32G High Capacity SD Memory Card  SDHC
     32G<容量<2T Extended Capacity SD Memory Card  SDXC

    http://blog.sina.com.cn/s/blog_4f09c0b50101636h.html

    来源:http://servers.pconline.com.cn/skills/0712/1193752.html

    WinHex工具对FAT16磁盘进行分析,簇、扇区、容量关系。

     4G 及4G以上sd卡不能用SPI读写吗?

    数据块长度515个字节,起始标志字节为0xFE,实际数据512字节,2字节CRC
    CRC使用CRC-16算法,不计算时可以设置为0xFF
    写操作之后要等待非忙信号,忙信号使MISO为低电位,接收数据一直为0
     

    来源:http://wenku.baidu.com/view/953298fcaef8941ea76e053c.html

    单片机读写SD卡的代码。。。

    来源:http://wenku.baidu.com/link?url=8xXHUPr2ekFj6xzqfWI5Mu2q7iiszatEic-cikFaEOEnmd_8vg9oLtjhFk3qSCzDK2x-rTGjiFHc4QBeJ3RHIEg51nz4xBIVlN3rxpIR2E3  带文件系统的专用SD卡 的读写操作。不需要了解FAT的复杂结构。

    一旦我们找到了我们要写入文件的起始位置(它一般表示为一个扇区号),那我们就可以在这个起始扇区的下一个扇区写入数据了。

    CMD17的Address是32位的,最后9位是Block地址,前面的是Sector地址.如果Block=512 Byte的话,Block的值只能是0,Block!=0,Response会报错.sector是物理地址.欢迎砸砖! 振南电子,那里有SD的菜鸟教程。

    来源:http://blog.163.com/zhaojun_xf/blog/static/30050580201151410635516/

    winhex读取的数据是逻辑0扇区,而SD卡读取的数据是物理0扇区,肯定不一样。图上的winhex读取的数据应该是DBR,SD卡读取的数据是MBR。

    SD卡地址第一个数据物理地址初始值 用winhex怎么查?

    首先点“工具”点“打开磁盘”选择你要看的磁盘,U盘也能看,点“位置”点“转到偏移”然后再输入“0”点“OK”就可以了
    告诉你快捷方式吧 打开软件后按F9选择你要看的磁盘,然后alt+g或者ctrl+g。然后再输入“0”点“OK”就可以了。

    offset=扇区*512,扇区是512B。WINHEX显示的就是实际的起始字节而不是扇区

    在OpenCore上下载的SD SPI模式代码是按照下面的流程来做的,可以参考下哈。。。

    代码参考C语言:来源:http://wenku.baidu.com/link?url=kn2cP2vSMRlFaO3fwOi-xN188IQe47s6TO37qcqTjndipGSFSQT4akXb0_v2ZjZ51BkA6Jd14BI2G8OFt_NAmNoAUy41cQsN50ENcfheuCm

    来源:http://www.cnblogs.com/zyqgold/archive/2012/01/02/2310340.html

    对SD卡的控制流程

    1、SD卡的SPI工作模式

    SD 卡在上电初期自动进入SD 总线模式,在此模式下向 SD 卡发送复位命令CMD0 。如果SD卡在接收复位命令过程中CS低电平有效,则进入SPI模式,否则工作在SD 总线模式。

    下边是插入SD卡,并初始化为SPI模式的流程图:(至于CMD××究竟是什么样的命令,如下所示

      1 /* 命令响应定义 define command's response */
      2 #define R1 1
      3 #define R1B 2
      4 #define R2 3
      5 #define R3 4
      6 
      7 /**********************************************
      8 
      9      SD卡SPI模式下命令集
     10 
     11 **********************************************/
     12 
     13 /******************************** 基本命令集 Basic command set **************************/
     14 /* 复位SD 卡 Reset cards to idle state */
     15 #define CMD0 0
     16 #define CMD0_R R1
     17 
     18 /* 读OCR寄存器 Read the OCR (MMC mode, do not use for SD cards) */
     19 #define CMD1 1
     20 #define CMD1_R R1
     21 
     22 /* 读CSD寄存器 Card sends the CSD */
     23 #define CMD9 9
     24 #define CMD9_R R1
     25 
     26 /* 读CID寄存器 Card sends CID */
     27 #define CMD10 10
     28 #define CMD10_R R1
     29 
     30 /* 停止读多块时的数据传输 Stop a multiple block (stream) read/write operation */
     31 #define CMD12 12
     32 #define CMD12_R R1B
     33 
     34 /* 读 Card_Status 寄存器 Get the addressed card's status register */
     35 #define CMD13 13
     36 #define CMD13_R R2
     37 
     38 /***************************** 块读命令集 Block read commands **************************/
     39 
     40 /* 设置块的长度 Set the block length */
     41 #define CMD16 16
     42 #define CMD16_R R1
     43 
     44 /* 读单块 Read a single block */
     45 #define CMD17 17
     46 #define CMD17_R R1
     47 
     48 /* 读多块,直至主机发送CMD12为止 Read multiple blocks until a CMD12 */
     49 #define CMD18 18
     50 #define CMD18_R R1
     51 
     52 /***************************** 块写命令集 Block write commands *************************/
     53 /* 写单块 Write a block of the size selected with CMD16 */
     54 #define CMD24 24
     55 #define CMD24_R R1
     56 
     57 /* 写多块 Multiple block write until a CMD12 */
     58 #define CMD25 25
     59 #define CMD25_R R1
     60 
     61 /* 写CSD寄存器 Program the programmable bits of the CSD */
     62 #define CMD27 27
     63 #define CMD27_R R1
     64 
     65 /***************************** 写保护 Write protection *****************************/
     66 /* Set the write protection bit of the addressed group */
     67 #define CMD28 28
     68 #define CMD28_R R1B
     69 
     70 /* Clear the write protection bit of the addressed group */
     71 #define CMD29 29
     72 #define CMD29_R R1B
     73 
     74 /* Ask the card for the status of the write protection bits */
     75 #define CMD30 30
     76 #define CMD30_R R1
     77 
     78 /***************************** 擦除命令 Erase commands *******************************/
     79 /* 设置擦除块的起始地址(只用于SD卡) Set the address of the first write block to be erased(only for SD) */
     80 #define CMD32 32
     81 #define CMD32_R R1
     82 
     83 /* 设置擦除块的终止地址(只用于SD卡) Set the address of the last write block to be erased(only for SD) */
     84 #define CMD33 33
     85 #define CMD33_R R1
     86 
     87 /* 设置擦除块的起始地址(只用于MMC卡) Set the address of the first write block to be erased(only for MMC) */
     88 #define CMD35 35
     89 #define CMD35_R R1
     90 
     91 /* 设置擦除块的终止地址(只用于MMC卡) Set the address of the last write block to be erased(only for MMC) */
     92 #define CMD36 36
     93 #define CMD36_R R1
     94 
     95 /* 擦除所选择的块 Erase the selected write blocks */
     96 #define CMD38 38
     97 #define CMD38_R R1B
     98 
     99 /***************************** 锁卡命令 Lock Card commands ***************************/
    100 /* 设置/复位密码或上锁/解锁卡 Set/reset the password or lock/unlock the card */
    101 #define CMD42 42
    102 #define CMD42_R    R1B
    103 /* Commands from 42 to 54, not defined here */
    104 
    105 /***************************** 应用命令 Application-specific commands ****************/
    106 /* 禁止下一个命令为应用命令  Flag that the next command is application-specific */
    107 #define CMD55 55
    108 #define CMD55_R R1
    109 
    110 /* 应用命令的通用I/O  General purpose I/O for application-specific commands */
    111 #define CMD56 56
    112 #define CMD56_R R1
    113 
    114 /* 读OCR寄存器  Read the OCR (SPI mode only) */
    115 #define CMD58 58
    116 #define CMD58_R R3
    117 
    118 /* 使能或禁止 CRC Turn CRC on or off */
    119 #define CMD59 59
    120 #define CMD59_R R1
    121 
    122 /***************************** 应用命令 Application-specific commands ***************/
    123 /* 获取 SD Status寄存器 Get the SD card's status */
    124 #define ACMD13 13
    125 #define ACMD13_R R2
    126 
    127 /* 得到已写入卡中的块的个数 Get the number of written write blocks (Minus errors ) */
    128 #define ACMD22 22
    129 #define ACMD22_R R1
    130 
    131 /* 在写之前,设置预先擦除的块的个数 Set the number of write blocks to be pre-erased before writing */
    132 #define ACMD23 23
    133 #define ACMD23_R R1
    134 
    135 /* 读取OCR寄存器 Get the card's OCR (SD mode) */
    136 #define ACMD41 41
    137 #define ACMD41_R R1
    138 
    139 /* 连接/断开CD/DATA[3]引脚上的上拉电阻 Connect or disconnect the 50kOhm internal pull-up on CD/DAT[3] */
    140 #define ACMD42 42
    141 #define ACMD42_R R1
    142 
    143 /* 读取SCR寄存器 Get the SD configuration register */
    144 #define ACMD51 51
    145 #define ACMD51_R R1

    张亚峰 SD卡的C语言实现:http://www.cnblogs.com/yuphone/archive/2011/04/19/2021549.html

    现在我急需利用SD卡作为一个数据存储设备, 仅用于 数据写入和读取。但是并不知道SD卡的扇区地址的范围是什么,也就是说我想利用SD卡指令的COM17((单块读指令)和COM24(多块读指令)对SD卡进行纯读写,因为要读写多个扇区,而指令后面加地址参数的取值范围和格式我并不太清楚。希望各位高手帮我解答这个问题。

    另外,SD卡只用来存取数值的话,有必要上系统吗?我的想法是只要知道扇区的地址,逐个读写就行了,不知道这个想法对不对。

    单片机型号:AVR mega16 单片机
    SD卡型号:1G TF卡(已利用卡套转为SD卡)

     CMD17的Address是32位的,最后9位是Block地址,前面的是Sector地址.如果Block=512 Byte的话,Block的值只能是0,Block!=0,Response会报错.

    MMC_write_Blocks:
    1,初始化,进入SPI模式,
    2,发CMD25命令,
    3,连读2字节,好象读1字节也可以,
    4,发start(发一字节0xfc到sd卡),
    5,发一个数据块到sd卡,
    6,发2字节0xff到sd卡,当作CRC16,
    7,读忙信息,直到不忙,
    8,如果所有数据没有发完,跳到4,
    9,结束,发end(发一字节0xfb到sd卡),
    10,发CMD12命令。

    SMMC_read_Blocks:
    1,初始化,进入SPI模式,
    2,发CMD18命令,
    3,循环读到0xfe字节,
    4,读1个数据块到sd卡,
    5,读2字节CRC16,
    6,如果所有数据没有读完,跳到3,
    7,结束,发CMD12命令。

    SD百科资料:http://baike.baidu.com/link?url=tz_JG2S6yNTDWR701WxF4sv7BPXEzy5RtwO-Z2Nc4mcC-OdEK8RV_l16DFY1EBFJ

    MiniSD卡的设计初始是为逐渐开始普及的拍照手机而作,通过附赠的SD转接卡还可当做一般SD卡使用。

    支持传输模式

    SD卡共支持三种传输模式:SPI模式(独立序列输入和序列输出),1位SD模式 (独立指令和数据通道,独有的传输格式), 4位SD模式 (使用额外的针脚以及某些重新设置的针脚。支持四位宽的并行传输)。
    低速卡通常支持 0~400 千比特/秒 数据传输率,采用SPI 和1位SD传输模式。 高速卡支持 0 ~ 100 兆比特/秒数据传输率,采用4位SD传输模式; 支持0–25 兆比特/秒 ,采用SPI和 1位SD模式。
    因应SD卡的标准容量上限只有4GB,不足以应付日益上升的容量需求,联盟制定了新的SDHC标准。SDHC卡的外型跟普通的SD卡完全相同,而容量的下限为4GB,预料年内可推出高达32GB的SDHC卡。

    技术论坛:http://www.amobbs.com/forum-1029-1.html

    拜托你写这跟没写没多大区别,搞硬件的这些不理解就不叫搞硬件的。关键是这些器件如何操作,如何控制,怎样写时序,这才是重点。

    http://www.amobbs.com/thread-4676153-1-1.html

     首先SD一般有两种接口协议,SPI和SDIO 如果你单片机没有SDIO那就用SPI好了,SPI用硬件的或者软件模拟都可以,然后调用SPI发送和接收函数写SD的驱动,写完之后SD卡就可以类似于EEPROM来用了,但是注意,这时候的SD卡是没有“文件”这个概念的,EEPROM也没有嘛,如果想读取SD中的文件那还需要移植文件系统,比如fatfs,移植成功后你就可以用类似于fopen之类的函数啦~驱动方面可以参考原子哥 《STM32不完全》手册的SD卡操作的相关内容,文件系统移植嘛,单片机强一点推荐用fatfs,弱一点的用Petit FAT,曾经在STC 1T的51单片机上使用Petit FAT文件系统读取bmp图像并在彩屏上显示,一分钟刷了一幅图,罪孽啊!!实在无聊

    来源:SD卡的SPI模式的初始化顺序http://jinyong314.blog.163.com/blog/static/301657422010530112349686/

    来源:基于FPGA的SD卡硬件控制器开发(SPI模式)

     http://zsl666.blog.163.com/blog/static/17626761520114308512108/

      

    来源:http://forum.eepw.com.cn/thread/91070/1 我也有同样的问题。。。

    http://www.amobbs.com/forum.php?mod=viewthread&action=printable&tid=4676153  用FPGA直接读取SD卡扇区数据

    能不能把SD卡作为一个“大容量的可以按字节读写的数据存储器”。就是没有任何文件系统,直接像eeprom那样,按地址进行读写数据?谢谢!

    SD卡规范和FAT文件格式规范是非常复杂,如果在项目中要单独来写这两个规范的非常费时和费力,而其非常占用系统资源;现在的便携仪采集的数据种类越来越多,数据量越来越大,而其大部分要求在计算机上备份数据或者后期用计算机处理数据;而SD卡以其容量大,速度快,接口简单,加之配套的读卡器便宜而发展迅速;

    首先SD一般有两种接口协议,SPI和SDIO 如果你单片机没有SDIO那就用SPI好了,SPI用硬件的或者软件模拟都可以,然后调用SPI发送和接收函数写SD的驱动,写完之后SD卡就可以类似于EEPROM来用了,但是注意,这时候的SD卡是没有“文件”这个概念的,EEPROM也没有嘛,如果想读取SD中的文件那还需要移植文件系统,比如fatfs,移植成功后你就可以用类似于fopen之类的函数啦~驱动方面可以参考原子哥 《STM32不完全》手册的SD卡操作的相关内容,文件系统移植嘛,单片机强一点推荐用fatfs,弱一点的用Petit FAT,曾经在STC 1T的51单片机上使用Petit FAT文件系统读取bmp图像并在彩屏上显示,一分钟刷了一幅图,罪孽啊!!实在无聊

    你要了解SD卡资料,文件系统,SPI通信的相关内容。

     

    http://bbs.ednchina.com/BLOG_ARTICLE_2059372.HTM基于FPGA的bmp图片显示

    1、最近编写了几个工厂需要的test pattern,用于UHD120和UHD60的pannel上,其中UHD120需要做半分屏处理,存储一行。

    2、最近写了UHD120/60/30缩放到FHD120/60/30的算法,采用的算法是双线性算法,相邻4点取平均得到的。需要进行行的存储。注意DPRAM的使用技巧,读写控制逻辑的实现。

    3、FHD120/60/30经过FRC处理后 VbyOne的实现是个技术难点。

    I2C去拉动的方法,值得学习。。。

     1 // local wires and regs
     2 reg sdaDeb;
     3 reg sclDeb;
     4 reg [`DEB_I2C_LEN-1:0] sdaPipe;
     5 reg [`DEB_I2C_LEN-1:0] sclPipe;
     6 
     7 reg [`SCL_DEL_LEN-1:0] sclDelayed;
     8 reg [`SDA_DEL_LEN-1:0] sdaDelayed;
     9 reg [1:0] startStopDetState;
    10 wire clearStartStopDet;
    11 wire sdaOut;
    12 wire sdaIn;
    13 wire [7:0] regAddr;
    14 wire [7:0] dataToRegIF;
    15 wire writeEn;
    16 wire [7:0] dataFromRegIF;
    17 reg [1:0] rstPipe;
    18 wire rstSyncToClk;
    19 reg startEdgeDet;
    20 
    21 assign sdaEn = sdaOut;
    22 assign sda = (sdaOut == 1'b0) ? 1'b0 : 1'bz;
    23 assign sdaIn = sda;
    24 
    25 // sync rst rsing edge to clk
    26 always @(posedge clk) begin
    27   if (rst == 1'b1)
    28     rstPipe <= 2'b11;
    29   else
    30     rstPipe <= {rstPipe[0], 1'b0};
    31 end
    32 
    33 assign rstSyncToClk = rstPipe[1];
    34 
    35 // debounce sda and scl
    36 always @(posedge clk) begin
    37   if (rstSyncToClk == 1'b1) begin
    38     sdaPipe <= {`DEB_I2C_LEN{1'b1}};
    39     sdaDeb <= 1'b1;
    40     sclPipe <= {`DEB_I2C_LEN{1'b1}};
    41     sclDeb <= 1'b1;
    42   end
    43   else begin
    44     sdaPipe <= {sdaPipe[`DEB_I2C_LEN-2:0], sdaIn};
    45     sclPipe <= {sclPipe[`DEB_I2C_LEN-2:0], scl};
    46     if (&sclPipe[`DEB_I2C_LEN-1:1] == 1'b1)
    47       sclDeb <= 1'b1;
    48     else if (|sclPipe[`DEB_I2C_LEN-1:1] == 1'b0)
    49       sclDeb <= 1'b0;
    50     if (&sdaPipe[`DEB_I2C_LEN-1:1] == 1'b1)
    51       sdaDeb <= 1'b1;
    52     else if (|sdaPipe[`DEB_I2C_LEN-1:1] == 1'b0)
    53       sdaDeb <= 1'b0;
    54   end
    55 end
    56 
    57 
    58 // delay scl and sda
    59 // sclDelayed is used as a delayed sampling clock
    60 // sdaDelayed is only used for start stop detection
    61 // Because sda hold time from scl falling is 0nS
    62 // sda must be delayed with respect to scl to avoid incorrect
    63 // detection of start/stop at scl falling edge. 
    64 always @(posedge clk) begin
    65   if (rstSyncToClk == 1'b1) begin
    66     sclDelayed <= {`SCL_DEL_LEN{1'b1}};
    67     sdaDelayed <= {`SDA_DEL_LEN{1'b1}};
    68   end
    69   else begin
    70     sclDelayed <= {sclDelayed[`SCL_DEL_LEN-2:0], sclDeb};
    71     sdaDelayed <= {sdaDelayed[`SDA_DEL_LEN-2:0], sdaDeb};
    72   end
    73 end
    74 
    75 // start stop detection
    76 always @(posedge clk) begin
    77   if (rstSyncToClk == 1'b1) begin
    78     startStopDetState <= `NULL_DET;
    79     startEdgeDet <= 1'b0;
    80   end
    81   else begin
    82     if (&sclDelayed == 1'b1 && sdaDelayed[`SDA_DEL_LEN-2] == 1'b0 && sdaDelayed[`SDA_DEL_LEN-1] == 1'b1)
    83       startEdgeDet <= 1'b1;
    84     else
    85       startEdgeDet <= 1'b0;
    86     if (clearStartStopDet == 1'b1)
    87       startStopDetState <= `NULL_DET;
    88     else if (&sclDelayed == 1'b1) begin
    89       if (sdaDelayed[`SDA_DEL_LEN-2] == 1'b1 && sdaDelayed[`SDA_DEL_LEN-1] == 1'b0) 
    90         startStopDetState <= `STOP_DET;
    91       else if (sdaDelayed[`SDA_DEL_LEN-2] == 1'b0 && sdaDelayed[`SDA_DEL_LEN-1] == 1'b1)
    92         startStopDetState <= `START_DET;
    93     end
    94   end
    95 end
  • 相关阅读:
    前端(移动端)开发沉思录
    我的世界观—学习与世界观
    学习一门新的语言和平台相当于学习一个新的世界观
    股票:格局、模式、结构与策略
    资本市场世界观
    投资的道与术:投资投的是自己的修为
    关心把事情做得正确,而不是关心赚钱--《股票作手回忆录》第十一章--投资股票的道与术
    js字符串截取函数slice()、substring()、substr()
    推荐一个好的Redis GUI 客户端工具
    sometimes-ever js中创建数组,并往数组里添加元素
  • 原文地址:https://www.cnblogs.com/zlh840/p/3744955.html
Copyright © 2020-2023  润新知