我用的IAR版本是V4.1A,使用CH375LIB/MSP430/FILEB8/EXAM6/CH375HFT.C并链接CH375LIB/MSP430/FILEBF_V41/CH375HFF.H和CH375HFF.R43,在CH375LIB/MSP430/FILEB8/EXAM6/CH375HFT.C里有两句宏定义: #define CH375_CMD_PORT_ADDR 0XBDF1 #define CH375_DAT_PORT_ADDR 0XBCF0 请问这两句定义端口I/O地址的语句是否跟硬件连接方式有关,我自己画的图,跟这个程序中介绍的连接方式不一样,我用的是P5.5 INT#;P7.2 RD#;P7.3 A0;P5.6 CS#;P5.7 WR#;P8:D7~D0.自己修改了CH375HFT.C的几个子函数的操作,编译报了三个警告,上电后串口送81H错误码。
定义地址是采用的总线方式操作CH375,你如果不是挂在总线上则使用模拟I/O方式(模拟并口的时序来操作CH375).以下是51下的模拟IO的例子,需要你去移植. void CH375_PORT_INIT( ) /* 由于使用通用I/O模块并口读写时序,所以进行初始化 */ { CH375_CS = 1; CH375_WR = 1; CH375_RD = 1; CH375_A0 = 0; P0 = 0xFF; /* 并口输入 */ }
void xWriteCH375Cmd( UINT8 mCmd ) /* 外部定义的被CH375程序库调用的子程序,向CH375写命令 */ { mDelay1_2uS( ); mDelay1_2uS( ); /* 至少延时1uS */ P0 = mCmd; /* 向CH375的并口输出数据 */ CH375_A0 = 1; CH375_CS = 0; CH375_WR = 0; /* 输出有效写控制信号, 写CH375芯片的命令端口 */ CH375_CS = 0; /* 该操作无意义,仅作延时,CH375要求读写脉冲宽度大于100nS */ CH375_WR = 1; /* 输出无效的控制信号, 完成操作CH375芯片 */ CH375_CS = 1; CH375_A0 = 0; P0 = 0xFF; /* 禁止数据输出 */ mDelay1_2uS( ); mDelay1_2uS( ); /* 至少延时2uS */ }
void xWriteCH375Data( UINT8 mData ) /* 外部定义的被CH375程序库调用的子程序,向CH375写数据 */ { P0 = mData; /* 向CH375的并口输出数据 */ CH375_A0 = 0; CH375_CS = 0; CH375_WR = 0; /* 输出有效写控制信号, 写CH375芯片的数据端口 */ CH375_CS = 0; /* 该操作无意义,仅作延时,CH375要求读写脉冲宽度大于100nS */ CH375_WR = 1; /* 输出无效的控制信号, 完成操作CH375芯片 */ CH375_CS = 1; P0 = 0xFF; /* 禁止数据输出 */ mDelay1_2uS( ); /* 至少延时1.2uS */ }
UINT8 xReadCH375Data( void ) /* 外部定义的被CH375程序库调用的子程序,从CH375读数据 */ { UINT8 mData; mDelay1_2uS( ); /* 至少延时1.2uS */ P0 = 0xFF; /* 输入 */ CH375_A0 = 0; CH375_CS = 0; CH375_RD = 0; /* 输出有效写控制信号, 读CH375芯片的数据端口 */ CH375_CS = 0; /* 该操作无意义,仅作延时,CH375要求读写脉冲宽度大于100nS */ mData = P0; /* 从CH375的并口输入数据 */ CH375_RD = 1; /* 输出无效的控制信号, 完成操作CH375芯片 */ CH375_CS = 1; return( mData ) }
就是说如果不使用总线的话,这两句宏定义:#define CH375_CMD_PORT_ADDR 0XBDF1 #define CH375_DAT_PORT_ADDR 0XBCF0;就没什么用是吧,我找了下这两句,在.H文件里面没有,我想是不是在.R43这个库里面有使用这两句的 另外我在CH375HFT.C对上述几个函数也进行了修改(我用的是MSP430F5438),可还是上电就报81H误码!
那你就按照1楼写的三个读写子函数去做下测试命令。 xWriteCH375Cmd(0X06); xWriteCH375Data(0X55); i = xReadCH375Data(); 正常的返回的i = 0XAA
EXAM6本身就是模拟I/O例程,里面有现成的接口子程序,程序中有这样的注释:“由于MSP430不开放系统总线,所以用I/O引脚模拟产生CH375的并口读写时序”,自行确认一下实际的硬件定义是否正确 那2个地址的宏定义可以忽略
我用3楼的办法试下来结果是7A,这个是说明硬件的问题还是软件的问题? 另外,我按照DATASHEET在ACT#接了个LED,可是上电发现这个LED并不亮,是不是说明这块芯片有问题?
你去检测下数据线的高4位有问题。还有检查下你读取数据的时序上面有没有问题
不用刚开始就怀疑芯片有问题,先假设芯片是好的. 读出的数据为7A,然后你再测试以下 xWriteCH375Cmd(0X06); xWriteCH375Data(0Xaa); i = xReadCH375Data(); 看读出的数据是多少.如果读出的数据为X5的话,(X为未知数据). 检查高位的IO设置是否正确.时序在1楼已经贴出,务必按照这个来写.
芯片不会轻易的就坏掉的.ACT#在做主机时,只有检测到有设备插入才会输出低电平.你目前模式都没有设置成功连接的LED当然不会亮.你首先需要解决端口配置,配置完后去检查对应的信号线是否可以正常跳变.端口配置成功后去替换时序中对应的端口操作.
非常感谢各位,我在改xReadCH375Data()留下了个小尾巴,"mData=P4IN"没有改成“mData=P8IN”因为我是用P8连D7~D0的,非常感谢各位的耐心指导,这个问题解决了,但是后面又有个问题了,就是当我插上U盘时发现ACT#灯亮了,但是串口显示的是OpenError:82,晕,?
你的USB口的电源是怎么设计的?你检查下USB口插上U盘后的VCC电压是多少,务必保证USB口插上U盘后VCC在4.5V以上.另外,UD+,UD-两根信号线上不要串电阻.
CH375DiskReady( )函数有没有通过?正常应该返回 0,如果返回0x82,主要检查CH375和U盘连接的那部分,以及你的中断引脚的定义以及连接 有没有问题。。。
我的USB插上U盘后电压在4.788V,CH375DiskReady( )函数估计没有通过,因为串口一连报了五个“READY?”然后就是“OpenError:82”.我想问一下,这个中断引脚有什么作用吗?例程里面可没见着开这个中断,也没有写中断的服务程序啊。
(1)如果不定义中断引脚,那么需要定义:xReadCH375Cmd,即读取命令口的数据,用于查询是否有中断产生,参考头文件中xQueryInterrupt,CH375DiskReady需要查询中断,即涉及到中断引脚或xReadCH375Cmd,程序中没有二者之一,会出错。 (2)最好保证电压在5V,有的U盘电压偏低一点,工作就不正常了
非常感谢SCM,修改了中断输入,不过这一次出来了错误码是Error:2C,这个是什么错误?
另外我在编译的时候出现了下述警告,不知道有没有影响: usb_wread1.C Warning[Pe226]: invalid format string conversion F:\海洋工程\MSP430\软件设计\usb\usb_wread1.C 341 Linking 编译器指明这个警告是在这里产生: for ( i=0; i!=mCmdParam.ByteRead.mByteCount; i++ ) printf( "%C", mCmdParam.ByteRead.mByteBuffer[i] ); /* 显示读出的字符 */
Warning[w6]: Type conflict for external/entry "mCmdParam", in module CH375MAI against external/entry in module usb_wread1; class/struct/union field names do not match: Other16 vs Query /* In module CH375MAI: */ CMD_PARAM_I mCmdParam; typedef CMD_PARAM CMD_PARAM_I; typedef union _CMD_PARAM CMD_PARAM; /* In module usb_wread1: */ CMD_PARAM_I mCmdParam; typedef CMD_PARAM CMD_PARAM_I; typedef union _CMD_PARAM CMD_PARAM;
Warning[w35]: There is more than one definition for the struct/union type with tag '_CMD_PARAM'; class/struct/union field names do not match: Query vs Other16 union _CMD_PARAM /* Elements: 19, Bytes: 30 */ { struct /* Elements: 1, Bytes: 30 */ { UINT8 mBuffer[30]; } Other; struct /* Elements: 4, Bytes: 14 */ { UINT32 mReserved; UINT32 mTotalSector; UINT32 mFreeSector; UINT8 mDiskFat; } Query; struct /* Elements: 1, Bytes: 30 */ { UINT8 mPathName[30]; } Open; struct Enumer; struct /* Elements: 1, Bytes: 1 */ { UINT8 mUpdateLen; } Close; struct Create; struct Erase; struct /* Elements: 4, Bytes: 10 */ { UINT32 mFileSize; UINT16 mFileDate; UINT16 mFileTime; UINT8 mFileAttr; } Modify; struct /* Elements: 1, Bytes: 4 */ { UINT32 mSectorOffset; } Locate; struct /* Elements: 1, Bytes: 1 */ { UINT8 mSectorCount; } Read; struct Write; struct /* Elements: 3, Bytes: 10 */ { UINT8 mSectorCount; UINT8 mReserved[7]; PUINT8 mDataBuffer; } ReadX; struct WriteX; struct /* Elements: 1, Bytes: 4 */ { UINT32 mDiskSizeSec; } DiskSize; struct /* Elements: 1, Bytes: 4 */ { UINT32 mByteOffset; } ByteLocate; struct /* Elements: 2, Bytes: 30 */ { UINT8 mByteCount; UINT8 mByteBuffer[29]; } ByteRead; struct ByteWrite; struct /* Elements: 3, Bytes: 6 */ { UINT8 mSaveVariable; UINT8 mReserved[3]; PUINT8 mBuffer; } SaveVariable; union /* Elements: 2, Bytes: 22 */ { struct /* Elements: 10, Bytes: 22 */ { UINT32 mCBW_Sig; UINT32 mCBW_Tag; UINT8 mCBW_DataLen; UINT8 mCBW_DataLen1; UINT8 mCBW_DataLen2; UINT8 mCBW_DataLen3; UINT8 mCBW_Flag; UINT8 mCBW_LUN; UINT8 mCBW_CB_Len; UINT8 mCBW_CB_Buf[6]; } mCBW; struct /* Elements: 5, Bytes: 14 */ { UINT32 mCSW_Sig; UINT32 mCSW_Tag; UINT32 mCSW_Residue; UINT8 mCSW_Status; UINT8 mReserved; } mCSW; } BOC; }; typedef unsigned char UINT8; typedef unsigned long UINT32; typedef unsigned short UINT16; typedef unsigned char * PUINT8; union _CMD_PARAM /* Elements: 19, Bytes: 30 */ { struct /* Elements: 1, Bytes: 30 */ { UINT8 mBuffer[30]; } Other; struct /* Elements: 1, Bytes: 30 */ { UINT16 mBuffer16[15]; } Other16; struct /* Elements: 1, Bytes: 28 */ { UINT32 mBuffer32[7]; } Other32; struct /* Elements: 4, Bytes: 14 */ { UINT32 mReserved; UINT32 mTotalSector; UINT32 mFreeSector; UINT8 mDiskFat; } Query; struct /* Elements: 1, Bytes: 30 */ { UINT8 mPathName[30]; } Open; struct Enumer; struct /* Elements: 1, Bytes: 1 */ { UINT8 mUpdateLen; } Close; struct Create; struct Erase; struct /* Elements: 6, Bytes: 16 */ { UINT32 mFileSize; UINT16 mFileDate; UINT16 mFileTime; UINT8 mFileAttr; UINT8 mReserved[3]; UINT32 mOldSize; } Modify; struct /* Elements: 1, Bytes: 4 */ { UINT32 mSectorOffset; } Locate; struct /* Elements: 6, Bytes: 10 */ { UINT8 mSectorCount; UINT8 mActualCount; UINT8 mLbaCount; UINT8 mRemainCount; UINT32 mLbaStart; PUINT8X mDataBuffer; } Read; struct /* Elements: 7, Bytes: 14 */ { UINT8 mSectorCount; UINT8 mActualCount; UINT8 mLbaCount; UINT8 mAllocCount; UINT32 mLbaStart; PUINT8X mDataBuffer; UINT32 mSaveValue; } Write; struct /* Elements: 1, Bytes: 4 */ { UINT32 mDiskSizeSec; } DiskSize; struct /* Elements: 1, Bytes: 4 */ { UINT32 mByteOffset; } ByteLocate; struct /* Elements: 2, Bytes: 30 */ { UINT8 mByteCount; UINT8 mByteBuffer[29]; } ByteRead; struct ByteWrite; struct /* Elements: 3, Bytes: 6 */ { UINT8 mSaveVariable; UINT8 mReserved[3]; PUINT8X mBuffer; } SaveVariable; union /* Elements: 2, Bytes: 22 */ { struct /* Elements: 9, Bytes: 22 */ { UINT32 mCBW_Sig; UINT32 mCBW_Tag; UINT8 mCBW_DataLen; UINT8 mCBW_DataLen1; UINT16 mCBW_DataLen2; UINT8 mCBW_Flag; UINT8 mCBW_LUN; UINT8 mCBW_CB_Len; UINT8 mCBW_CB_Buf[6]; } mCBW; struct /* Elements: 5, Bytes: 14 */ { UINT32 mCSW_Sig; UINT32 mCSW_Tag; UINT32 mCSW_Residue; UINT8 mCSW_Status; UINT8 mReserved; } mCSW; } BOC; }; typedef unsigned char UINT8; typedef unsigned short UINT16; typedef unsigned long UINT32; typedef unsigned char * PUINT8X; Total number of errors: 0 Total number of warnings: 3