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

📄 ch372v_init_avr.h~

📁 CH372下位机
💻 H~
字号:
//#ifndef __CH372V_INIT_AVR_H__
//#define __CH372V_INIT_AVR_H__

#include  <iom128v.h>
#include "CH372INC.H"
#include "delay.h"
#define CH372V_DIR		DDRA
#define CH372V_IN		PINA
#define CH372V_OUT		PORTA

#define CH372V_WR		(1<<0)
#define CH372V_WR_DIR	DDRG
#define CH372V_WR_OUT	PORTG
#define CH372V_WR_LO	CH372V_WR_OUT &= ~CH372V_WR
#define CH372V_WR_HI	CH372V_WR_OUT |= CH372V_WR

#define CH372V_RD		(1<<1)
#define CH372V_RD_DIR	DDRG
#define CH372V_RD_OUT	PORTG
#define CH372V_RD_LO	CH372V_RD_OUT &= ~CH372V_RD
#define CH372V_RD_HI	CH372V_RD_OUT |= CH372V_RD

#define CH372V_A0		(1<<7)
#define CH372V_A0_DIR	DDRC
#define CH372V_A0_OUT	PORTC
#define CH372V_A0_LO	CH372V_A0_OUT &= ~CH372V_A0
#define CH372V_A0_HI	CH372V_A0_OUT |= CH372V_A0

#define CH372V_CS		(1<<5)
#define CH372V_CS_DIR	DDRC
#define CH372V_CS_OUT	PORTC
#define CH372V_CS_LO	CH372V_CS_OUT &= ~CH372V_CS
#define CH372V_CS_HI	CH372V_CS_OUT |= CH372V_CS

//#define CH372V_INT	(1<<5)
void CH372V_INT_DIR(void)
{  
	DDRD&=~(1<<0);
}  
#define CH372V_INT_IN	PIND0

//// CH372V 命令定义
//#define CH372V_RESET_ALL		0x05	//执行硬件复位
//#define CH372V_CHECK_EXIST	0x06	//测试工作状态
//#define CH372V_SET_SUB_ID		0x12	//设置VID和PID
//#define CH372V_SET_USB_MODE	0x15	//设置USB工作模式
//#define CH372V_GET_STATUS		0x22	//获取中断状态
//#define CH372V_UNLOCK_USB		0x23	//释放USB缓冲区
//#define CH372V_RD_USB_DATA	0x28	//从USB端点中断读取数据并释放缓冲区
//#define CH372V_WR_USB_DATA5	0x2A	//向USB端点1缓冲区写数据
//#define CH372V_WR_USB_DATA7	0x2B	//向USB端点2缓冲区写数据
//#define CH372V_GET_IC_VER		0x01	//获取芯片和固件版本
//#define CH372V_ENTER_SLEEP	0x03	//进入低功耗睡眠挂起状态
//#define CH372V_CHK_SUSPEND	0x0B	//检查USB总线挂起方式状态
//#define CH372V_RD_USB_DATA0	0x27	//USB端点中断读取数据
//
//// CH372V 状态定义
//#define CH372V_CMD_RET_SUCCESS	0x51	//操作成功
//#define CH372V_CMD_RET_ABORT		0x5F	//操作失败
//
//// CH372V 中断状态
//#define CH372V_USB_INT_BUS_RESET1	0x03	//检测到USB总线复位
//#define CH372V_USB_INT_BUS_RESET2	0x07	//检测到USB总线复位
//#define CH372V_USB_INT_BUS_RESET3	0x0B	//检测到USB总线复位
//#define CH372V_USB_INT_BUS_RESET4	0x0F	//检测到USB总线复位
//#define CH372V_USB_INT_EP0_SETUP	0x0C	//端点0的接收器接收到数据,SETUP 成功
//#define CH372V_USB_INT_EP0_OUT	0x00	//检端点0的接收器接收到数据,OUT功
//#define CH372V_USB_INT_EP0_IN		0x08	//端点0的发送器发送完数据,IN成功
//#define CH372V_USB_INT_EP1_OUT	0x01	//辅助端点/端点1接收到数据,OUT成功
//#define CH372V_USB_INT_EP1_IN		0x09	//中断端点/端点1发送完数据,IN成功
//#define CH372V_USB_INT_EP2_OUT	0x02	//批量端点/端点2接收到数据,OUT成功
//#define CH372V_USB_INT_EP2_IN		0x0A	//批量端点/端点2发送完数据,IN成功
//#define CH372V_USB_INT_USB_SUSPEND 0x05	//USB总线挂起事件(如果已CHK_SUSPEND)
//#define CH372V_USB_INT_WAKE_UP	 0x06	//从睡眠中被唤醒事件(如果已ENTER_SLEEP)

#define CH372V_VID			0x4348	//VID厂商标识码
#define CH372V_PID			0x5537	//PID产品识别码

//void CH372V_Init(void);
//void CH372V_SendCMD1(unsigned char Command);
//void CH372V_SetVIDPID(void);
//unsigned char CH372V_ReadDAT1(void);
//void CH372V_SendDAT1(unsigned char DAT);

//#endif /*__CH372V_INIT_AVR_H__*/
unsigned char WatchPoint,temp,m,temp_check,n;

//发送单字节命令
void CH372V_SendCMD1(unsigned char Command) {
	CH372V_DIR = 0xFF;
	CH372V_OUT = Command;		//发送数据
	CH372V_A0_HI;			//A0=1命令    
	CH372V_CS_LO;			//CS有效	
	CH372V_WR_LO;			//WR有效
    CH372V_RD_HI;			//RD无效
	#asm("NOP");
	#asm("NOP");
	#asm("NOP");
	CH372V_WR_HI;			//WR无效
	CH372V_CS_HI;			//CS无效
}

void CH372V_SendDAT1(unsigned char DAT) 
{
	CH372V_DIR = 0xFF;
	CH372V_OUT = DAT;		//发送数据
	CH372V_CS_LO;			//CS有效	
	CH372V_A0_LO;			//A0=0数据    
    CH372V_WR_LO;			//WR有效	
    CH372V_RD_HI;			//RD无效

	#asm("NOP");
	#asm("NOP");
	#asm("NOP");
	CH372V_WR_HI;			//WR无效
	CH372V_CS_HI;			//CS无效
}

unsigned char CH372V_ReadDAT1(void)
{
    unsigned char DAT=0;
	CH372V_DIR = 0x00;
    CH372V_CS_LO;			//CS有效    
    CH372V_A0_LO;			//A0=0数据
	CH372V_RD_LO;			//RD有效    
	CH372V_WR_HI;			//WR无效

	#asm("NOP");
	#asm("NOP");
	#asm("NOP");
	DAT = CH372V_IN;		//读取数据
	CH372V_RD_HI;			//RD无效
	CH372V_CS_HI;			//CS无效
	CH372V_DIR = 0xFF;
	return DAT;  
}
//设置VID和PID
void CH372V_SetVIDPID(void)
{	

	CH372V_SendCMD1(CMD_SET_USB_ID);
    temp=(unsigned char)(CH372V_VID&0xff);
    CH372V_SendDAT1(temp);
    temp=(unsigned char)((CH372V_VID>>8)&0xff);
    CH372V_SendDAT1(temp);
    temp=(unsigned char)(CH372V_PID&0xff);
    CH372V_SendDAT1(temp);
    temp=(unsigned char)((CH372V_PID>>8)&0xff);
    CH372V_SendDAT1(temp);
       
}

void CH372V_Init(void) {
	//首先初始化端口
	CH372V_DIR |= 0xFF;
	CH372V_WR_HI;			//WR无效
	CH372V_WR_DIR |= CH372V_WR;
	CH372V_RD_HI;			//RD无效
	CH372V_RD_DIR |= CH372V_RD;
	CH372V_CS_HI;			//CS无效
	CH372V_CS_DIR |= CH372V_CS;
	CH372V_A0_HI;			//A0=1命令
	CH372V_A0_DIR |= CH372V_A0;
	//第一部分硬件复位
	CH372V_SendCMD1(CMD_RESET_ALL);
	Delay1ms(100);		//延时40ms
	//第二部分设置VID和PID
	CH372V_SendCMD1(CMD_CHECK_EXIST);
	CH372V_SendDAT1(0x57);
	temp_check =CH372V_ReadDAT1();
	/*while(temp_check!=0xa8) // CH375不正常 
	{  
		CH372V_SendCMD1(CMD_RESET_ALL);
		Delay1ms(100);		//延时40ms
		CH372V_SendCMD1(CMD_CHECK_EXIST);
		CH372V_SendDAT1(0x57); 
		temp_check =CH372V_ReadDAT1();
	}*/
	for(n=100; n!=0; n-- ) 
	{  /* 等待操作成功,通常需要等待10uS-20uS */
		if ( temp_check==CMD_RET_SUCCESS ) 
		break;
	}
	CH372V_SetVIDPID();
	//第三部分设置USB工作模式
	//Delay_us(2);
 	CH372V_SendCMD1(CMD_SET_USB_MODE);
    //Delay_us(40);
  	CH372V_SendDAT1(0x02);   //内部固件模式
    //Delay_us(40);
	WatchPoint =CH372V_ReadDAT1();
	for(m=100; m!=0; m-- ) 
	{  /* 等待操作成功,通常需要等待10uS-20uS */
		if ( WatchPoint==CMD_RET_SUCCESS ) 
		break;
	}
	//asm("NOP");				//在这里加入断点观察WatchPoint
    CH372V_INT_DIR();
}

⌨️ 快捷键说明

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