OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2545|回复: 5

usb模拟U盘同时FATFS写数据

[复制链接]

5

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
112
金钱
112
注册时间
2017-12-21
在线时间
42 小时
发表于 2018-12-28 21:46:18 | 显示全部楼层 |阅读模式
10金钱
使用STM32F103的SPI连接SD卡,每1秒写一次数据,然后还需要随时插上USB线在PC端查看数据。用的UCOSIII,USB和每秒写一次SD卡分为两个任务,现在出现问题是插上USB后PC可以正常查看SD卡,但是数据不能写到SD卡了,跟踪调试,发现在执行8次f_write()后返回值突然不是FR_OK,是FR_INT_ERR,我在论坛里找这方面的资料,原子哥说的参照综合实验
ff_enter(ebookdir.fs);
dir_sdi(&ebookdir,flistbox->findextbl[flistbox->selindex-flistbox->foldercnt]);
ff_leave(ebookdir.fs);

综合实验只在此处有临界代码保护,而f_write()没有保护,我在写数据时,只用到了f_open(),f_close(),f_write();f_sync();f_lseek();
在论坛里我也没有找到相关的关于FATFS和USB互斥访问具体说明

尝试过在f_write()加调度锁,不过不管用,尝试屏蔽USB的任务,只开写数据的任务,数据也不能写到SD卡了,单独写数据的任务我保证是没有问题的。已经测试很长时间了,是加上USB任务以后数据不能写入的。
@正点原子,我已经没有办法了,谢谢了!

最佳答案

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

5

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
112
金钱
112
注册时间
2017-12-21
在线时间
42 小时
 楼主| 发表于 2018-12-28 21:46:19 | 显示全部楼层
回复

使用道具 举报

109

主题

5564

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
10569
金钱
10569
注册时间
2017-2-18
在线时间
1913 小时
发表于 2018-12-30 16:29:27 | 显示全部楼层
帮顶~~
回复

使用道具 举报

5

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
112
金钱
112
注册时间
2017-12-21
在线时间
42 小时
 楼主| 发表于 2019-1-2 12:05:07 | 显示全部楼层
我在原子的综合例程找到了临界保护在ff.c中,现在不插USB可以正常读写,插上USB就跑飞了,请高手帮忙看看。谢谢!
回复

使用道具 举报

5

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
112
金钱
112
注册时间
2017-12-21
在线时间
42 小时
 楼主| 发表于 2019-1-2 12:09:26 | 显示全部楼层
SD卡通过SPI2连接,使用DMA发送接收数据
void  AppTaskUsb (void *p_arg)
{
        u8 offline_cnt=0;
        u8 tct=0;
        u8 USB_STA;
        u8 Divece_STA;
        OS_ERR         err;
        int i=0;
        (void)p_arg;                /* 避免编译器告警 */
        Set_USBClock();
        USB_Interrupts_Config();
        USB_Init();
        bsp_DelayMS(1800);
  while(1)
        {
                bsp_DelayMS(1);                                  
                if(USB_STA!=USB_STATUS_REG)//状态改变了
                {                                                           
                        if(USB_STATUS_REG&0x01)//正在写                  
                        {
                                USB_STATUS_REG&=0xFD;//清除读标记
                        }
                        if(USB_STATUS_REG&0x02)//正在读
                        {
                                USB_STATUS_REG&=0xFE;//清除写标记         
                        }                                                                                                     
                        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计数器
                                bDeviceState=CONFIGURED;
                        }else//没有得到轮询
                        {
                                offline_cnt++;  
                                if(offline_cnt>10)bDeviceState=UNCONNECTED;//2s内没收到在线标记,代表USB被拔出了
                        }
                        USB_STATUS_REG=0;
                }
                LED2_TOGGLE;
                OSTimeDlyHMSM(0, 0, 0, 5, OS_OPT_TIME_HMSM_STRICT,&err);
        }       


}
是不是USB也要做互斥处理
回复

使用道具 举报

4

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
52
金钱
52
注册时间
2020-1-9
在线时间
11 小时
发表于 2020-3-20 19:40:52 | 显示全部楼层
susan01 发表于 2019-1-2 12:09
SD卡通过SPI2连接,使用DMA发送接收数据
void  AppTaskUsb (void *p_arg)
{

你好,我想请教一下,你的互斥处理是怎么实现的?freertos的互斥信号量只能用于任务当中,但是USB读写调用的是中断,谢谢
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-23 07:24

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表