📄 ch372v_init_avr.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 + -