lazyduck 发表于 2022-2-25 09:31

01基于N32G457+SDIO+USB的读卡器

本帖最后由 lazyduck 于 2022-2-25 09:43 编辑

#申请原创# @21小跑堂 年前申请的,审核很快。打电话确认、发货,没两天就拿到了板子,做工还可以。型号是:N32G45XVL-STB,放个图:

然后是做什么,因为这段时间对USB感兴趣,所以想做一些基于USB接口的HID或者MASS设备。不过拿到资料以后,发现厂家的例程里已经做好了,这方面赞一个!放个USB方面例程的截图:

先说下芯片以及厂家给的例程和库函数吧。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卡相关的函数放在这个位置即可。如图: 几天后,TF卡座到了,焊接,开始搞。 以我自己搭建的工程模板为基础,先把USB相关的文件添加进来(复制USB例程里的文件),然后是SD卡的C文件(复制SDIO例程里面的sdio_sdcard.c文件)。修改相应函数,主要部分如下:
/*******************************************************************************
* Function Name: MAL_Init
* Description    : Initializes the Media on the Nations
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
uint16_t MAL_Init(uint8_t lun)
{
//    FLASH_Unlock();
                uint32_t testResult = 0;
    Status = SD_Init(0, 3, 4);
    if (Status != SD_OK)
    {
      log_debug("SD Card initialization failed!\r\n");
      return testResult;
    }
    return MAL_OK;
}
/*******************************************************************************
* Function Name: MAL_Write
* Description    : Write sectors
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
uint16_t MAL_Write(uint8_t lun, uint32_t Memory_Offset, uint32_t *Writebuff, uint16_t Transfer_Length)
{
    uint16_t i;
    switch (lun)
    {
    case 0:
                        SD_WriteDisk((uint8_t *)Writebuff, Memory_Offset>>9, 1);
                        Status = SD_WaitWriteOperation();
                        while (SD_GetStatus() != SD_TRANSFER_OK)
                                        ;
      break;
    case 1:
      break;
    default:
      return MAL_FAIL;
    }
    return MAL_OK;
}

/*******************************************************************************
* Function Name: MAL_Read
* Description    : Read sectors
* Input          : None
* Output         : None
* Return         : Buffer pointer
*******************************************************************************/
uint16_t MAL_Read(uint8_t lun, uint32_t Memory_Offset, uint32_t *Readbuff, uint16_t Transfer_Length)
{
    uint16_t i;
    switch (lun)
    {
      case 0:
                                        SD_ReadDisk((uint8_t *)Readbuff, Memory_Offset>>9, 1);
                                        Status = SD_WaitReadOperation();
                                        while (SD_GetStatus() != SD_TRANSFER_OK)
                                                        ;
          break;
      case 1:
          break;
      default:
          return MAL_FAIL;
    }
    return MAL_OK;
}

/*******************************************************************************
* Function Name: MAL_GetStatus
* Description    : Get status
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
uint16_t MAL_GetStatus (uint8_t lun)
{
    SD_CardInfo SDCardInfo;          // Information for memory card, part of DSR
                SD_GetCardInfo(&SDCardInfo);
                if (lun == 0)
    {
      Mass_Block_Count = SDCardInfo.CardCapacity/512;
      Mass_Block_Size =512;
      Mass_Memory_Size = SDCardInfo.CardCapacity;
      return MAL_OK;
    }
    return MAL_FAIL;
}关键函数就这几个,当然,调试过程不是一帆风顺,函数MAL_Write和MAL_Read花了点时间。
HAL库下,读写BLOCK时,送入的参数是BLOCK的编号和个数,而这里送入的参数是字节的偏移量-Memory_Offset,以及字节个数-Transfer_Length,这一点要注意。 同时,读操作或者写操作之后要有个等待完成的操作,否则会有异常。险些弄坏我一张TF卡! Status = SD_WaitReadOperation();
                            while (SD_GetStatus() != SD_TRANSFER_OK)
                                       ;
最后,就没啥了。接线如下:
看下读写速度:
      尴尬的85KB/S!      即便是全速USB2.0,我用STM32做的话,SDIO接口操作TF卡,也能到几百KB,这么低不是硬件问题。      HAL库里面, 有两个地方要修改,一个是堆栈的大小,另一个是每次传输的PACKET包大小。这里的话,堆栈我知道,但是这个PACKET包在标准外设库中对应的值,我还没找到,需要花些时间。      例程先上传,有兴趣的可以玩玩试试。

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

fuqinyyy 发表于 2022-5-11 07:54
杜邦线不可靠

影响大么?

deliahouse887 发表于 2022-5-28 13:04

N32G457+SDIO速度还可以吗

lihuami 发表于 2022-5-28 13:45

N32G457的资料在哪里下载的

saservice 发表于 2022-5-28 14:34

N32G457是arm哪个内核的
页: [1] 2 3 4
查看完整版本: 01基于N32G457+SDIO+USB的读卡器