调用CH375的程序库问题

想做一个项目:用89S52单片机通过CH375,将采样数据保存在U盘里

下载了CH375LIB.zip来使用

有个问题想请问一下: CH375HF4.lib、 CH375HF5.lib 、CH375HF6.lib中的子程序是不是一样?从CH375HF.pdf中没有说明白。 我现在是IO总线方式,是不是应该调用CH375HF5.lib,库里是不是没有CH375_RD_DAT()、CH375_WR_CMD()、CH375_WR_CMD()这几个函数,这几个要自己编写?函数名字是不是一定要取成示例中的xWriteCH375Cmd()、xWriteCH375Data()、xReadCH375Data()? 在调用CH375HF4.lib的示例程序中,没有看到这几个函数?是不是库里已经有了?自己只要定义端口地址(CH375_CMD_PORT CH375_DAT_PORT)就可以了?

1、LIB4、LIB6、FILELIBA是总线的,定义命令口、数据地址即可,参考例程;LIB5、LIBC是I/O模拟总线的,那么需要提供硬件接口程序,参考CH375HF.PDF中的“6.4 硬件I/O接口子程序” 2、89S52的代码空间和RAM均不够用,资源占用“不少于4KB 到8KB的程序空间,不少于600 字节的随机存储器RAM。对于MCS-51 单片机,600 字节的RAM 包括不少于75 字节的内部RAM 和530 字节的外部RAM”


谢谢 MCU会选择程序空间更大的89C55,RAM的话会扩展62256

现在调用CH375HF5.lib,使用过程中,有问题: 1. CH375Init()调用,返回成功(0x00) ;应用程序等待U盘接入,进行查询xQueryInterrupt(),当U盘接入后,能够读出DISK_CONNECT事件。此后CH375DiskReady(),返回ERR_SUCCESS。接着执行CH375FileOpen()时,总是返回ERR_BPB_ERROR(0xA1)? 这是为什么?将U盘重新格式化(FAT16和FAT32都试过),问题依旧 2. 应用程序是否要对CH375LibConfig进行初始化?CH375DiskStatus和CH375LibConfig全局变量什么时候可以进行查询?CH375Init()成功以后就可以吗?


1、测试一下磁盘缓冲区DISK_BASE_BUF,连续写入数据,再连续读出,比对数据是否一致 2、应用程序不需要对CH375LibConfig进行初始化,用户一般情况下不需要用到这2个变量,你的目的是什么?


1,返回X0A1的话,那么你需要去检查下你的DISK-BASE-BUF这个缓冲区,你有没有定义这个缓冲区,如果没有定义的话就会返回这个错误的。 2,不需要对我们的变量进行任何的初始化,库的变量在库初始化的时候已经全部初始化过了,不需要你去初始化。


谢谢二位回答

1.问题依旧

在头文件中,定义了: #define DISK_BASE_BUF_LEN 512 extern unsigned char DISK_BASE_BUF[DISK_BASE_BUF_LEN]

并且在我的应用程序中,一开始增加了一段程序来测试 DISK_BASE_BUF for(i=0;i<512;i++) DISK_BASE_BUF[i] = 0x55; 再通过串口将数据发送上来,数据正确

但是操作CH375FileOpen()时,还是返回0xA1 并且我在调用CH375FileOpen()之前,查询了一下CH375DiskStatus,值为0x03,文件系统不支持

2.只是想看一下CH375LibConfig、CH375DiskStatus和CH375LibConfig的值,来验证一下我的操作是否正确。应用程序本身并没有需要这些变量的地方,特地问问。是不是这些变量已经过库函数后,就已经有值了


库函数会自动的将这些变量赋值,U盘的供电为5V?不能太低,有没有换过U盘测试一下?


for(i=0;i<512;i++) DISK_BASE_BUF = 0x55; 这个是什么意思呢? 另外i是什么类型的变量?


应该是 DISK_BASE_BUF[i]

unsigned int i

串口中测试数组中512个数据都正确

为什么我写了中括号i,发表回复后没有了?


这可能是网页有问题造成的.


就是将DISK_BASE_BUF中512个变量全部赋值为0x55,然后通过串口发送查看是否正确。


CH375DiskStatus,值为0x03是正确的.你在CH375FileOpen()之后查看一下CH375vDiskFat, extern UINT8D CH375vDiskFat; /* 逻辑盘的FAT标志:1=FAT12,2=FAT16,3=FAT32 */


CH375vDiskFat = 0


库读取的DBR扇区数据有误,用下面的程序直接读取物理扇区: /* CH375ReadBlock( )为直接读取物理扇区的函数,其参数借用ReadX,但参数被重定义: ReadX.mReserved[ 1 ]:为准备读取的扇区数 ReadX.mReserved[ 3 ] - ReadX.mReserved[ 6 ]:为绝对扇区号 ReadX.mDataBuffer:为缓冲区地址 */ printf("read form LBA: 0x00000000\n"); mCmdParam.ReadX.mReserved[ 1 ] = 0x01; /* 扇区数 */ mCmdParam.ReadX.mReserved[ 3 ] = 0x00; /* 绝对扇区号 */ mCmdParam.ReadX.mReserved[ 4 ] = 0x00; /* 绝对扇区号 */ mCmdParam.ReadX.mReserved[ 5 ] = 0x00; /* 绝对扇区号 */ mCmdParam.ReadX.mReserved[ 6 ] = 0x00; /* 绝对扇区号 */ mCmdParam.ReadX.mDataBuffer = &FILE_DATA_BUF[ 0 ]; /* 缓冲区 */ i = CH375ReadBlock( ); mStopIfError( i ); for( count = 0; count < CH375vSectorSize; count ++ ) { if( count % 16 == 0 ) printf("\n"); printf("%X ", (unsigned short)FILE_DATA_BUF[ count ]); } 另,网上下载一个软件WinHex,它可以直接察看U盘的物理扇区,对比一下二者的数据是否一致


奇怪! 如果不用 #define DISK_BASE_BUF_LEN 512 extern unsigned char DISK_BASE_BUF[DISK_BASE_BUF_LEN] 而是定义成指针形式 extern unsigned char xdata *pDISK_BASE_BUF; unsigned char xdata Disk_Buf[ 512 ]

在应用程序中打开文件之前,pDISK_BASE_BUF = Disk_Buf; 然后就能够成功执行CH375FileOpen()

按照说明,这两种方式应该是等价的?


你是不是修改库的头文件?这是不允许的,DISK_BASE_BUF是定义在XDATA区的,怎么被你定义在DATA区了,请恢复。


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