目录
一、SD卡读写模块
二、SPI协议
三、代码分析
四、接线
?
五、总结
一、SD卡读写模块
????????SD卡读写是指单片机读写SD卡/TF卡。SD卡是一种低电压的flash闪存产品,有标准的MMC/SPI两种操作模块。对于MMC操作模式,读写速度快,控制信号线多,操作复杂,对于SPI操作模块,速度慢,线少,操作相对简单。
关于SD卡读写模块在百度百科有更详细的解释:??nullhttps://baike.baidu.com/item/SD%E5%8D%A1%E8%AF%BB%E5%86%99%E6%A8%A1%E5%9D%97/1455469?fr=aladdin链接如上,我在此不再赘述。
二、SPI协议
SD卡也是通过SPI协议进行通信,关于SPI协议的解释如下:
????????SPI是串行外设接口(Serial Peripheral Interface)的缩写,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为PCB的布局上节省空间,提供方便,正是出于这种简单易用的特性,越来越多的芯片集成了这种通信协议,比如AT91RM9200。
在百度百科有关于SPI协议更详细的解释:
SPI(SPI协议)_百度百科 (baidu.com)https://baike.baidu.com/item/SPI/53075243?fr=aladdin链接如上,在此我不再过多赘述。
三、代码分析
主函数
int main(void)
{
? /* USER CODE BEGIN 1 */
? /* USER CODE END 1 */
??
? /* MCU Configuration--------------------------------------------------------*/
? /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
? HAL_Init();
? /* USER CODE BEGIN Init */
? /* USER CODE END Init */
? /* Configure the system clock */
? SystemClock_Config();
? /* USER CODE BEGIN SysInit */
? /* USER CODE END SysInit */
? /* Initialize all configured peripherals */
? MX_GPIO_Init();
? MX_SPI1_Init();
? MX_FATFS_Init();
? MX_USART1_UART_Init();
? /* USER CODE BEGIN 2 */
?? ?
?? ?HAL_UART_Receive_IT(&huart1,&aRxBuffer1,1); ?? ?//enable uart?? ?
?? ?printf(" mian \r\n");
?? ?Get_SDCard_Capacity();?? ?//得到使用内存并选择格式化
? /* USER CODE END 2 */
? /* Infinite loop */
? /* USER CODE BEGIN WHILE */
? while (1)
? {?? ??? ?
?? ??? ?WritetoSD(WriteBuffer,sizeof(WriteBuffer));?? ??? ??? ?
?? ??? ?HAL_Delay(500);
?? ??? ?WriteBuffer[0] = WriteBuffer[0] +0;
?? ??? ?WriteBuffer[1] = WriteBuffer[1] +1;
?? ??? ?write_cnt ++;?? ??? ?
?? ??? ?while(write_cnt > 10)
?? ??? ?{?? ?
?? ??? ??? ?printf(" while \r\n");
?? ??? ??? ?HAL_Delay(500);
?? ??? ?}?? ??? ??? ?
? ? /* USER CODE END WHILE */
? ? /* USER CODE BEGIN 3 */
? }
? /* USER CODE END 3 */
}
SD卡写入函数
void WritetoSD(BYTE write_buff[],uint8_t bufSize)
{
?? ?FATFS fs;
?? ?FIL file;
?? ?uint8_t res=0;
?? ?UINT Bw;?? ?
?? ?
?? ?res = SD_init();?? ??? ?//SD卡初始化
?? ?
?? ?if(res == 1)
?? ?{
?? ??? ?printf("SD卡初始化失败! \r\n");?? ??? ?
?? ?}
?? ?else
?? ?{
?? ??? ?printf("SD卡初始化成功! \r\n");?? ??? ?
?? ?}
?? ?
?? ?res=f_mount(&fs,"0:",1);?? ??? ?//挂载
?? ?
//?? ?if(test_sd == 0)?? ??? ?//用于测试格式化
?? ?if(res == FR_NO_FILESYSTEM)?? ??? ?//没有文件系统,格式化
?? ?{
//?? ??? ?test_sd =1;?? ??? ??? ??? ?//用于测试格式化
?? ??? ?printf("没有文件系统! \r\n");?? ??? ?
?? ??? ?res = f_mkfs("", 0, 0);?? ??? ?//格式化sd卡
?? ??? ?if(res == FR_OK)
?? ??? ?{
?? ??? ??? ?printf("格式化成功! \r\n");?? ??? ?
?? ??? ??? ?res = f_mount(NULL,"0:",1); ?? ??? ?//格式化后先取消挂载
?? ??? ??? ?res = f_mount(&fs,"0:",1);?? ??? ??? ?//重新挂载?? ?
?? ??? ??? ?if(res == FR_OK)
?? ??? ??? ?{
?? ??? ??? ??? ?printf("SD卡已经成功挂载,可以进进行文件写入测试!\r\n");
?? ??? ??? ?}?? ?
?? ??? ?}
?? ??? ?else
?? ??? ?{
?? ??? ??? ?printf("格式化失败! \r\n");?? ??? ?
?? ??? ?}
?? ?}
?? ?else if(res == FR_OK)
?? ?{
?? ??? ?printf("挂载成功! \r\n");?? ??? ?
?? ?}
?? ?else
?? ?{
?? ??? ?printf("挂载失败! \r\n");
?? ?}?? ?
?? ?
?? ?res = f_open(&file,SD_FileName,FA_OPEN_ALWAYS |FA_WRITE);
?? ?if((res & FR_DENIED) == FR_DENIED)
?? ?{
?? ??? ?printf("卡存储已满,写入失败!\r\n");?? ??? ?
?? ?}
?? ?
?? ?f_lseek(&file, f_size(&file));//确保写词写入不会覆盖之前的数据
?? ?if(res == FR_OK)
?? ?{
?? ??? ?printf("打开成功/创建文件成功! \r\n");?? ??? ?
?? ??? ?res = f_write(&file,write_buff,bufSize,&Bw);?? ??? ?//写数据到SD卡
?? ??? ?if(res == FR_OK)
?? ??? ?{
?? ??? ??? ?printf("文件写入成功! \r\n");?? ??? ??? ?
?? ??? ?}
?? ??? ?else
?? ??? ?{
?? ??? ??? ?printf("文件写入失败! \r\n");
?? ??? ?}?? ??? ?
?? ?}
?? ?else
?? ?{
?? ??? ?printf("打开文件失败!\r\n");
?? ?}?? ?
?? ?
?? ?f_close(&file);?? ??? ??? ??? ??? ??? ?//关闭文件?? ??? ?
?? ?f_mount(NULL,"0:",1);?? ??? ? //取消挂载
?? ?
}
程序首先进行相关初始化,完成后输出mian,之后进行SD卡格式化,成功后进入循环,进入SD卡读写函数,先后进行SD卡的初始化,挂载,创文件,写入,写入超过10次,输出while
四、接线
SD卡 | STM32? | ? ? ? CS???????? | PB0 | SCK | PA5 | MISO | PA6 | MOSI | PA7 |
五、总结
本次实验内容较多,本篇博客内容较清晰,如有不足请指出
|