我用了别人的程序是用的P3口 因为我P3口已经用了 就用P2口,程序我只是简单的对换,P3->P2 可是换上之后怎么都检测不到设备,换回来又可以了 程序中还需要改动什么? #define CH375_CMD_PORT_ADDR 0xBDF1 /* CH375命令端口的I/O地址 */ #define CH375_DAT_PORT_ADDR 0xBCF0 /* CH375数据端口的I/O地址 */ 这两句话是不是对换不成功的原因??还是其他的原因?? 着急!谢谢达人解答。
1、硬件上修改以后,软件地址有没有修改呢? 2、P2口是不是总线口,如果不是,那么不能通过总线地址操作CH372了,得改成模拟I/O的方式
谢谢回答 1,硬件是只是把P3口的八位改成P2口对应的DO-D7的八位,程序也都改了P3换成P2了 2,MSP430没有开放总线,各个口都是I/O口,我对MSP430的理解不知道对了吧,还是不知道换过来为啥就不行了。 下边只是P3口的程序
由于MSP430不开放系统总线,所以用I/O引脚模拟产生CH375的并口读写时序 本例中的硬件连接方式如下(实际应用电路可以参照修改下述3个并口读写子程序) MSP430单片机的引脚 CH375芯片的引脚 P1.4 INT# #83 P1.3 A0 #84 P1.2 CS# #85 P1.1 WR# #86 P1.0 RD# #87 P3(8位端口) D7-D0
-------------------------------------------------------------------*/ #include #include "CH375INC.H" #define CH375_CMD_PORT_ADDR 0xBDF1 /* CH375命令端口的I/O地址 */ #define CH375_DAT_PORT_ADDR 0xBCF0 /* CH375数据端口的I/O地址 */
/*-------------精确延时----------------------------------*/ #define CPU_F ((double)1000000) //主频 #define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0)) #define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))
// 私有 USB ID // CH372芯片的 VID:0X4348 PID:0X5537 // 根据应用系统的不同改为应用系统的ID // 同时必须改驱动文件的:INF文件 #define APP_USB_VENDOR_ID 0x4348 #define APP_USB_PRODUCT_ID 0x5537
typedef unsigned char UCHAR; //00-FF
UCHAR UsbLength; /* USB数据缓冲区中数据的长度 */ UCHAR UsbBuffer[ CH375_MAX_DATA_LEN ]; /* USB数据缓冲区 */
/* 由于使用通用I/O模块并口读写时序,所以进行初始化 */ void CH375_PORT_INIT( ) { P1OUT = ( P1OUT | 0x07 ) & 0xF7; /* 设置A0为低电平,CS,WR,RD默认为高电平 */ P1DIR = ( P1DIR | 0x0F ) & 0xEF; /* 设置INT#为输入,设置CS,WR,RD,A0为输出*/ P3DIR = 0; /* 设置8位并口输入 */ }
/* 向CH375写命令,外部定义的被CH375程序库调用的子程序,向CH375写命令 */ void USBWriteCMD( UCHAR mCmd ) { _NOP( ); _NOP( );_NOP( );/* 至少延时2uS,实际由于模拟I/O较慢而只需少量延时 */ P1DIR |= 0x0F; /* 设置P1口A0,CS,WR,RD为输出控制信号 0000 1111*/ P3OUT = mCmd; /* 向CH375的并口输出数据 */ P3DIR = 0xFF; /* 写操作所以数据输出 */ P1OUT |= 0x0F; /* 指向CH375芯片的命令端口, A0(P1.3)=1; 0000 1111*/ P1OUT &= 0xF9; /* 输出有效写控制信号1111 1001,写CH375芯片的命令端口, A0(P1.3)=1; CS(P1.2)=0; WR=(P1.1)=0; RD(P1.0)=1; */ _NOP( ); /* 该操作无意义,仅作延时,CH375要求读写脉冲宽度为100nS */ P1OUT |= 0x07; /* 完成操作CH375芯片, A0(P1.3)=1; CS(P1.2)=1; WR=(P1.1)=1; RD(P1.0)=1; */ P1OUT &= 0xF7; /* 输出A0(P1.3)=0; 可选操作。 和上句话一起使控制端口恢复到初始状态XXXX 0111*/ P3DIR = 0; /* 禁止数据输出 */ _NOP( ); _NOP( ); _NOP( ); _NOP( ); _NOP( ); /* 至少延时2uS,实际由于模拟I/O较慢而只需少量延时 */ }
/* 外部定义的被CH375程序库调用的子程序,向CH375写数据 */ void USBWriteData( UCHAR mData ) { P3OUT = mData; /* 向CH375的并口输出数据 */ P3DIR = 0xFF; /* 写操作所以数据输出 */ P1OUT &= 0xF1; /* 输出有效写控制信号, 写CH375芯片的数据端口, A0(P1.3)=0; CS(P1.2)=0; WR=(P1.1)=0; RD(P1.0)=1; */ _NOP( ); /* 该操作无意义,仅作延时,CH375要求读写脉冲宽度为100nS */ P1OUT |= 0x07; /* 输出无效的控制信号, 完成操作CH375芯片, A0(P1.3)=0; CS(P1.2)=1; WR=(P1.1)=1; RD(P1.0)=1; */ P3DIR = 0; /* 禁止数据输出 */ _NOP( ); /* 至少延时1uS,实际由于模拟I/O较慢而不一定有必要 */ }
/* 外部定义的被CH375程序库调用的子程序,从CH375读数据 */ UCHAR USBReadData( void ) { UCHAR mData; _NOP( ); /* 至少延时1uS,实际由于模拟I/O较慢而不一定有必要 */ P3DIR = 0; /* 读操作所以数据输入 */ P1OUT &= 0xF2; /* 输出有效读控制信号, 读CH375芯片的数据端口, A0(P1.3)=0; CS(P1.2)=0; WR=(P1.1)=1; RD(P1.0)=0; */ _NOP( ); /* 该操作无意义,仅作延时,CH375要求读写脉冲宽度为100nS */ mData = P4IN; /* 从CH375的并口输入数据 */ P1OUT |= 0x07; /* 输出无效的控制信号, 完成操作CH375芯片, A0(P1.3)=0; CS(P1.2)=1; WR=(P1.1)=1; RD(P1.0)=1; */ return( mData ); }
/* CH375初始化子程序 */ void CH375_Init( ) {
USBWriteCMD(CMD_SET_USB_MODE ); USBWriteData( 2 ); /* 设置为使用内置固件的USB设备方式 */ // 等待操作成功,通常需要等待10uS-20uS */ // if ( i == 0 ) { CH372/CH375芯片内部或者物理连接存在硬件错误 }; /*for ( i=100; i!=0; i-- ){ if ( USBReadData( ) == CMD_RET_SUCCESS ){ return true; // 初始化USB成功 } } return false; // 初始化USB失败*/
}
/*========================================================================================== // 函数名: mCH375Interrupt // 输 入: 无 // 输 出: 无 // 说 明: CH375服务程序,CH375的INT#引脚连接单片机的输入引脚P2.3 // 当程序不使用中断接收功能时使用本函数 // 当有P2.3有下降沿时调用本函数处理USB的务 // 作 者: // 时 间: 2005.1.15 // 测 试: //==========================================================================================*/ void mCH375Interrupt( void ) { UCHAR IntStatus; UCHAR cnt; UCHAR * buf; USBWriteCMD( CMD_GET_STATUS ); /* 获取中断状态并取消中断请求 */ IntStatus = USBReadData( ); /* 获取中断状态 */ if ( IntStatus == USB_INT_EP2_OUT ) { /* 批量端点下传成功,接收到命令包 */ USBWriteCMD( CMD_RD_USB_DATA ); /* 从当前USB中断的端点缓冲区读取数据块,并释放缓冲区 */ UsbLength = cnt = USBReadData( ); /* 首先读取后续数据长度 */ if ( cnt ) { /* 接收到数据放到缓冲区中 */ buf = UsbBuffer; /* 指向缓冲区 */ do { *buf = USBReadData( ); /* 接收命令包的数据 */ buf ++; } while ( -- cnt ); } else return ; /* 长度为0,没有数据,在某些应用中也可以将长度0定义为一种特殊命令 */ /* 分析接收到的数据并处理,此处略去,下面演示回传数据 */ USBWriteCMD(CMD_WR_USB_DATA7); /* 向USB端点2的发送缓冲区写入数据块 */ cnt = UsbLength; USBWriteData( cnt ); /* 首先写入后续数据长度 */ if ( cnt ) { /* 将缓冲区中的数据发出 */ buf = UsbBuffer; /* 指向缓冲区 */ do { USBWriteData( *buf ); /* 写入数据到CH375 */ buf ++; } while ( -- cnt ); } } else if ( IntStatus == USB_INT_EP2_IN ) { /* 批量数据发送成功,状态包已发送 */ /* 如果还有数据需要接着发送,可在此通过CMD_WR_USB_DATA7命令写入,参考前面的回传 */ USBWriteCMD( CMD_UNLOCK_USB ); /* 释放当前USB缓冲区,收到上传成功中断后,必须解锁USB缓冲区,以便继续收发 */ } else if ( IntStatus == USB_INT_EP1_IN ) { /* 中断数据发送成功,本程序未用到 */ USBWriteCMD( CMD_UNLOCK_USB ); /* 释放当前USB缓冲区 */ } /* 内置固件的USB方式下不应该出现其它中断状态 */ }
void main(void ) { //delay_ms(50); CH375_Init( ); USBWriteCMD( CMD_WR_USB_DATA7 ); USBWriteData( 5 ); USBWriteData(0X0F); USBWriteData(0XF0); USBWriteData(0X1F); USBWriteData(0XF1); USBWriteData(0XFF); }
楼主啊,我也跟你一样的问题,你解决了么,为什么换了端口,怎么也不行,就必须是P1或者P2为控制口,P3为数据口,不能改成别的端口,这是为什么?方便联系么,我的QQ314729653