这是从读写U盘的程序中修改出来的,就是一个简单的发送数据给PC机的程序,单片机用的是MSP430F149,CH375工作电压接的3.3V,调试工具用的是DEBUG372.EXE,直接就点击使用了(也不知道是不是还要安装驱动什么的)但是显示无法打开设备,郁闷呀,小弟刚学,比较菜,请各位大虾多多指教啊 谢谢了
#include #include #include #include "CH375HF8.H"
/* 以下定义的详细说明请看CH375HF8.H文件 */ #define LIB_CFG_FILE_IO 1 /* 文件读写的数据的复制方式,0为"外部子程序",1为"内部复制" */ #define LIB_CFG_INT_EN 0 /* CH375的INT#引脚连接方式,0为"查询方式",1为"中断方式" */
#define CH375_CMD_PORT_ADDR 0xBDF1 /* CH375命令端口的I/O地址 */ #define CH375_DAT_PORT_ADDR 0xBCF0 /* CH375数据端口的I/O地址 */ #define CH375_INT_WIRE ( P1IN & 0x10 ) /* P1.4, CH375的中断线INT#引脚,连接CH375的INT#引脚,用于查询中断状态 */
/* 由于MSP430不开放系统总线,所以用I/O引脚模拟产生CH375的并口读写时序 */ /* 本例中的硬件连接方式如下(实际应用电路可以参照修改下述3个并口读写子程序) */ /* MSP430单片机的引脚 CH375芯片的引脚 P1.4 INT# P1.7 A0 P1.6 WR# P1.5 RD# CS 接地 P4(8位端口) D7-D0 */
void mDelaymS( UINT16 ms ) { UINT16 i; while ( ms -- ) for ( i = 2000; i != 0; i -- ); }
void CH375_PORT_INIT( ) /* 由于使用通用I/O模块并口读写时序,所以进行初始化 */ { P1OUT = ( P1OUT | 0x60 ) & 0x7F; /* 设置A0为低电平,CS,WR,RD默认为高电平 */ P1DIR = ( P1DIR | 0xE0 ) & 0xEF; /* 设置INT#为输入,设置CS,WR,RD,A0为输出 */ P4DIR = 0; /* 设置8位并口输入 */ }
void xWriteCH375Cmd( UINT8 mCmd ) /* 外部定义的被CH375程序库调用的子程序,向CH375写命令 */ { _NOP( ); _NOP( ); _NOP( ); /* 至少延时2uS,实际由于模拟I/O较慢而只需少量延时 */ P1DIR |= 0x70; /* 设置P1口A0,CS,WR,RD为输出控制信号 */ P4OUT = mCmd; /* 向CH375的并口输出数据 */ P4DIR = 0xFF; /* 写操作所以数据输出 */ P1OUT |= BIT7; /* 指向CH375芯片的命令端口, A0(P1.7)=1; */ P1OUT &= 0xBF; /* 输出有效写控制信号, 写CH375芯片的命令端口, A0(P1.7)=1; WR=(P1.6)=0; RD(P1.5)=1; */ _NOP( ); /* 该操作无意义,仅作延时,CH375要求读写脉冲宽度为100nS */ P1OUT |= 0x60; /* 输出无效的控制信号, 完成操作CH375芯片, A0(P1.7)=0; WR=(P1.6)=1; RD(P1.5)=1; */ //P1OUT &= 0x6F; /* 输出A0(P1.3)=0; 可选操作 */ P4DIR = 0; /* 禁止数据输出 */ _NOP( ); _NOP( ); _NOP( ); _NOP( ); _NOP( ); /* 至少延时2uS,实际由于模拟I/O较慢而只需少量延时 */ }
void xWriteCH375Data( UINT8 mData ) /* 外部定义的被CH375程序库调用的子程序,向CH375写数据 */ { P4OUT = mData; /* 向CH375的并口输出数据 */ P4DIR = 0xFF; /* 写操作所以数据输出 */ P1OUT &= 0xBF; /* 输出有效写控制信号, 写CH375芯片的数据端口, A0(P1.7)=0; WR=(P1.6)=0; RD(P1.5)=1; */ _NOP( ); /* 该操作无意义,仅作延时,CH375要求读写脉冲宽度为100nS */ P1OUT |= 0x60; /* 输出无效的控制信号, 完成操作CH375芯片, A0(P1.3)=7; WR=(P1.6)=1; RD(P1.5)=1; */ P4DIR = 0; /* 禁止数据输出 */ _NOP( ); /* 至少延时1uS,实际由于模拟I/O较慢而不一定有必要 */ }
UINT8 xReadCH375Data( void ) /* 外部定义的被CH375程序库调用的子程序,从CH375读数据 */ { UINT8 mData; _NOP( ); /* 至少延时1uS,实际由于模拟I/O较慢而不一定有必要 */ P4DIR = 0; /* 读操作所以数据输入 */ P1OUT &= 0x5F; /* 输出有效读控制信号, 读CH375芯片的数据端口, A0(P1.7)=0; WR=(P1.6)=1; RD(P1.5)=0; */ _NOP( ); /* 该操作无意义,仅作延时,CH375要求读写脉冲宽度为100nS */ mData = P4IN; /* 从CH375的并口输入数据 */ P1OUT |= 0x60; /* 输出无效的控制信号, 完成操作CH375芯片, A0(P1.7)=0; WR=(P1.6)=1; RD(P1.5)=1; */ return( mData ); }
void CH375_INIT() { unsigned char i; xWriteCH375Cmd(CMD_CHECK_EXIST);/* 测试CH375是否正常工作 */ xWriteCH375Data( 0x55 ); /* 写入测试数据 */ i = ~ 0x55; /* 返回数据应该是测试数据取反 */ if ( xReadCH375Data( ) != i ) { /* CH375不正常 */ for ( i=80; i!=0; i-- ) { xWriteCH375Cmd( CMD_RESET_ALL ); /* 多次重复发命令,执行硬件复位 */ xReadCH375Data( ); } xWriteCH375Cmd( 0 ); mDelaymS( 5); /* 延时50ms */ }
/* 设置USB工作模式, 必要操作 */ xWriteCH375Cmd( CMD_SET_USB_MODE ); xWriteCH375Data( 2 ); /* 设置为使用内置固件的USB设备方式 */ for ( i=100; i!=0; i-- ) { /* 等待操作成功,通常需要等待10uS-20uS */ if ( xReadCH375Data( ) == CMD_RET_SUCCESS ) break; } /* if ( i==0 ) { CH372/CH375存在硬件错误 }; */ /* 下述启用中断,假定CH375连接在INT0 */ P1IES |= BIT4; /* 置外部信号为低电平触发 */ P1IFG &=~(BIT4); /* 清中断标志 */ P1IE |=BIT4; /* 允许CH375中断 */ }
/* CH375中断服务程序 */ #pragma vector=PORT1_VECTOR __interrupt void p1int(void) { unsigned char InterruptStatus; unsigned char i; unsigned char buffer[]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; xWriteCH375Cmd( CMD_GET_STATUS ); /* 获取中断状态并取消中断请求 */ InterruptStatus = xReadCH375Data( ); /* 获取中断状态 */ xWriteCH375Cmd( CMD_WR_USB_DATA7 ); /* 向USB端点2的发送缓冲区写入数据块 */ for ( i = 0; i < 64; i ++ ) xWriteCH375Data( buffer[ i ] ); /* 数据取反后返回,由计算机应用程序测试数据是否正确 */ if (InterruptStatus==USB_INT_EP2_IN){ /* 批量数据发送成功 */ xWriteCH375Cmd( CMD_UNLOCK_USB ); /* 释放当前USB缓冲区 */ } }
main(){ mDelaymS(2); CH375_PORT_INIT(); CH375_INIT(); while (1); }