STM32 TFT学习笔记——SD卡读写

本文档介绍了如何在STM32 NUCLEO-F303RE开发板上使用2.4英寸TFT模块进行SD卡读写操作。通过SPI模拟通信,详细阐述了SD卡的初始化过程,包括CMD0、CMD8、CMD58、ACMD41等命令的使用,以及SD卡的读写操作。内容涉及SPI模式下的SD卡通信协议和命令格式,适合嵌入式开发人员参考。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

主机环境: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卡的控制器来进行模式切换

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值