大虾们,用CH375主机+ATmega32,并口方式,哥们儿爬着整了两天了,为什么我的库初始化 i = CH375LibInit( )总是通不过啊?我看了好多以前的帖子大家都说是硬件连接可能有问题,我都查了好长时间了,对着PCB和我的电路板挨个引脚量过去都没问题啊。电源管理用的是我们这边常用的片子应当不会有什么问题,上电后25为低,26为高,复位正常,晶振我量过了工作正常。保险起见,我的CH375V是焊在转DIP的板子上的,这是公司设计的应当说不会出现干扰过大的情况。咳,真不知道问题在哪里了。 以下是我的引脚分配: /* 单片机的引脚 CH375芯片的引脚 PINB.4 INT# PORTB.3 A0 PORTB.2 CS# PORTB.1 WR# PORTB.0 RD# PORTA(8位端口) XD7-XD0 PORTC(8位端口) D7-D0 */ PORTA我是暂时没用,PORTC用来同CH375V的数据口相连,xWriteCH375Cmd; xWriteCH375Data; xReadCH375Data这三个函数已经做了相应修改。 最恐怖的是我对CH375V做了测试也不行,我试着用如下程序执行了按位取反指令:CHECK——EXIST(代码06H): xWriteCH375Cmd(6); xWriteCH375Data(170);/*10101010*/ mDelay1uS( ); if (85==xReadCH375Data())/*如果结果为01010101则操作成功*/ { i = CH375LibInit( ); /* 初始化CH375程序库和CH375芯片,操作成功返回0 */ mStopIfError( i ); } else LED_OUT_CON( );/*不成功LED被点亮*/ 结果我的灯是一直亮着的,小弟愚笨,请大家帮忙看看是哪里的问题啊?不胜感激啊!
你用的是什么编译器?还有就是你的库是怎么添加的?
大哥,您终于发话了,我用的是ICCAVR6.31版!我也是一直怀疑我的库添加的不对,或者是程序编译有什么问题。我原来发帖子问过您,我的.hex文件编译过后有44k,在烧写界面下看非FF的有效地址为8K多(我先写了个比较简单的测试程序,但这个界面下打开了只显示了16K),拿到Ultra_Edit13.0下来看问题就来了,整个44K都不是FF,好像都是有效代码似的。是不是ATmega32的FLASH只有32K,所以烧进去的文件不完全啊?(但是单片机挂的灯却又反应正常,就是库初始化不能完成)真是晕死,库CH375HFB.A我是在工程根目录Files文件夹下通过点击右键Add Files...添加的,头文件CH375HFB.H则是以相同的办法在Headers目录下添加的。原来这两个文件都没在该工程文件夹下,后来想了想就又把这两个文件拷贝过来,重新编译但还是不行,大哥,给出出主意吧,多谢啊!再到南京了请你吃饭啊!!
你测试命令都没有通过,可能你的硬件连接还有问题,仔细检查硬件连接,如txd有没接地等;还有你将你的xWriteCH375Cmd; xWriteCH375Data; xReadCH375Data这三个子函数贴出来看一下,是不是时序上的问题。
还有就是你看下你读出来的数据是不是你写进去的数据的取反,如果不是的话,那你就需要检查你的硬件,包括三个读写子函数的时序,还有就是会不会存在什么硬件上面的冲突等等。
添加库文件和头文件不能直接拷贝的,要点击右键Add Files...添加的,你重新打开工程再添加一次看看.
我硬件都查过了,应该没什么问题,就那么几条线嘛!测试命令未成功,初始化库返回是0x81。两位大虾请看一下我的程序,我再检查一下硬件。我平时就是做硬件比较多的,不该出什么弱智错误吧! #include #include #include #include /*#include /* 以下定义的详细说明请看CH375HF9.H文件 */ #define LIB_CFG_FILE_IO 1 /* 文件读写的数据的复制方式,0为"外部子程序",1为"内部复制" */ #define LIB_CFG_INT_EN 0 /* CH375的INT#引脚连接方式,0为"查询方式",1为"中断方式" */
/* 单片机的RAM有限,其中CH375子程序用512字节,剩余RAM部分可以用于文件读写缓冲 */ #define FILE_DATA_BUF_LEN 0x0200 /* 外部RAM的文件数据缓冲区,缓冲区长度不小于一次读写的数据长度 */ /* 如果准备使用双缓冲区交替读写,那么不要定义FILE_DATA_BUF_LEN,而是在参数中指定缓冲区起址,用CH375FileReadX代替CH375FileRead,用CH375FileWriteX代替CH375FileWrite */
#define CH375_INT_WIRE ( PINB & 0x10 ) /* PINB.4, CH375的中断线INT#引脚,连接CH375的INT#引脚,用于查询中断状态 */
#include "CH375HFB.H"
/* 有些AVR单片机提供开放系统总线,那么直接将CH375挂在其系统总线上,以8位I/O方式进行读写 */ /* 虽然Atmega128提供系统总线,不过本例假定不开放系统总线,所以用I/O引脚模拟产生CH375的并口读写时序 */ /* 本例中的硬件连接方式如下(实际应用电路可以参照修改下述3个并口读写子程序) */ /* 单片机的引脚 CH375芯片的引脚 PINB.4 INT# PORTB.3 A0 PORTB.2 CS# PORTB.1 WR# PORTB.0 RD# PORTA(8位端口) XD7-XD0 暂时没用 PORTC(8位端口) D7-D0 */
void mDelay1uS( ) /* 至少延时1mS,根据单片机主频调整 */ { UINT8 i; for ( i = 20; i != 0; i -- ); }
void CH375_PORT_INIT( ) /* 由于使用通用I/O模块并口读写时序,所以进行初始化 */ { PORTD = 0x0F; /*设置8位D口输出为低,D口低4位没用,高4位接了4个不同的指示灯*/ DDRD = 0xFF; /* 设置8位D口为输出 */ PORTA = 0x00; DDRA = 0xFF; /* 设置8位A口为输出 */ DDRC = 0x00; /* 设置8位C口为输入 */ PORTB = 0x07; /* 设置CS,WR,RD默认为高电平 */ DDRB = 0x0F; /* 设置CS,WR,RD,A0为输出,设置INT#为输入 */ }
void xWriteCH375Cmd( UINT8 mCmd ) /* 外部定义的被CH375程序库调用的子程序,向CH375写命令 */ { mDelay1uS( ); /* 至少延时1uS */ /* *(volatile unsigned char *)CH375_CMD_PORT_ADDR = mCmd; 通过并口直接读写CH375而非普通I/O模拟 */ PORTB |= 0x08; /* 输出A0=1 */ PORTC = mCmd; /* 向CH375的并口输出数据 */ DDRC = 0xFF; /* 并口D0-D7输出 */ PORTB &= 0xF9; /* 输出有效写控制信号, 写CH375芯片的命令端口, A0=1; CS=0; WR=0; RD=1; */ DDRC = 0xFF; /* 该操作无意义,仅作延时,CH375要求读写脉冲宽度大于100nS */ PORTB |= 0x07; /* 输出无效的控制信号, 完成操作CH375芯片, A0=1; CS=1; WR=1; RD=1; */ DDRC = 0x00; /* 禁止数据输出 */ PORTB &= 0xF7; /* 输出A0=0; 可选操作 */ mDelay1uS( ); /* 至少延时2uS */ }
void xWriteCH375Data( UINT8 mData ) /* 外部定义的被CH375程序库调用的子程序,向CH375写数据 */ { /* *(volatile unsigned char *)CH375_DAT_PORT_ADDR = mData; 通过并口直接读写CH375而非普通I/O模拟 */ PORTC = mData; /* 向CH375的并口输出数据 */ DDRC = 0xFF; /* 并口D0-D7输出 */ PORTB &= 0xF1; /* 输出有效写控制信号, 写CH375芯片的数据端口, A0=0; CS=0; WR=0; RD=1; */ DDRC = 0xFF; /* 该操作无意义,仅作延时,CH375要求读写脉冲宽度大于100nS */ PORTB |= 0x07; /* 输出无效的控制信号, 完成操作CH375芯片, A0=0; CS=1; WR=1; RD=1; */ DDRC = 0x00; /* 禁止数据输出 */ mDelay1uS( ); /* 至少延时1.2uS */ }
UINT8 xReadCH375Data( void ) /* 外部定义的被CH375程序库调用的子程序,从CH375读数据 */ { UINT8 mData; /* mData = *(volatile unsigned char *)CH375_DAT_PORT_ADDR; 通过并口直接读写CH375而非普通I/O模拟 */ mDelay1uS( ); /* 至少延时1.2uS */ DDRC = 0x00; /* 数据输入 */ PORTB &= 0xF2; /* 输出有效读控制信号, 读CH375芯片的数据端口, A0=0; CS=0; WR=1; RD=0; */ DDRC = 0x00; /* 该操作无意义,仅作延时,CH375要求读写脉冲宽度大于100nS */ mData = PINC; /* 从CH375的并口PC输入数据 */ PORTB |= 0x07; /* 输出无效的控制信号, 完成操作CH375芯片, A0=0; CS=1; WR=1; RD=1; */ return( mData ); }
/* 延时指定毫秒时间,根据单片机主频调整,不精确 */ void mDelaymS( UINT8 ms ) { UINT16 i; while ( ms -- ) for ( i = 2500; i != 0; i -- ); }
#define LED_OUT_ERR( ) { PORTD |= 0x10;} /* PORTD.4 高电平为输出方向RED */ #define LED_OUT_INT( ) { PORTD |= 0x80; } /* PORTD.7 低电平驱动LED显示YELLOW*/ #define LED_OUT_CON( ) { PORTD |= 0x40; } /* PORTD.6 低电平驱动LED显示BLUE*/ #define LED_OUT_OK( ) {PORTD |= 0x20;} /*PORTD.5 成功GREEN*/ #define LED_OUT_CLR( ) {PORTD = 0x00;} /*PORTD.X 成功CLEAR*/ /* 检查操作状态,如果错误则显示错误代码并停机 */ void mStopIfError( UINT8 iError ) { if ( iError == ERR_SUCCESS ) return; /* 操作成功 */ while ( 1 ) { LED_OUT_ERR( ); /* 红色LED常亮 */ mDelaymS( 20 ); LED_OUT_CLR( ); mDelaymS( 20 ); } }
void main( ) { UINT8 i, c, SecCount; UINT16 NewSize, count; /* 因为RAM容量有限,所以NewSize限制为16位,实际上如果文件较大,应该分几次读写并且将NewSize改为UINT32以便累计 */ UINT8 *pCodeStr; mDelaymS( 100 );/*开机延时等待初始化*/ CH375_PORT_INIT( ); LED_OUT_INT( ); mDelaymS( 200 ); /*初始化通过后黄灯亮1秒*/ LED_OUT_CLR( ); /* xWriteCH375Cmd(CMD_CHECK_EXIST); xWriteCH375Data(170); mDelay1uS( ); if (ERR_CH375_ERROR==xReadCH375Data()) {*/ i = CH375LibInit( ); /* 初始化CH375程序库和CH375芯片,操作成功返回0 */ while (0x82==i) LED_OUT_CON( ); mStopIfError(i);/*目前错误代码0x81,指示为硬件连接错误*/
}
测试命令不成功,那库初始化当然不会成功了,你看下你测试命令返回的是什么数据,仔细检查你的硬件,这个是你硬件的问题
蒙大家指导,经过3天奋战问题解决了。库的初始化和识别U盘的插拔都没有问题了,这个帖子也该收了,呵呵!说来问题出的很简单,我用的ATmega32出厂的时候JTEG熔丝位都是被使能了的,而这里我用的是PC口做数据端口,因此导致此口数据不正常。烧写程序的过程中取消对该熔丝位的选择就可以了。可能也是我太笨了,呵呵,但希望其他刚开始用ATmega系列的朋友能够引起注意。 另外,要开始往U盘里写数据了,希望公司可以提供有一些有关磁盘文件格式的资料,呵呵,怕把U盘写坏呢,还得好好研究研究。