急,ch376t使用SPI操作U盘创建文件写数据问题

下面应用函数中调用的全是原厂库函数

运行结果是U盘中创建的文件中只有一个无关的乱码字符

调试发现在字节写的函数中,第一个中断返回就是0x14,而非0x1e,直接跳过了写数据过程

U盘的连接检测,初始化什么的都能成功,创建文件也能成功,写数据问题究竟是什么原因,望解释,谢谢。

void CheckUsbConnect(void)
{
    static u16 u16_file_id = 0;
    static u32 u32_line_id = 0;
    static u08 TarFileName[64];

    if (CH376DiskConnect() != USB_INT_SUCCESS)
    {
        return;
    }
   
    if (CH376DiskMount() != USB_INT_SUCCESS)
    {
        return;
    }
   
    if (u32_line_id == 0)
    {
        sprintf((char*)TarFileName, "\\AIB%05d.TXT", u16_file_id); 
        memcpy(pst_m_manual->mu08_made_core, TarFileName, 20); 

        
        if (CH376FileCreate((u08*)TarFileName) != USB_INT_SUCCESS)
        {
            return;
        }
    }
    else
    {
        CH376WriteVar32(VAR_START_CLUSTER, 0); 
        
        if (CH376FileOpen(TarFileName) != USB_INT_SUCCESS)
        {
            return;
        }
       
        if (CH376ByteLocate(u32_line_id * 8) != USB_INT_SUCCESS)
        {
            return;
        }
        u32_line_id ++;
        if (u32_line_id >= 10000)
        {
            u32_line_id = 0;
            u16_file_id ++;
        }
        pst_m_using->ms16_cycle = u32_line_id;
    }
   
    if (CH376ByteWrite(pst_m_manual->mu08_made_date, 8, NULL) != USB_INT_SUCCESS)
    {
        return;
    }
   
    if (CH376FileClose(TRUE) != USB_INT_SUCCESS)
    {
        return;
    }
}

 

有个别曾今问到这个问题的,但都没具体的解决方案下文,望知情者帮忙!


底层读写数据、命令函数需要保证间隔,建议命令与数据间隔2us,数据与数据间隔1us。此外,CH376GetIntStatus函数内部可以再次执行一次CMD01_GET_STATUS命令,看第二次的返回值?


我使用的是ARM的LPC1768的标准SPI,有发送和接收完成的标志判断,当然按您提示,额外加上了延时,同时状态读取也额外增加了一次,但还是一样的,从未获得字节写的中断状态0x1E,也未能正确实现数据的写入。还有其他可能原因么?

UINT8 CH376GetIntStatus( void )
{
UINT8 s;

xWriteCH376Cmd( CMD01_GET_STATUS );
s = xReadCH376Data( );
xEndCH376Cmd( );
xWriteCH376Cmd( CMD01_GET_STATUS );
s = xReadCH376Data( );
xEndCH376Cmd( );
return( s );
}

 


储能团队 - 副本.jpg


底层读写数据、命令函数需要保证间隔,建议命令与数据间隔2us,数据与数据间隔1us。此外,CH376GetIntStatus函数内部可以再次执行一次CMD01_GET_STATUS命令,看第二次的返回值?

请麻烦继续帮我看看,谢谢。


请把CS设置成软件方式,在xEndCh376Cmd()中拉高CS,命令开始拉低CS,中间数据传输CS必须始终为低。


请把CS设置成软件方式,在xEndCh376Cmd()中拉高CS,命令开始拉低CS,中间数据传输CS必须始终为低。

 

我不是太清楚这样改有什么不一样,用标准SPI自动的,我测量中断信号也是有的。我不至于标准的能用不用,而用模拟SPI吧?


CS拉低的第一个字节默认为命令,后续是数据,CS拉高表示命令的结束。一般单片机的硬件SPI也是可以设置成CS软件控制的。


CS拉低的第一个字节默认为命令,后续是数据,CS拉高表示命令的结束。一般单片机的硬件SPI也是可以设置成CS软件控制的。

下面测试代码运行结果,5秒执行一次该函数,上下对应:

status:   0x15 0x14 0x03 0x1e 0x16 0x45

对应list:0x01 0x10 0x04 0x02 0x02 0x04/0x08

看能不能看出问题?

 

void CheckUsbConnect(s16* status)
{
static u16 u16_file_id = 0;
static u32 u32_line_id = 0;
static u08 TarFileName[64];
static u08 delay = 0;
if (delay ++ < 5) return;
delay = 0;

 

pst_m_rd->mu32_bat_list = 0 | (1 << 0);
*status = CH376DiskConnect();
if (*status != USB_INT_SUCCESS)//20
{
return;
}

pst_m_rd->mu32_bat_list = 0 | (1 << 1);
*status = CH376DiskMount();
if (*status != USB_INT_SUCCESS)//20
{
return;
}

if (u32_line_id == 0)
{
sprintf((char*)TarFileName, "\\AIB%05d.TXT", u16_file_id);
memcpy(pst_m_manual->mu08_made_core, TarFileName, 20);

pst_m_rd->mu32_bat_list = 0 | (1 << 2);
*status = CH376FileCreate((u08*)TarFileName);
if (*status != USB_INT_SUCCESS)
{
return;
}
}
else
{while(1);

CH376WriteVar32(VAR_START_CLUSTER, 0);

*status = CH376FileOpen(TarFileName);
if (*status != USB_INT_SUCCESS)
{
return;
}

*status = CH376ByteLocate(u32_line_id * 8);
if (*status != USB_INT_SUCCESS)
{
return;
}
u32_line_id ++;
if (u32_line_id >= 10000)
{
u32_line_id = 0;
u16_file_id ++;
}
}

pst_m_rd->mu32_bat_list = 0 | (1 << 3);
*status = CH376ByteWrite(pst_m_manual->mu08_made_core, strlen((const char*)pst_m_manual->mu08_made_core), NULL);
if (*status != USB_INT_SUCCESS)
{
return;
}

pst_m_rd->mu32_bat_list = 0 | (1 << 4);
*status = CH376FileClose(TRUE);
if (*status != USB_INT_SUCCESS)
{
return;
}
}


CS拉低的第一个字节默认为命令,后续是数据,CS拉高表示命令的结束。一般单片机的硬件SPI也是可以设置成CS软件控制的。

从流程上分析,感觉每次发指定命令后,随后若干次获取的中断状态都是SUCCESS会导致带过好几条指令的执行,然后迟滞的才会获取到之前指令对应的实际状态,但已经是在下一个指令发送后,就错乱了?什么原因?

另外,最后一个0x45是什么状态?


什么意思?返回状态错位了吗?0x45不是一个有效的状态。

tel:025-52638376


只有登录才能回复,可以选择微信账号登录