⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ch372.c

📁 单片机数据通讯典型应用(光盘内容)
💻 C
字号:
//*******************************端口定义*************************************
#include <reg52.h>
#include <CH372INC.H>
#define CH372_DATA P0
sbit CH372_A0=P2^7;
sbit CH372_CS=P2^6;
sbit CH372_RD=P3^7;
sbit CH372_WR=P3^6;

//********************************CH372写USB命令*********************************
void CH372_WR_CMD_PORT(unsigned char cmd) 
  {  //向CH372的命令端口写入命令,周期不小于4uS,如果单片机较快则延时
	 	delay2us();
		CH372_DATA=cmd;
		CH372_A0=1;  				//选择CH372的写命令方式
		CH372_RD=1;  				//如果I/O默认电平是高电平,那么这是可选操作
		CH372_CS=0;
		CH372_WR=0;
		CH372_WR=1;
		CH372_CS=1;
		CH372_A0=0;
		CH372_DATA=0xFF;  			//对于准双向I/O,请在此设置输出全高电平
		delay2us();
  }

//*************************单片机读取一字节数据程序代码*****************************
unsigned char CH372_RD_DAT_PORT(void) 
  {  //从CH372的数据端口读出数据,周期不小于1.5uS,如果单片机较快则延时
		CH372_DATA=0xFF;  //对于准双向I/O,请在此设置输出全高电平,便于输入
		CH372_CS=0;
		CH372_RD=0;
		unsigned char dat=CH372_DATA;
		CH372_RD=1;
		CH372_CS=1;
		CH372_DATA=0xFF;  //对于准双向I/O,请在此设置输出全高电平
		return  dat;
  }

//*****************************单片机发送一字节数据程序代码***************************
void CH372_WR_DAT_PORT(unsigned char dat) 
  {  //向CH372的数据端口写入数据,周期不小于1.5uS,如果单片机较快则延时
		CH372_DATA=dat;
		CH372_CS=0;
		CH372_WR=0;
		CH372_WR=1;
		CH372_CS=1;
		CH372_DATA=0xFF;  //对于准双向I/O,请在此设置输出全高电平
  }
//***************************** CH372中断服务程序*******************************
void	 CH372Interrupt()interrupt 0 using 1
  {
		unsigned char status;
		unsigned char i,length;
		unsigned char data buffer[SIZE];
		CH372_WR_CMD_PORT(CMD_GET_STATUS);  		//获取中断状态并取消中断请求
		status=CH372_RD_DAT_PORT( );   				//获取中断状态
		switch (status) 
		{  //分析中断状态处理
			case USB_INT_EP2_OUT: 
			  {  /* 批量端点下传成功 */
				/* 从当前USB中断的端点缓冲区读取数据块,并释放缓冲区 */
				CH372_WR_CMD_PORT(CMD_RD_USB_DATA);  //执行RD_USB_DATA命令
				length=CH372_RD_DAT_PORT();  		  //首先读取后续数据长度
				for (i=0;i<length;i++ ) 
					buffer[i]=CH372_RD_DAT_PORT();   //接收数据包
				/*测试数据正确性,将接收到的命令包数据取反后返回给PC机*/
				CH372_WR_CMD_PORT(CMD_WR_USB_DATA7); 
									//向USB端点2的发送缓冲区写入数据块
				CH372_WR_DAT_PORT(length);
									//首先写入后续数据长度,回传刚接收到的数据长度
				for (i=0;i<length;i++) 
					CH372_WR_DAT_PORT(buffer[i]); 
							//数据取反后返回,由计算机应用程序测试数据是否正确 
				break;
			}
			case USB_INT_EP2_IN: 
			  {  /* 批量数据发送成功 */
				CH372_WR_CMD_PORT(CMD_UNLOCK_USB); //释放当前USB缓冲区
				break;
			  }
			default: 
			  {  /* 其它中断,未用到,解锁后退出即可 */
				CH372_WR_CMD_PORT(CMD_UNLOCK_USB);  //释放当前USB缓冲区
				break;
			 }
		}
  }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -