使用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任务以后数据不能写入的。
@正点原子,我已经没有办法了,谢谢了!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
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也要做互斥处理
一周热门 更多>