本帖最后由 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包在标准外设库中对应的值,我还没找到,需要花些时间。 例程先上传,有兴趣的可以玩玩试试。
|
@蜗牛的房子 :是我分享的代码吗? 如果是的话,那么杜邦线引发问题的可能比较大
我用N32G457QEL_EVB V1.1(板子上有SD卡槽)的板子运行这个代码,往模拟U盘写入数据时能到350KB/s左右,从模拟U盘读出数据到PC主机30几兆的文件瞬间完成。ST的板子跑这个代码,也是350KB/s左右。所以我认为应该是使用杜邦线去连接SD卡座不可靠或者你也可以尝试换张SD卡试试