分享

STM32F103C8T6 SD/Micro TF卡 SFATS 软SPI 硬SPI

 goodwangLib 2019-05-16

使用环境(蓝色粗体字为特别注意内容)
1、软件环境:Keil MDK 5.15
2、硬件环境:STM32F103C8T6最小系统,Micro TF卡

在一个项目中需要用到SD卡,于是在某宝买了一块Micro TF卡插槽,SPI驱动:

貌似不用那个小芯片好像可以用IO口直接驱动TF卡,不知道那个小芯片干嘛用的,也没工夫去追究了,废话少说,先来看接线:

  1. TF卡模块   STM32单片机
  2. GND     ->    GND
  3. CS      ->    PB12/SPI2_NSS
  4. SCK     ->    PB13/SPI2_SCK
  5. MISO   ->    PB14/SPI2_MISO
  6. MOSI   ->    PB15/SPI2_MOSI


关于CS/NSS管脚,即我们熟知的片选信号,作为主设备NSS管脚为高电平,从设备NSS管脚为低电平。

一开始为了性能考虑,打算使用硬件SPI2,后来发现速度太快了,SD/TF卡的速度跟不上,调了半天调不出来,必须降低APB总线速率:

//配置APB1(PCLK1)钟=AHB 1/2时钟

 RCC_PCLK2Config(RCC_HCLK_Div4); //72/4=18MHz ,会降低总线频率,导致串口不正常!慎用!

但是总线速率一下降,延时函数,串口通信函数都会受影响,于是考虑使用两种方式实现即硬件SPI+软件模拟SPI。

最终使用软件模拟SPI并且移植SFATS,读取2G的SD卡成功,

main函数如下 

  1. /*******************************************************************************
  2. * @file SDFatFS/source/main.c
  3. * @author Pang
  4. * @version V1.0.2
  5. * @date 1/1/2019
  6. * @brief
  7. ******************************************************************************/
  8. #include 'common.h'
  9. #include 'led.h'
  10. #include 'delay.h'
  11. #include 'usart_printf.h'
  12. char path[10] = '0:';// SD卡根目录
  13. FATFS fs;
  14. char wbuff[] = 'This is FATFS function test\r\n * f_open\r\n * f_write\r\n * f_close\r\n';
  15. char wbuff2[512 * 26];
  16. // *******************************************************************************
  17. // Function Name : main
  18. // Description :
  19. // Input : None
  20. // Output : None
  21. // Return : None
  22. // *******************************************************************************
  23. int main(void)
  24. {
  25. u16 i, j;
  26. LED_Init();
  27. Hardware_Configuration();
  28. ffext_mount(0, &fs);
  29. ffext_scanfiles (path);
  30. for(i = 0; i < 26; i++)
  31. {
  32. for(j = 0; j < 512; j++)
  33. {
  34. wbuff2[i * 512 + j] = 'A' + i;
  35. }
  36. }
  37. ffext_read('0:/test/test.ini', wbuff2, (512 * 26), FA_OPEN_ALWAYS | FA_READ);
  38. ffext_write('0:/test/out.ini', wbuff2, (512 * 26), FA_OPEN_ALWAYS | FA_WRITE);
  39. printu('>%s', wbuff2);
  40. // ffext_write('0:CardInfo.txt', wbuff, sizeof(wbuff)-1, FA_OPEN_ALWAYS | FA_WRITE);
  41. // ffext_write('0:ffext2.ini', wbuff2, (512*26), FA_OPEN_ALWAYS | FA_WRITE);
  42. for(i = 0; i < 26; i++)
  43. {
  44. for(j = 0; j < 512; j++)
  45. {
  46. wbuff2[i * 512 + j] = 0;
  47. }
  48. }
  49. ffext_read('0:ffext2.ini', wbuff2, (512 * 26), FA_OPEN_ALWAYS | FA_READ);
  50. ffext_write('0:ffext1.txt', wbuff2, (512 * 26), FA_OPEN_ALWAYS | FA_WRITE);
  51. while (1)
  52. {
  53. }
  54. }

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多