ch375初始话问题

我用的是atmega128单片机,编译环境是avr studio。用的是CH375HFD.A库文件。usb芯片是ch375b。

在对ch375初始化时,程序运行到函数 CH375LibInit( void )停止。通过跟踪,发现是运行到函数当中retrun (CH375Init( ))时,程序没了反应。

我看资料上写CH375HFD.A只支持ch375a芯片。但是ch375b是ch375a的升级版本,宽电压,论坛里说支持ch375a的软件和硬件。 我在论坛里查找这个问题的资料,有和我同样问题的,但是都没有给出解答。

不是的,也支持CH375B,在软件和硬件上基本和CH375A兼容. CH375Init( ))过不了,你先做测试命令,发0X06命令,关于测试命令如何做 请看说明书. 如果无法通过,一般是硬件问题,或者时序不对.


我发了测试命令,读到的返回值都是输入数据的取反。那么 xWriteCH375Cmd(0x06); xWriteCH375Data(0xaa); c=xReadCH375Data(); 这三个自己改写的函数应该没有问题了吧,硬件也应该不会有问题吧。


硬件连接基本没问题 把这三个函数贴出来看看 另,如果不是最新的库,则升级库(V3.5)


void xWriteCH375Cmd( UINT8 mCmd ) /* 外部定义的被CH375程序库调用的子程序,向CH375写命令 */ { mDelay1uS( ); mDelay1uS( ); /* 至少延时1uS */ /* *(volatile unsigned char *)CH375_CMD_PORT_ADDR = mCmd; 通过并口直接读写CH375而非普通I/O模拟 */ Usb_command(); /* 输出A0=1 */ PORTA_OUT(); /* 并口D0-D7输出 */ PORTA = mCmd; /* 向CH375的并口输出数据 */ //PORTB &= 0xF9; /* 输出有效写控制信号, 写CH375芯片的命令端口, A0=1; CS=0; WR=0; RD=1; */ Usb_clearcs(); //cs=0 Clearwrite(); //WR=0 Setread(); //RD=1 DDRA = 0xFF; /* 该操作无意义,仅作延时,CH375要求读写脉冲宽度大于100nS */ //PORTB |= 0x07; /* 输出无效的控制信号, 完成操作CH375芯片, A0=1; CS=1; WR=1; RD=1; */ Setwrite(); //WR=1 Usb_setcs(); //CS=1 Usb_setcs(); //无效操作,用于延时 DDRA = 0x00; /* 禁止数据输出 */ Usb_data(); /* 输出A0=0; 可选操作 */ mDelay1uS( ); mDelay1uS( ); /* 至少延时2uS */ }

void xWriteCH375Data( UINT8 mData ) /* 外部定义的被CH375程序库调用的子程序,向CH375写数据 */ { Setread(); /* *(volatile unsigned char *)CH375_DAT_PORT_ADDR = mData; 通过并口直接读写CH375而非普通I/O模拟 */ Usb_data(); //A0=0 PORTA = mData; /* 向CH375的并口输出数据 */ PORTA_OUT(); /* 并口D0-D7输出 */ //PORTB &= 0xF1; /* 输出有效写控制信号, 写CH375芯片的数据端口, A0=0; CS=0; WR=0; RD=1; */ Usb_clearcs(); //CS=0; Clearwrite(); //WR=0 Setread(); //RD=1 DDRA = 0xFF; /* 该操作无意义,仅作延时,CH375要求读写脉冲宽度大于100nS */ //PORTB |= 0x07; /* 输出无效的控制信号, 完成操作CH375芯片, A0=0; CS=1; WR=1; RD=1; */ Usb_setcs(); Setwrite(); Setwrite(); DDRA = 0x00; /* 禁止数据输出 */ mDelay1uS( ); /* 至少延时1.2uS */ }

UINT8 xReadCH375Data( void ) /* 外部定义的被CH375程序库调用的子程序,从CH375读数据 */ { UINT8 mData; Setwrite(); /* mData = *(volatile unsigned char *)CH375_DAT_PORT_ADDR; 通过并口直接读写CH375而非普通I/O模拟 */ mDelay1uS( ); /* 至少延时1.2uS */ Usb_data(); PORTA_IN(); /* 数据输入 */ PORTA=0XFF; //设置上拉电阻 //PORTB &= 0xF2; /* 输出有效读控制信号, 读CH375芯片的数据端口, A0=0; CS=0; WR=1; RD=0; */ Usb_clearcs(); Setwrite(); Clearread(); Clearread(); /* 该操作无意义,仅作延时,CH375要求读写脉冲宽度大于100nS */ mData = PINA; /* 从CH375的并口PA输入数据 */ //PORTB |= 0x07; /* 输出无效的控制信号, 完成操作CH375芯片, A0=0; CS=1; WR=1; RD=1; */ Usb_setcs(); Setread(); return( mData ); }


你首先看下你编译的时候出现了多少个警告,如果警告多于20个的话,那就说明库没有链接进去,如何链接的话,你可以到置顶帖里面看下如何链接的,实际上我们的库的初始化就做了测试命令以及初始化磁盘缓冲区。如果库链接有问题的话,才会出现你说的死在库里面


我想用扇区读写方式。因为atmega128有4k的ram。于是我就把文件缓冲区长度定义成了0x0800。出现了我说得问题。改成0x0200后问题解决了。只是现在为何文件缓冲区长度会有影响还不是很明白。可以看一下我定义的缓冲区 #define DISK_BASE_BUF_ADDR 0x0200 #define FILE_DATA_BUF_ADDR 0x0A00 #define DISK_BASE_BUF_LEN 2048 #define FILE_DATA_BUF_LEN 0x0400


总共4KB的RAM,磁盘缓冲区占了2K,若文件缓冲区再占0x800,则RAM全被占用完。那么堆栈空间放在哪呢? 当调用函数的时候程序肯定跑飞了。


多谢各位大侠的指点。已经明白了。程序可以成功执行了。


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