susan01 发表于 2018-12-17 16:09:16

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

使用STM32F1能实现USB和fatfs同时访问SD卡吗,想实现1S写一次数据到SD卡,同时实现随时插USB线连接电脑查看数据,分开都已实现,一起的话就是实现不了。请各位大神指点指点,给个思路就行。万分感谢!

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核,怎么样算是同时访问?;P
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

已解决
页: [1] 2
查看完整版本: 使用STM32F1能实现USB和fatfs同时访问SD卡吗