tceic.com
学霸学习网 这下你爽了
当前位置:首页 >> >>

CH372基本读写程序(51单片机)

USB 学习笔记 4:CH372 基本读写程序(51 单片机) 基本读写程序( 单片机) :
USB 学习笔记 4:CH372 基本读写程序(51 单片机) 基本读写程序( 单片机) : CH372 官网上已经给出了 CH372 的测试程序, 下面是我在官方网站的 测试程序的基础上进行整理和梳理。CH375 支持 USB-HOST 主机方式和 USBDEVICE/SLAVE 设备方式。,而 CH375 从设备方式与 CH372 的功能程序是一 样的,于是两者作为从机芯片是一样的。 CH372 内置了 USB 通讯中的底层协议,具有省事的内置固件模式和 灵活的外置固件模式。在内置固件模式下,CH372 自动处理默认端点 0 的所有 事务,本地端单片机只要负责数据交换,所以单片机程序非常简洁。在外置固件 模式下,由外部单片机根据需要自行处理各种 USB 请求,从而可以实现符合各 种 USB 类规范的设备。为了简单起见,一般 PC 机与单片机通信使用内置固件 模式,下面程序也是基于内置固件模式的。 #pragma NOAREGS 定要加上 #include <REG52.H> #include "CH375INC.H" //禁止编译器使用绝对寄存器寻址,一 //51 单片机头文件 //CH372/CH375 头文件

/////////////////////////////////////////////// //说明: CH372 总线地址,这个是按照学习笔记 1 总线扩展方式定的 // 采用别的方式,地址另外设定 /////////////////////////////////////////////// unsigned char volatile xdata CH375_CMD_PORT _at_ 0x03F1; unsigned char volatile xdata CH375_DAT_PORT _at_ 0x03F0; /*********************延时程序********************/ /////////////////////////////////////////////// //函数:delay2us //说明:延时 2us //入口:无 //返回:无 /////////////////////////////////////////////// void { delay2us( ) unsigned char i;

for ( i = 2; i != 0; i -- ); } /////////////////////////////////////////////// //函数:delay50ms //说明:延时 50ms //入口:无 //返回:无 /////////////////////////////////////////////// void Delay50ms( ) { unsigned char i, j; for ( i="200"; i!=0; i-- ) for ( j="250"; j!=0; j-- ); } /*********************基本读写程序********************/ /////////////////////////////////////////////// //函数:CH375_WR_CMD_PORT //说明:写 USB 命令 //入口:unsigned char cmd:待写入命令 //返回:无 /////////////////////////////////////////////// void CH375_WR_CMD_PORT( unsigned char cmd ) { delay2us(); CH375_CMD_PORT=cmd; delay2us(); } /////////////////////////////////////////////// //函数:CH375_WR_DAT_PORT //说明:写一字节 USB 数据 //入口:unsigned char dat:待写入一字节数据 //返回:无 /////////////////////////////////////////////// void CH375_WR_DAT_PORT( unsigned char dat ) { CH375_DAT_PORT=dat;

} /////////////////////////////////////////////// //函数:CH375_RD_DAT_PORT //说明:读一字节 USB 数据 //入口:无 //返回:从 CH372/CH375 读一字节数据 /////////////////////////////////////////////// unsigned char CH375_RD_DAT_PORT( void ) { return( CH375_DAT_PORT ); } /*********************初始化和中断服务程序********************/ /////////////////////////////////////////////// //函数:CH375_Init //说明:CH372/CH375 初始化 //入口:无 //返回:无 /////////////////////////////////////////////// void { CH375_Init( ) /* 设置 USB 工作模式, 必要操作 */ unsigned char i; CH375_WR_CMD_PORT( CMD_SET_USB_MODE ); 作模式 CH375_WR_DAT_PORT( 2 ); //设置为内置固件模式 //设置 USB 工

for ( i="100"; i!=0; i-- ) { /* 等待操作成功,通常需要等待 10uS-20uS */ if ( CH375_RD_DAT_PORT( ) == CMD_RET_SUCCESS ) break; } /* 下面启用 USB 中断,CH372/CH375 的 INT#引脚可以连接到单片机的中断引 脚,中断为低电平有效或者下降沿有效,如果不使用中断,那么也可以用查询方式, 由单片机程序查询 CH372/CH375 的 INT#引脚为低电平 */ IT0 = 0; IE0 = 0; /* 置外部信号为低电平触发 */ /* 清中断标志 */

EX0 = 1; 的 INT0 */ }

/* 允许 CH372 中断,假定 CH372 的 INT#引脚连接到单片机

/////////////////////////////////////////////// //函数:mCh375Interrupt //说明:CH372/CH375 中断程序 //入口:无 //返回:无 /////////////////////////////////////////////// void mCh375Interrupt( ) interrupt 0 using 1 { unsigned char i, length; unsigned char data buffer[64]; unsigned char InterruptStatus; CH375_WR_CMD_PORT( CMD_GET_STATUS );

//获取中断状态并

取消中断请求 InterruptStatus = CH375_RD_DAT_PORT( ); //获取中断状态 //采用边沿触发的外部中断请求,CPU 在相应中断后,自动清除中断标志 switch ( InterruptStatus ) { case USB_INT_BUS_RESET1: { break; } case USB_INT_BUS_RESET2: { break; } case USB_INT_BUS_RESET3: { break; } case USB_INT_BUS_RESET4: { break; } //USB 总线复位 //USB 总线复位 //USB 总线复位

//USB 总线复位

case USB_INT_EP0_SETUP: { //端点 0 的接收器接收到数据, SETUP 事务成功, 内部固件模式 时不需要处理 break; } case USB_INT_EP0_OUT: { //端点 0 的接收器接收到数据,OUT 事务成功,内部固件模式时 不需要处理 break; } case USB_INT_EP0_IN: { //端点 0 的发送器发送完数据,IN 事务成功,内部固件模式时不 需要处理 break; } case USB_INT_EP2_OUT: //批量端点/端点 2 接收到数

据,OUT 成功 { //从当前 USB 中断的端点缓冲区读取数据块,并释放缓冲区 CH375_WR_CMD_PORT( CMD_RD_USB_DATA ); length = CH375_RD_DAT_PORT( ); /* 首先读取后续数据长度 */ ORT( ); for ( i = 0; i < length; i ++ ) buffer[ i ] = CH375_RD_DAT_P //接收数据包 /* -----------测试数据正确性,将接收到的命令包数据返回给 PC 机---------- */ CH375_WR_CMD_PORT( CMD_WR_USB_DATA7 ); /* 向 USB 端点 2 的发送缓冲区写入数据块 */ CH375_WR_DAT_PORT( length ); /* 首先写入后续数据长度,回传刚接收到的数据长度 */ for ( i = 0; i < length; i ++ ) CH375_WR_DAT_PORT( buffer [ i ] ); /* 数据返回,由计算机应用程序测试数据是否正确 */ /* ----------------------------------------------------------------------------------------------------- */ break; }

case USB_INT_EP2_IN: IN 成功 {

//批量端点/端点 2 发送完数据,

CH375_WR_CMD_PORT( CMD_UNLOCK_USB ); 当前 USB 缓冲区 break; } default: { CH375_WR_CMD_PORT( CMD_UNLOCK_USB ); break; } } } /////////////////////////////////////////////// //函数:main //说明:主程序。对 CH372 初始化,对 USB 进行读写及其他程序 //入口:无 //返回:无 /////////////////////////////////////////////// main( ) { Delay50ms( ); CH375_Init( ); EA = 1; while(1); } //对 CH375/CH372 初始化 //允许中断

//释放

下面是中断状态的分析说明。在内置固件模式的 USB 设备方式下,单片机 只需要处理表中标注为灰色的中断状态,CH372 内部自动处理了其它中断状态。 所以可以看到中断服务程序中对端点 0 的 SETUP、 OUT 和 IN 还有 USB 总线复 位都不做处理。


网站首页 | 网站地图 | 笔趣阁 | 甜梦文库
All rights reserved Powered by 学霸学习网 www.tceic.com
copyright ©right 2010-2021。
文档资料库内容来自网络,如有侵犯请联系客服。