ding
hao
引用回复: 把CH372在MSP430上转起来了. /****************************************Copyright(c)*************************** ** 公司 ** 部门 **----文件信息---- **文 件 名: CH372usb.c **创 建 人: **最后修改日期: 2005-1-11 13:54 **描 述: CH372芯片硬件驱动 **I D E: IAR Embedded Workbench Version: 3.20A **编 译 器: IAR Embedded Workbench Version: 3.20A **备 注: CHIP CH372 MSP430F149 **--历史版本信息-- ** 创建人: ** 版 本: ** 日 期: ** 描 述: **--当前版本修订-- ** 修改人: ** 日 期: ** 描 述: ********************************************************************************/
#include "resource.h" #include "stddef.h" #include "DummyBus.h" #include "CH372INC.H" #include "delay.h" #include "ch372usb.h" // // 私有 USB ID // CH372芯片的 VID:0X4348 // PID:0X5537 // 根据应用系统的不同改为应用系统的ID // 同时必须改驱动文件的:INF文件 #define APP_USB_VENDOR_ID 0x4348 #define APP_USB_PRODUCT_ID 0x5537 // // USB数据缓冲区 // UCHAR UsbLength; /* USB数据缓冲区中数据的长度 */ UCHAR UsbBuffer[ CH375_MAX_DATA_LEN ]; /* USB数据缓冲区 */ // 读数据 UCHAR USBReadData(void){ UCHAR x; x = ReadChar(DataAddress); Delay2us(); return x; } // 写命令 // 周期不小于4uS, void USBWriteCMD(UCHAR x){ Delay2us(); Delay2us(); WriteChar(x,CMDAddress); Delay2us(); Delay2us(); } // 写数据 void USBWriteData(UCHAR x){ WriteChar(x,DataAddress); Delay2us(); }
// // CH375初始化 //
UCHAR CH375_Init( void ) { UCHAR i; #ifdef APP_USB_VENDOR_ID #ifdef APP_USB_PRODUCT_ID /* 设置外部自定义的USB设备VID和PID,可选操作,不执行该命令则使用默认的VID和PID, 如果设置使用自定义的ID,那么计算机端驱动程序INF安装文件中的"USB\VID_4348& PID_5537"需要进行类似修改 */ USBWriteCMD( CMD_SET_USB_ID ); /* 设置外部自定义的USB设备VID和PID,可选操作 */ USBWriteData( (UCHAR)APP_USB_VENDOR_ID ); /* 写入厂商ID的低字节 */ USBWriteData( (UCHAR)(APP_USB_VENDOR_ID>>8) ); /* 写入厂商ID的高字节 */ USBWriteData( (UCHAR)APP_USB_PRODUCT_ID ); /* 写入产品ID的低字节 */ USBWriteData( (UCHAR)(APP_USB_PRODUCT_ID>>8) ); /* 写入产品ID的高字节 */ #endif #endif
/* 设置USB工作模式, 必要操作 */ 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方式下不应该出现其它中断状态 */ } 转载请知道本人.
ggg[Emot]27[/Emot]
look
kankan
这个论坛真是麻烦
ding
s
hao
麻烦
hao
see
xzcz
kan kan