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

使用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不在中断里处理,那就好办多了,随便搞个标志位就好了。
tgw860910 回答时间: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);
        }       
}

huangxuejia-292 回答时间: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
已解决
12下一页

所属标签

相似问题

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版