你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

使用STM32F1能实现USB和fatfs同时访问SD卡吗

[复制链接]
susan01 提问时间:2018-12-17 16:09 /
使用STM32F1能实现USB和fatfs同时访问SD卡吗,想实现1S写一次数据到SD卡,同时实现随时插USB线连接电脑查看数据,分开都已实现,一起的话就是实现不了。请各位大神指点指点,给个思路就行。万分感谢!
收藏 评论10 发布时间:2018-12-17 16:09

举报

10个回答
Dandjinh 回答时间:2018-12-19 10:49:11
可以实现,如果USB是MSC的话,USB的处理就是在中断里,访问SD卡的时候一定要在SD卡空闲的时候,通过不断查询标志位实现。如果FatFS使用了DMA读写sd卡,还要保证DMA和SD的优先级在USB之上。
如果是USB不在中断里处理,那就好办多了,随便搞个标志位就好了。
DavidTan 回答时间:2018-12-19 10:21:51
搞不懂,难道SD卡还想接F1上的两种接口?
用SPI接SD卡,用USB接PC,不就能独立了么?
废鱼 回答时间:2018-12-19 10:32:39
楼主是想用ST做USB读卡器的功能,楼主搜一下关于这方面的资料吧。
cruelfox 回答时间:2018-12-19 15:16:13
概念都不清楚,STM32就一个CPU核,怎么样算是同时访问?
USB Device只是一个外设,CPU访问它,也访问SDIO外设。
fatfs是一套软件程序库,CPU执行其中的功能,间接对SDIO外设进行访问。

你想的功能,是软件上如何规划的问题。两个部分都想用SDIO,那么得有互斥的机制。可以考虑作为RTOS的两个任务来处理。
creep 回答时间:2018-12-19 23:25:56
学习了。              
susan01 回答时间:2018-12-22 12:24:46
谢谢各位的回复,尤其谢谢@cruelfox ,按照你的方法我使用正点原子的代码做了个测试,用的UCOSIII,有盘符但是盘是空的。麻烦@cruelfox给我看看,谢谢!static void AppTaskUpdate(void *p_arg)
{
        OS_ERR         err;
        CPU_SR_ALLOC();
        u8 offline_cnt=0;
        u8 USB_STA=0;
        u8 Divece_STA=0;
        u8 i=0,err_back=0;
        u16 werr=0,rerr=0;
        (void)p_arg;  
        USB_GPIO_init();       
        Set_USBClock();
        USB_Interrupts_Config();
        USB_Init();
  while(1)
        {
                if(bDeviceState==CONFIGURED)
                {
                OSMutexPend (&TEST_MUTEX,0,OS_OPT_PEND_BLOCKING,0,&err);        //请求互斥量
                bsp_DelayMS(5);               
                        if(USB_STATUS_REG&0x03)//USB读写
                        {
                                err_back=0x80;
                        }else break;//USB空闲退出                          
                if(USB_STA!=USB_STATUS_REG)//状态改变
                {                                                           
                        if(USB_STATUS_REG&0x01)  //正在写
                        {
                                USB_STATUS_REG&=0xFD;//清除读标志
                        }
                        if(USB_STATUS_REG&0x02)//正在读
                        {
                                USB_STATUS_REG&=0xFE;//清除写标志
                        }                                                                                           
                        if(USB_STATUS_REG&0x04)
                        {
                                werr++;
                        }                                                                                                                
                        if(USB_STATUS_REG&0x08)
                        {
                                rerr++;
                        }                                                                                                                  
                        USB_STA=USB_STATUS_REG;//记录最后标志
                }
                if(Divece_STA!=bDeviceState)
                {
                        Divece_STA=bDeviceState;
                }
                i++;
                if(i==200)//200ms
                {
                        i=0;
                        if(USB_STATUS_REG&0x10)
                        {
                                offline_cnt=0;//USB连接,清除offline_cnt
                                bDeviceState=CONFIGURED;
                        }else//ûÓеõ½ÂÖѯ
                        {
                                offline_cnt++;  
                                if(offline_cnt>10)bDeviceState=UNCONNECTED;//2s没有在线标志标志USB拔出
                        }
                        if(err_back&0x80)
                        {
                                err_back++;
                                if((err_back&0x07)==0x07)
                                {
                                        err_back=0;         
                                }
                        }
                        USB_STATUS_REG=0;
                }
        OSMutexPost(&TEST_MUTEX,OS_OPT_POST_NONE,&err);                               
        }
                LED2_TOGGLE;
                OSTimeDlyHMSM(0, 0, 0, 5, OS_OPT_TIME_HMSM_STRICT,&err);
        }       
}

wujique 回答时间:2018-12-22 14:58:23
你这个问题应该这样描述:

USB程序将SD卡用作MSC,
然后,还有一个程序要1S钟写一次SD卡数据。

需要修改USB例程。
有两种思路:
1. 定时写SD卡也用USB例程操作SD卡的接口。
2. 在SD卡驱动中添加互斥,并且要梳理两者逻辑。

个人觉得有点复杂,因为USB通信对时序要求挺高的。

susan01 回答时间:2018-12-28 17:14:12
@Dandjinh 你好,我的USB是MSC,USB的处理在中断里,采用是SPI连接SD卡的,使用了DMA但是没有使用DMA中断,您说的查询标志位,在USB里怎么实现查询标志位?在中断里查询?
susan01 回答时间:2019-1-8 17:03:57
已解决
BG4RFF 回答时间:2019-1-22 17:07:42

我也在搞这个,能否指点一下
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版