SPI初始化及SD卡驱动总结——基于AT91SAM7X256 一、 SPI端口初始化 1、 配置PMC(电源管理控制器) PMC提供5种时钟: (1) MCK(主机时钟) , 用于AIC或存储控制器及所有外设 (2) PCK(处理器时钟) (3) 外设时钟, 提供给内置外设, 如USART、 SSC、 SPI、 TWI等 (4) UDPCK, 供USB器件使用 (5) PCKx引脚驱动的可编程时钟输出 修改PMC_PCER使能相应的外设时钟, 我这里用到AT91C_ID_PIOA和AT91C_ID_SPI1, 分别对应Bit[2] 和Bit[5] 。 2、 配置PIO SPI需要4根线: NPCS, SPCK, MISO, MOSI, 分别设置AT91C_BASE_PIOA的PIO_ASR和PIO_PDR寄存器, 使能外设控制这些引 脚。 3、 配置SPI端口 (1) 写SPI_CR软复位SPI (2) 与外设相连, 对应的PCS位置成0xb(x011) 写SPI_MR模式寄存器配置, 这里要注意NPCSx, 要和真正使用的CS片选口一致。 我这里用到NPCS2, 直接 (3) 配置相应的SPI_CSR寄存器 (4) 写SPI_CR使能该SPI 以上配置结束后, 该SPI口应该就可以查询SPI_SR状态寄存器进行正常读写了 , 或者用AIC来中断控制SPI的读写。 可以将MISO和MOSI短接, 回环发送、 接收数据以验证SPI是否正常工作。 二、 SD驱动 对SD卡的驱动主要有初始化、 读、 写、 擦除等。 1、 初始化 步骤: (1) 延时至少74clock (2) 发送CMD0, 需要返回0x01, 进入Idle状态 (3) 循环发送CMD55+ACMD41, 直到返回0x00, 进入Ready状态。 如果是MMC, 此步应发送CMD1。 2、 读 步骤: (1) 发送CMD17(单块) 或CMD18(多块) 读命令, 返回0x00 (2) 接收数据开始令牌0xfe(或0xfc) + 正式数据512Bytes + CRC 校验2Bytes 默认正式传输的数据长度是512Bytes, 可用CMD16设置。 3、 写 步骤: (1) 发送CMD24(单块) 或CMD25(多块) 写命令, 返回0x00 (2) 发送数据开始令牌0xfe(或0xfc) + 正式数据512Bytes + CRC校验2Bytes 4、 擦除 步骤: (1) 发送CMD32, 跟一个参数来指定首个要擦出的扇区号(SD手册上说是块号) (2) 发送CMD33, , 指定最后的扇区号 第 1 页 (3) 发送CMD38, 擦除指定区间的扇区 此3步顺序不能颠倒。 还要注意发送CMD命令时, 后面要跟一个字节的CRC校验数据, 总之要保证每次发送的数据包长度符合协议要求, 命令、 数据符合时序要求。 第 2 页