主机环境:Windows 7 SP1
开发环境:MDK5.14
目标板:ST NUCLEO-F303RE
TFT型号:2.4英寸,带触摸,SD卡,240*320分辨率,26万色
驱动IC:ILI9325
ST库版本:STM32Cube_FW_F3_V1.1.0
SD卡:Kingston 16GB Micro SDHC Class 10
本TFT模块是带有SD卡插槽的,之前连线一直没接,现在可以使用了,对于该TFT模块来说一副图片需要的空间为150K(240*320*2),如果图片都存入FALSH空间肯定是存放不了多少图片资源的,因此我们可以把图片资源存入SD卡中等到需要时再从SD卡读取来显示,这样只要SD卡空间够大我们就可以显示很多图片资源了,因此来研究看SD卡的读写吧,这里是没有为SD卡做文件系统的,那个是以后的事情了。
对于SD卡的操作跟LCD类似,EVAL的固件库里面同样有写好了的SD库函数stm32303e_eval_sd.c/h,如下
基于SD卡资料文档配合库函数就可以完成我们SD卡的操作了,由于NUCLEO-F303RE的SPI1接口中的MOSI脚被用于LED2的操作,因此这里使用IO口模拟SPI通信来对SD卡进行操作,接口声明如下
#define SPI_SDCARD_nCS_GPIO_CLK_ENABLE() __GPIOC_CLK_ENABLE()
#define SPI_SDCARD_SCK_GPIO_CLK_ENABLE() __GPIOC_CLK_ENABLE()
#define SPI_SDCARD_MISO_GPIO_CLK_ENABLE() __GPIOC_CLK_ENABLE()
#define SPI_SDCARD_MOSI_GPIO_CLK_ENABLE() __GPIOC_CLK_ENABLE()
#define SPI_SDCARD_SCK_PIN GPIO_PIN_6
#define SPI_SDCARD_SCK_GPIO_PORT GPIOC
#define SPI_SDCARD_MISO_PIN GPIO_PIN_8
#define SPI_SDCARD_MISO_GPIO_PORT GPIOC
#define SPI_SDCARD_MOSI_PIN GPIO_PIN_5
#define SPI_SDCARD_MOSI_GPIO_PORT GPIOC
#define SPI_SDCARD_nCS_PIN GPIO_PIN_9
#define SPI_SDCARD_nCS_GPIO_PORT GPIOC
#define SPI_SDCARD_nCS_Set_Low() (GPIOC->BRR = GPIO_PIN_9)
#define SPI_SDCARD_nCS_Set_High() (GPIOC->BSRRL = GPIO_PIN_9)
#define SPI_SDCARD_SCK_Set_Low() {__NOP();__NOP(); \
__NOP();__NOP(); \
GPIOC->BRR = GPIO_PIN_6; \
__NOP();__NOP(); \
__NOP();__NOP();}
#define SPI_SDCARD_SCK_Set_High() {__NOP();__NOP(); \
__NOP();__NOP(); \
GPIOC->BSRRL = GPIO_PIN_6; \
__NOP();__NOP();}
#define SPI_SDCARD_MOSI_Set_Low() (GPIOC->BRR = GPIO_PIN_5)
#define SPI_SDCARD_MOSI_Set_High() (GPIOC->BSRRL = GPIO_PIN_5)
#define SPI_SDCARD_MISO_Read() (GPIOC->IDR & GPIO_PIN_8)
SD卡是有9个引脚的,分配如下
当使用SPI模式时我们只用到了4个引脚,CLK、CS、DataIn、DataOut
SD里面是有一个接口控制器的,如下图
接口里面有7个寄存器CID、RCA、SCD、SCR、OCR、CSR(Card Status)、SSR(SD Status)。
但是这些寄存器在不同的模式下有些许不同,大体上是一致的,SPI模式下RCA寄存器是不支持的。上面5个寄存器的内容有很多,也很重要,文档提了一大坨,用到时再来看吧。
SD卡系统特性如下
时钟限制在0~25MHz,电压限制在2.0~3.6V,一般是使用3.3V供电电压。在使用SPI通信时数据在CLK的上升沿锁存,CLK空闲状态是低电平,MOSI在空闲状态下为1
SDCard的通讯协议分三块Command、Response、Data-block,形式如下:
发送一个命令后SD卡的控制器回返回一个response,之后传输数据且带有CRC校验码。但是SPI模式下CRC校验默认是禁止的。
SD卡上电初始化时序
上电时需要74个时钟周期来稳定。SD卡在上电后默认是SD模式,要想使用SPI模式需要发送命令给SD卡的控制器来进行模式切换