关于CH378U盘剩余容量的问题

我在调用例程中的查询U盘剩余容量时

/* 检查U盘或者SD卡的剩余空间 */

printf( "DiskQuery: " );

status = CH378DiskQuery( (PUINT32)buf );   /* 查询磁盘剩余空间信息,扇区数 */

printf( "Free Cap: = %ld MB\n", *(PUINT32)buf / ( 1000000 / DEF_SECTOR_SIZE ) );  /* 未用扇区数乘以扇区大小后,除以1M换算为兆字节单位 */

其中CH378DiskQuery函数的内容和你们提供的应该是一致的

UINT8 CH378DiskQuery( PUINT32 DiskFre )  

{

UINT8  s;

//UINT8  c0, c1, c2, c3;


s = CH378SendCmdWaitInt( CMD0H_DISK_QUERY );

if( s == ERR_SUCCESS ) 

{  

xWriteCH378Cmd( CMD00_RD_HOST_REQ_DATA ); /* 写入1个字节命令码 */

xReadCH378Data( );

xReadCH378Data( );       /* 读取2个字节数据长度 */

xReadCH378Data( );   /* CH378_CMD_DATA.DiskQuery.mTotalSector */

xReadCH378Data( );

xReadCH378Data( );

xReadCH378Data( );


c0 = xReadCH378Data( );   /* CH378_CMD_DATA.DiskQuery.mFreeSector */

c1 = xReadCH378Data( );

c2 = xReadCH378Data( );

c3 = xReadCH378Data( );

*DiskFre = c0 | (UINT16)c1 << 8 | (UINT32)c2 << 16 | (UINT32)c3 << 24;

xReadCH378Data( );   /* CH378_CMD_DATA.DiskQuery.mDiskFat */

xEndCH378Cmd( );

}

else 

{

*DiskFre = 0;

}

return( s );

}

其中我在往U盘中写入信息时*DiskFre的值总是不变是不是xReadCH378Data( );有问题呢?我的函数内容是

UINT8 xReadCH378Data( void )

{

return( Spi376Exchange( 0xFF ) );

}


这部分代码没什么问题。你可以把盘剩余空间变化大一点,毕竟你的Free Cap是经过除数运算的。


我把那个磁盘剩余空间从14G变化到9.5G那个读出c0 | (UINT16)c1 << 8 | (UINT32)c2 << 16 | (UINT32)c3 << 24;还是一个固定的值。


执行CMD00_RD_HOST_REQ_DATA之后,把后面执行的11个xReadCH378Data值都打印出来,其中前两个是后续长度,接着4个是磁盘大小,接着4个是剩余扇区,接着1个是文件系统类型。看其他数据都是否正确?


那个后来我又重新试了一下,应该是没有问题了,但是那个我通过沁恒例程里面的计算的总容量是15.06G但是我在电脑上面看到的总容量是14.3G这个正常吗?


大家的计算方法可以略有不同,首先计算扇区有的计算总扇区,有的只计算数据区,换算方式上,有的除以1000,有的除以1024。都是有区别的,大致相同读出的算是正常值。


嗯,那个我如果想要获取文件的时间信息的话是根据EXAM10的例程来改动吗?status = CH378DirInfoRead( 0xFF );   /* 读取当前文件的目录信息FAT_DIR_INFO,将相关数据调到内存中 */这个函数说是会将关数据调到内存中我不是特别清楚那个调入内存中的意思,是缓存到下面这个函数中的buf中去了吗?

CH378ReadReqBlock( buf );

pDir = (P_FAT_DIR_INFO)buf;   /* 当前文件目录信息 */



那个后来我试了一下读取文件的属性,那个我读出DIR_CrtTimeTenth;/* 0DH,文件创建的时间,以0.1秒单位计数 */得到的值为25

DIR_CrtTime;/* 0EH,文件创建的时间 */

得到的值为34596

DIR_CrtDate;/* 10H,文件创建的日期 */

得到的值为18734

请问我需要怎么转换成常用的时间单位呢?


/* Time = (Hour<<11) + (Minute<<5) + (Second>>1) */
#define MAKE_FILE_TIME( h, m, s ) ( (h<<11) + (m<<5) + (s>>1) ) /* 生成指定时分秒的文件时间数据 */
/* 文件日期 UINT16 */
/* Date = ((Year-1980)<<9) + (Month<<5) + Day */
#define MAKE_FILE_DATE( y, m, d ) ( ((y-1980)<<9) + (m<<5) + d ) /* 生成指定年月日的文件日期数据 */


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