打印
[N32G45x]

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

[复制链接]
4376|64
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lazyduck|  楼主 | 2022-2-25 09:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
AD, gp, pi, IO, sd
本帖最后由 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[0] = SDCardInfo.CardCapacity/512;
        Mass_Block_Size[0] =  512;
        Mass_Memory_Size[0] = 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包在标准外设库中对应的值,我还没找到,需要花些时间。
      例程先上传,有兴趣的可以玩玩试试。


N32G457 TF卡-读卡器.rar

7.65 MB

使用特权

评论回复
评论
lazyduck 2022-6-8 18:52 回复TA
@蜗牛的房子 :是我分享的代码吗? 如果是的话,那么杜邦线引发问题的可能比较大 
蜗牛的房子 2022-5-24 10:17 回复TA
我用N32G457QEL_EVB V1.1(板子上有SD卡槽)的板子运行这个代码,往模拟U盘写入数据时能到350KB/s左右,从模拟U盘读出数据到PC主机30几兆的文件瞬间完成。ST的板子跑这个代码,也是350KB/s左右。所以我认为应该是使用杜邦线去连接SD卡座不可靠或者你也可以尝试换张SD卡试试 
沙发
lazyduck|  楼主 | 2022-2-25 09:45 | 只看该作者
有敏感字,分了几次才编辑完,心好累!!!

使用特权

评论回复
板凳
WoodData| | 2022-2-25 11:31 | 只看该作者
做的不错,支持一下

使用特权

评论回复
地板
wifi99| | 2022-2-25 15:59 | 只看该作者
辛苦了,下载来,学习学习

使用特权

评论回复
5
lazyduck|  楼主 | 2022-3-1 10:07 | 只看该作者
wifi99 发表于 2022-2-25 15:59
辛苦了,下载来,学习学习

多谢捧场

使用特权

评论回复
6
tifmill| | 2022-4-1 12:45 | 只看该作者
有兴趣的,谢谢楼主分享的。

使用特权

评论回复
7
jimmhu| | 2022-4-1 14:12 | 只看该作者
spi速度也比这个快吧

使用特权

评论回复
8
kkzz| | 2022-4-1 16:26 | 只看该作者
只适合小范围保存吧  

使用特权

评论回复
9
ulystronglll| | 2022-4-11 15:06 | 只看该作者
是不是线太长的有干扰呢

使用特权

评论回复
10
vivilyly| | 2022-4-11 15:38 | 只看该作者
这个做的非常棒,

使用特权

评论回复
11
fentianyou| | 2022-4-11 16:21 | 只看该作者
SDIO速度这么慢吗

使用特权

评论回复
12
sanxingnote7| | 2022-4-11 17:02 | 只看该作者
有没有图形化开发工具呢

使用特权

评论回复
13
ghuca| | 2022-4-11 17:43 | 只看该作者
SDIO接口操作TF卡真是费劲。

使用特权

评论回复
14
yangxiaor520| | 2022-4-12 08:04 | 只看该作者
速度是低了点

使用特权

评论回复
15
lazyduck|  楼主 | 2022-5-10 13:57 | 只看该作者
ulystronglll 发表于 2022-4-11 15:06
是不是线太长的有干扰呢

不确定,最近没弄了

使用特权

评论回复
16
fuqinyyy| | 2022-5-11 07:54 | 只看该作者
杜邦线不可靠

使用特权

评论回复
17
lazyduck|  楼主 | 2022-5-17 17:02 | 只看该作者

影响大么?

使用特权

评论回复
18
deliahouse887| | 2022-5-28 13:04 | 只看该作者
N32G457+SDIO速度还可以吗  

使用特权

评论回复
19
lihuami| | 2022-5-28 13:45 | 只看该作者
N32G457的资料在哪里下载的

使用特权

评论回复
20
saservice| | 2022-5-28 14:34 | 只看该作者
N32G457是arm哪个内核的

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

4

主题

34

帖子

1

粉丝