微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > dsPIC33F系列DSC的 SD存储卡接口设计

dsPIC33F系列DSC的 SD存储卡接口设计

时间:01-05 来源:作者:合肥电子工程学院 程宇 朱良学 点击:


  3 SD卡接口的实现

  3.1 选择SD卡的SPI模式并初始化SD卡


  在上电之后,主机开始发送时钟信号,此时的时钟频率不能超过400 kHz。主机要连续发送至少74个时钟周期的"1"才能使SD卡准备好通信,然后选择SPI模式。SD卡进入SPI模式之后,就可以接收来自主机的操作指令了。这时候主机发送SEND_OP_COND指令,激活卡的初始化过程。在得到正确的响应之后,主机再发送SEND_CSD指令读取CSD寄存器的内容。正确响应之后,将SPI总线时钟频率提高到10 MHz,初始化过程结束。

  3.2 指令和响应交互过程的软件实现

  typSD_CMD是自定义的结构类型,包含指令索引、CRC和响应格式。最后一个字节数据用来说明该指令有无后续数据块,例如READ_SINGLE_BLOCK(单数据块读指令),它需要SD卡发送一个数据块的数据,因此其后的数据为"1"。对于指令索引,是把开始位和传输位与6位索引值包含在一起的数据。例如G0_IDLE_STATE的索引值是二进制"000000",加上开始位"O"和传输位"1",成为"01000000",即"Ox40",READ_SINGLE_BLOCK的索引值是"010001",加上开始位和传输位,成为"01010001"即"0x51"。

  定义发送指令函数为SendSDCmd(),返回值为从总线上读取的响应数据。(具体函数略--编者注)函数的第一个参数是指令列表数组中相应指令元素的序号,函数会根据它的值在指令表中查到对应的信息,第二个参数是指令的附加内容。函数中CMD_PACKET是按指令格式(见表2)定义的联合类型,程序通过查表的方式将指令的内容装载到该类型定义的变量中,并通过函数Write_sd()发送出去。write_sd()的作用是把一个字节的数据放到SPI2模块的buRFer里,完成一个字节的发送。函数ReadSd()用来读取SPI2接收的一个字节数据。如果接收的数据是0xff,则不是响应数据;如果接收到的响应不为全零,则说明有错误发生。

  以上程序按照图2所示时序执行,来实现一次指令和响应数据的交互。当某条指令有后续数据时,按照规范中的时序发送或者读取数据。

  3.3 读写操作的实现

  READ_SINGLE_BLOCK是单数据块读指令,在接收到有效的读指令后SD卡将会送出一个响应。紧接着是一个带16位CRC校验后缀的数据块,数据块的长度要在之前由SET_BLOCKEN(CMDl6)指令定义,一般为512字节,正好一个扇区的大小。数据块的开始是1字节的开始令牌,值为"0xFE",结束是2字节的CRC。该操作的通信过程如图4所示。

  WRITE_SINGLE_BLOCK是单数据写操作指令,在接收到主机传来的数据后,SD卡会发送一个值为0x5的数据响应,之后进入busy状态。该操作的如图5所示。

  按照以上通信过程编写程序,单数据块读和写的程序流程如图6所示。

  4 结果验证

  将容量为1 GB的SD卡插入SD读卡器,再将读卡器插入PC机的USB接口中,此时系统出现"可移动磁盘(H:)"根目录。打开winhex软件,点击"工具"下拉菜单中的"打开磁盘",选择"物理磁盘"中的"RMl:Ceneric STORAGE DEVICE(O.9G,USB)",单击"确定"按钮,得到该SD卡第一个物理扇区的数据。该SD卡在偏移量从446开始的16个字节有数据"00 03 3D 00 06 OD ED DB F9 00 00 OO 07 5F 1E 00",该扇区结束的两个字节为"55AA",其余部分数据均为"00"。

  将SD卡取出,插入本设计电路的SD卡座中,用示波器连接D0、CLK和DI线,接通电源,测量SPI总线上的波形。

  本设计利用dsPIC33FJ64GP706的SPI接口实现了对SD存储卡的操作,可以把SD卡和dsPIC33F系列DSC两方面的优点集中到一个嵌入式系统中,有较高的利用价值。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top