[N32G45x] 01基于N32G457+SDIO+USB的读卡器

[复制链接]
 楼主| lazyduck 发表于 2022-2-25 09:31 | 显示全部楼层 |阅读模式
AD, gp, pi, IO, sd
本帖最后由 lazyduck 于 2022-2-25 09:43 编辑

#申请原创# @21小跑堂 年前申请的,审核很快。打电话确认、发货,没两天就拿到了板子,做工还可以。型号是:N32G45XVL-STB,放个图:
QQ图片20220217162437.jpg
然后是做什么,因为这段时间对USB感兴趣,所以想做一些基于USB接口的HID或者MASS设备。不过拿到资料以后,发现厂家的例程里已经做好了,这方面赞一个!放个USB方面例程的截图:
QQ截图20220217162552.png
先说下芯片以及厂家给的例程和库函数吧。M4的内核,主频144MHZ。例程打开后,满满的ST标准外设库的感觉。当然,并不是一模一样的,编写风格上很有自己的特色,一些IO操作直接操作寄存器,感觉效率还是可以的。之前用ST的标准外设库用了四五年,所以上手还是很快的。从头开始,搭建了个工程模板,点了个灯。

本以为点灯应该是一帆风顺的,结果出了点状况。板子上受IO控制的有三个LED:D1,D2,D3,对应PA8,PB4,PB5。结果PA8和PB5都没问题,唯独PB4,一直是一副不受控的样子,不管怎么配置,上电的时候都是微微发光。上示波器测了下,恒定输出电压2.4V左右,不管程序怎么执行,输出电平没有任何波动。昨天刚知道,PB4是JTAG脚,唉....

接下来弄点别的,读卡器的程序里面也有,不过厂家用的是内部的flash实现的(话说这样的程序我也搞过)。换个方式吧,不用内部flash了,改成TF卡,SDIO接口的。官方例程里有SDIO接SD卡的例程,移植一下应该就可以。


但是...我没有卡座(只有一个SPI接口的SD卡座),,,
所以临时上立创EDA画了一个SDIO接口的TF卡座,发出去打样。
等待板子的这几天研究程序,之前用ST的芯片实现USB外设,用的都是HAL库的函数,标准外设库的没搞过。两者风格不一样,看的过程花了些时间。最终确定一个比较关键的C文件:mass_mal.c,这里面是flash的初始化以及读写操作。后续只要把TF卡相关的函数放在这个位置即可。如图:
QQ截图20220217163340.png
几天后,TF卡座到了,焊接,开始搞。
以我自己搭建的工程模板为基础,先把USB相关的文件添加进来(复制USB例程里的文件),然后是SD卡的C文件(复制SDIO例程里面的sdio_sdcard.c文件)。修改相应函数,主要部分如下:
  1. /*******************************************************************************
  2. * Function Name  : MAL_Init
  3. * Description    : Initializes the Media on the Nations
  4. * Input          : None
  5. * Output         : None
  6. * Return         : None
  7. *******************************************************************************/
  8. uint16_t MAL_Init(uint8_t lun)
  9. {
  10. //    FLASH_Unlock();
  11.                 uint32_t testResult = 0;
  12.     Status = SD_Init(0, 3, 4);
  13.     if (Status != SD_OK)
  14.     {
  15.         log_debug("SD Card initialization failed!\r\n");
  16.         return testResult;
  17.     }
  18.     return MAL_OK;
  19. }
  20. /*******************************************************************************
  21. * Function Name  : MAL_Write
  22. * Description    : Write sectors
  23. * Input          : None
  24. * Output         : None
  25. * Return         : None
  26. *******************************************************************************/
  27. uint16_t MAL_Write(uint8_t lun, uint32_t Memory_Offset, uint32_t *Writebuff, uint16_t Transfer_Length)
  28. {
  29.     uint16_t i;
  30.     switch (lun)
  31.     {
  32.     case 0:
  33.                         SD_WriteDisk((uint8_t *)Writebuff, Memory_Offset>>9, 1);
  34.                         Status = SD_WaitWriteOperation();
  35.                         while (SD_GetStatus() != SD_TRANSFER_OK)
  36.                                         ;
  37.       break;
  38.     case 1:
  39.       break;
  40.     default:
  41.       return MAL_FAIL;
  42.     }
  43.     return MAL_OK;
  44. }

  45. /*******************************************************************************
  46. * Function Name  : MAL_Read
  47. * Description    : Read sectors
  48. * Input          : None
  49. * Output         : None
  50. * Return         : Buffer pointer
  51. *******************************************************************************/
  52. uint16_t MAL_Read(uint8_t lun, uint32_t Memory_Offset, uint32_t *Readbuff, uint16_t Transfer_Length)
  53. {
  54.     uint16_t i;
  55.     switch (lun)
  56.     {
  57.         case 0:
  58.                                         SD_ReadDisk((uint8_t *)Readbuff, Memory_Offset>>9, 1);
  59.                                         Status = SD_WaitReadOperation();
  60.                                         while (SD_GetStatus() != SD_TRANSFER_OK)
  61.                                                         ;
  62.           break;
  63.         case 1:
  64.           break;
  65.         default:
  66.           return MAL_FAIL;
  67.     }
  68.     return MAL_OK;
  69. }

  70. /*******************************************************************************
  71. * Function Name  : MAL_GetStatus
  72. * Description    : Get status
  73. * Input          : None
  74. * Output         : None
  75. * Return         : None
  76. *******************************************************************************/
  77. uint16_t MAL_GetStatus (uint8_t lun)
  78. {
  79.     SD_CardInfo SDCardInfo;          // Information for memory card, part of DSR
  80.                 SD_GetCardInfo(&SDCardInfo);
  81.                 if (lun == 0)
  82.     {
  83.         Mass_Block_Count[0] = SDCardInfo.CardCapacity/512;
  84.         Mass_Block_Size[0] =  512;
  85.         Mass_Memory_Size[0] = SDCardInfo.CardCapacity;
  86.         return MAL_OK;
  87.     }
  88.     return MAL_FAIL;
  89. }
关键函数就这几个,当然,调试过程不是一帆风顺,函数MAL_Write和MAL_Read花了点时间。

HAL库下,读写BLOCK时,送入的参数是BLOCK的编号和个数,而这里送入的参数是字节的偏移量-Memory_Offset,以及字节个数-Transfer_Length,这一点要注意。
同时,读操作或者写操作之后要有个等待完成的操作,否则会有异常。险些弄坏我一张TF卡!
  1. Status = SD_WaitReadOperation();
  2.                             while (SD_GetStatus() != SD_TRANSFER_OK)
  3.                                        ;

最后,就没啥了。接线如下:
QQ图片20220217165223.jpg
看下读写速度:
QQ图片20220217164218.png
      尴尬的85KB/S!
      即便是全速USB2.0,我用STM32做的话,SDIO接口操作TF卡,也能到几百KB,这么低不是硬件问题。
      HAL库里面, 有两个地方要修改,一个是堆栈的大小,另一个是每次传输的PACKET包大小。这里的话,堆栈我知道,但是这个PACKET包在标准外设库中对应的值,我还没找到,需要花些时间。
      例程先上传,有兴趣的可以玩玩试试。


N32G457 TF卡-读卡器.rar

7.65 MB, 下载次数: 183

评论

[url=home.php?mod=space&uid=3165232]@蜗牛的房子[/url] :是我分享的代码吗? 如果是的话,那么杜邦线引发问题的可能比较大  发表于 2022-6-8 18:52
我用N32G457QEL_EVB V1.1(板子上有SD卡槽)的板子运行这个代码,往模拟U盘写入数据时能到350KB/s左右,从模拟U盘读出数据到PC主机30几兆的文件瞬间完成。ST的板子跑这个代码,也是350KB/s左右。所以我认为应该是使用杜邦线去连接SD卡座不可靠或者你也可以尝试换张SD卡试试  发表于 2022-5-24 10:17
 楼主| lazyduck 发表于 2022-2-25 09:45 | 显示全部楼层
有敏感字,分了几次才编辑完,心好累!!!
WoodData 发表于 2022-2-25 11:31 | 显示全部楼层
做的不错,支持一下
wifi99 发表于 2022-2-25 15:59 | 显示全部楼层
辛苦了,下载来,学习学习
 楼主| lazyduck 发表于 2022-3-1 10:07 | 显示全部楼层
wifi99 发表于 2022-2-25 15:59
辛苦了,下载来,学习学习

多谢捧场
tifmill 发表于 2022-4-1 12:45 | 显示全部楼层
有兴趣的,谢谢楼主分享的。
jimmhu 发表于 2022-4-1 14:12 | 显示全部楼层
spi速度也比这个快吧
kkzz 发表于 2022-4-1 16:26 | 显示全部楼层
只适合小范围保存吧  
ulystronglll 发表于 2022-4-11 15:06 | 显示全部楼层
是不是线太长的有干扰呢
vivilyly 发表于 2022-4-11 15:38 | 显示全部楼层
这个做的非常棒,
fentianyou 发表于 2022-4-11 16:21 | 显示全部楼层
SDIO速度这么慢吗
sanxingnote7 发表于 2022-4-11 17:02 | 显示全部楼层
有没有图形化开发工具呢
ghuca 发表于 2022-4-11 17:43 | 显示全部楼层
SDIO接口操作TF卡真是费劲。
yangxiaor520 发表于 2022-4-12 08:04 来自手机 | 显示全部楼层
速度是低了点
 楼主| lazyduck 发表于 2022-5-10 13:57 | 显示全部楼层
ulystronglll 发表于 2022-4-11 15:06
是不是线太长的有干扰呢

不确定,最近没弄了
fuqinyyy 发表于 2022-5-11 07:54 来自手机 | 显示全部楼层
杜邦线不可靠
 楼主| lazyduck 发表于 2022-5-17 17:02 | 显示全部楼层

影响大么?
deliahouse887 发表于 2022-5-28 13:04 | 显示全部楼层
N32G457+SDIO速度还可以吗  
lihuami 发表于 2022-5-28 13:45 | 显示全部楼层
N32G457的资料在哪里下载的
saservice 发表于 2022-5-28 14:34 | 显示全部楼层
N32G457是arm哪个内核的
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:微信公众号《单片机爱好者》

4

主题

34

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部
个人签名:微信公众号《单片机爱好者》

4

主题

34

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部