工程师STM32单片机学习基础手记(4):用PWM实现荧火虫灯(三)
SDIO_CMD在SDIO_CK的上升沿进行同步。
回应:
回应是由被寻址的卡发出的一个标记(或是在MMC V3.31及以前标准中,所有连接在适配器上的卡同步发送),此标记由卡发给主机,是对刚刚接收到的命令的回答。回应是在CMD信号线上串行传输的。
SDIO支持两种回应类型,都是进行CRC校验的:
48位的短回应(short response)
136位的长回应(long response)
注意:如果回应不包含CRC校验信息(如CMD1的回应),设备驱动就必须忽略CRC错误的状态。
下面两张表是两种回应的格式:
前面讲到,SDIO适配器包含两个大块儿,详见本帖开头,这里只拿出图来:
其中,与AHB接口相连的有两个块儿,就是上图中左侧阴影部分,Adapter registers 和FIFO,即适配器寄存器组和数据FIFO。前者包含了适配器所有的寄存器,用于配置相应时序,产生相应的信号。
这里面,用于控制命令通道产生命令时序的就有两个寄存器,名为SDIO_ARG和SDIO_CMD,SDIO_ARG的三十二位全部用来存储命令参数,也就没什么好讲的了。SDIO_CMD则不同,它有六个位,用来识别不同的命令,总共可以区别64个,但实际上SD卡的命令集没有那么多。 SDIO_CMD还有一些位,用来表示些命令时否有回应,是长回应还是短回应,命令的类型是什么等等。适配器最终根据这些,加上CRC组合成一个48位的命令。
另外,我们还提到过命令发送之后,如果这是一个没有回应的命令,那么就很简单,命令通道直接置位CMDSENT标志,或进入空闲状态。如果是有回应的,则要等待回应,并设定相关的标志位。命令通道的相关标志位如下:
CRC 产生器计算的是CRC码前面的所有位的校验和。这包括开始位,传输位,命令索引(command index)和命令参数(和卡状态)。对长回应格式来说,CRC校验和计算的是CID或CSD的前120位。这里不包括开始位,传输位和六个保留位。 CRC是一个7位的值,其计算方法如下:
- STM32的曼彻斯特编译码系统设计(02-04)
- STM32学习:ADC/DMA/USART(07-25)
- 采用ARM Cortex-M3单片机和DSP的逆变电源设计(06-24)
- STM32 ADC的采样周期确定(02-22)
- 基于STM32F103RB和CC1101的无线数传模块设计(07-23)
- 详解GPIO在STM32中的几种工作模式(09-24)