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

📄 vend_ax.c

📁 用usb实现数据传输的源码
💻 C
字号:
#pragma NOIV					// Do not generate interrupt vectors
//-----------------------------------------------------------------------------
//	File:		periph.c
//	Contents:	Hooks required to implement USB peripheral function.
//
//	Copyright (c) 1997 AnchorChips, Inc. All rights reserved
//-----------------------------------------------------------------------------
#include "ezusb.h"
#include "ezregs.h"
#include <absacc.h>
#include <stdlib.h>
extern BOOL	GotSUD;			// Received setup data flag
extern BOOL	Sleep;
extern BOOL	Rwuen;
extern BOOL	Selfpwr;

BYTE	Configuration;		// Current configuration
BYTE	AlternateSetting;	// Alternate settings
BYTE	lyk;
//-----------------------------------------------------------------------------
// Constants
//-----------------------------------------------------------------------------
#define	VR_UPLOAD		0xc0
#define VR_DOWNLOAD		0x40

#define VR_ANCHOR_DLD   0xa0 // handled by core
#define VR_EEPROM		0xa2 // loads (uploads) EEPROM
#define	VR_RAM			0xa3 // loads (uploads) external ram
#define VR_SETI2CADDR	0xa4
#define VR_GETI2C_TYPE  0xa5 // 8 or 16 byte address
#define VR_GET_CHIP_REV 0xa6 // Rev A, B = 0, Rev C = 2 // NOTE: New TNG Rev
#define VR_TEST_MEM     0xa7 // runs mem test and returns result
#define VR_RENUM	    0xa8 // renum
#define VR_DB_FX	    0xa9 // Force use of double byte address EEPROM (for FX)

#define SERIAL_ADDR		0x50
#define EP0BUFF_SIZE	0x40
//////////////////////////////////////////
#define FULL1	(PINSC&0X04)  	//SRAM1 FULL SIGNAL
#define FULL2	(PINSC&0X08)  	//SRAM2 FULL SIGNAL
#define WR_RD	((PINSB&0X10)!=0)

#define SEL_0	OUTA=00
#define SEL_1	OUTA=0X41
#define SEL_2	OUTA=0X82
#define SEL_3	OUTA=0XFF

#define QA_PRE_L  	XBYTE[0xFFF0]	//READ SRAM1 PRE_TRIG OVER ADDRESS LOW 8 BITS 
#define QA_PRE_H  	XBYTE[0xFFF1]	//READ SRAM1 PRE_TRIG OVER ADDRESS HIGH 8 BITS 
#define QA_L  		XBYTE[0xFFF2]	//READ SRAM1 DATA LOW 8 BITS 
#define QA_H  		XBYTE[0xFFF3]	//READ SRAM1 DATA HIGH 8 BITS 
#define QB_PRE_L  	XBYTE[0xFFF4]	//READ SRAM2 PRE_TRIG OVER ADDRESS LOW 8 BITS 
#define QB_PRE_H  	XBYTE[0xFFF5]	//READ SRAM2 PRE_TRIG OVER ADDRESS HIGH 8 BITS 
#define QB_L  		XBYTE[0xFFF6]	//READ SRAM2 DATA LOW 8 BITS 
#define QB_H  		XBYTE[0xFFF7]	//READ SRAM2 DATA HIGH 8 BITS  
#define QA_AL  		XBYTE[0xFFF8]	//READ SRAM1 ADDRESS LOW 8 BITS 
#define QA_AH  		XBYTE[0xFFF9]	//READ SRAM2 ADDRESS HIGH 8 BITS
#define QB_AL  		XBYTE[0xFFFA]	//READ SRAM1 ADDRESS LOW 8 BITS 
#define QB_AH  		XBYTE[0xFFFB]	//READ SRAM2 ADDRESS HIGH 8 BITS


#define hct574  	XBYTE[0xFFFc]	//hct574在CPLD中的控制地址
#define con_freq  	XBYTE[0xFFFd]	//分频控制在CPLD中的地址
#define ad8400  	XBYTE[0xFFF9]	//AD8400在cpld中的控制地址
//AD8400的三根控制线状态
#define ad8400_cs_1  	OUTC=PINSC|0X20
#define ad8400_cs_0  	OUTC=PINSC&0XDF	
#define ad8400_clk_1   	OUTC=PINSC|0X02
#define ad8400_clk_0   	OUTC=PINSC&0XFD
#define ad8400_sdi_1   	OUTC=PINSC|0X01
#define ad8400_sdi_0   	OUTC=PINSC&0XFE
//LTC14464个控制字的地址
#define ltc1446_1H  XBYTE[0xFFF8]	
#define ltc1446_1L  XBYTE[0xFFFB]	
#define ltc1446_2H  XBYTE[0xFFFE]	
#define ltc1446_2L  XBYTE[0xFFFF]	


#define ac0_b			0x00	  	
#define dc0_b			0x80	  	
#define ac20mv_b		0x10	  	
#define dc20mv_b		0x90	  	
#define ac50mv_b		0x20	  	
#define	dc50mv_b		0xa0	  
#define ac100mv_b		0x30	  	
#define dc100mv_b		0xb0	  	
#define ac200mv_b		0x40	  	
#define dc200mv_b		0xc0	  	
#define ac500mv_b		0x50	  	
#define dc500mv_b		0xd0	  	
#define ac1v_b			0x60	  	
#define dc1v_b			0xe0	  	

#define ac0_a			0x00	  	
#define dc0_a			0x08	  	
#define ac20mv_a		0x01	  	
#define dc20mv_a		0x09	  	
#define ac50mv_a		0x02	  	
#define	dc50mv_a		0x0a	  
#define ac100mv_a		0x03	  	
#define dc100mv_a		0x0b	  	
#define ac200mv_a		0x04	  	
#define dc200mv_a		0x0c	  	
#define ac500mv_a		0x05	  	
#define dc500mv_a		0x0d	  	
#define ac1v_a			0x06	  	
#define dc1v_a			0x0e
//-----------------------------------------------------------------------------
// Global Variables
//-----------------------------------------------------------------------------
BYTE			DB_Addr;					//TPM Dual Byte Address stat
BYTE			I2C_Addr;					//TPM I2C address
//////////// globe  variable  /////////////////////////////////////////
unsigned char freq_set[17]={0xf9, 0x63, 0x39, 0x18, 0x09, 0x04, 0x01, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,0xff};
//各个时基下对应的频率控制值,具体值的含义见CPLD程序中的分频逻辑
//////////////////////////// 48k  97k  ,195k, 390k, 780k, 1.5m, 3.1m, 6.25m,12.5m,25mhz,50mhz,100mhz,100mhz,1000mhz,100mhz,100mhz,100mhz,100mhz,100mhz/// 
///////////////////////////, 5ms,  2ms,  1ms,  500us,200us,100us 50us, 20us, 10us, 5us,  2us,   1us,   500ns,  200ns, 100ns, 50ns,  20ns,  10ns///
idata unsigned int   set_zero_a[15] = {464, 405, 507, 610, 186, 331, 479, 464, 464, 160, 312, 630, 184, 330, 479};
idata unsigned int   set_zero_b[15] = {464, 470, 557, 649, 192, 337, 484, 464, 464, 160, 312, 630, 187, 335, 482};
//各个量程下的零点校验值
idata unsigned char channal_set[15] = {0x00,0x1a,0x2a,0x0a,0x1c,0x2c,0x0c,0x00,0x01,0x1b,0x2b,0x0b,0x1d,0x2d,0x0d};
//各个量程下的继电器网络的控制值
///////////////////////////////////////0    20   50   100  200  500  1v , null, 0    20   50   100  200  500   1v
/////////////////////////////////|------------ac--------------------------||||---------------dc----------------|
idata unsigned char trig;
idata unsigned char irq_yes_no;
//-----------------------------------------------------------------------------
// Prototypes
//-----------------------------------------------------------------------------
void EEPROMWrite(WORD addr, BYTE length, BYTE xdata *buf); 	//TPM EEPROM Write
void EEPROMRead(WORD addr, BYTE length, BYTE xdata *buf);  	//TPM EEPROM Read
void ltc1446_control(unsigned int A1,unsigned int A2);		// 写ltc1446控制字函数,A1为第一路输出电压大小值
															//A2为第二路控制字
void hct574_control(unsigned char A1,unsigned char A2);		//对外部两个HCT574进行控制的函数,A1为第一路的控制信号
															//A2为第二路的控制信号
void ad8400_control(unsigned char A1);						// 对AD8400的控制信号,主要控制电位器的中心抽头的位置,以便设置触发电平
//-----------------------------------------------------------------------------
// Task Dispatcher hooks
//	The following hooks are called by the task dispatcher.
//-----------------------------------------------------------------------------

void TD_Init(void) 				// Called once at startup
{
unsigned char lyk;
 
////////enable endpoint 2,4 interrupt///////////////
	    OUT2BC = 0;
        OUT4BC = 0;
		OUT07IEN |= bmEP2 + bmEP4 ;
   		EPIO[OUT2BUF_ID].bytes = 0;
  		EPIO[OUT4BUF_ID].bytes = 0;
		
/////////////////////////////////////////////////////////////////////////
/////////Initialize PORT////////////////////////////////
	PORTACFG=0X00;		//porta set as IO
	OEA=0XFF;			//porta	output enable

	PORTBCFG=0X00;		//portb set as IO
	OEB=0X0f;			//portb 0~3 set as output(CLS,CLK_TURN,EDGE ,TRIG_O signal)
						//portb  input(,WR_RD,HF1,HF2)
	PORTCCFG=0XC0;		//portc 0~5 set as IO. 6,7 set as WR,RD.
	OEC=0X33;			//portc 0,1  set as output(ad8400_sdi,ad8400_clk) ,
						//portc 2,3  set as input(FULL1,FULL2) ,
						//portc 4 set as output(RD_CLK)
						//portc 5 set as output(AD8400_CS)
/////////Initialize PORT over///////////////////////////

//以下这部分可以不要,主要是为了测试的方便
ltc1446_control(100,200);					 
hct574_control ( channal_set[0],channal_set[0]);
/////////////////////////////////////////
	con_freq=0x39;	
	for(lyk = 0; lyk<50; lyk++){}
/////////////////////////////////////
	ad8400=0x66;
	for(lyk = 0; lyk<50; lyk++){}
//	trig = 0xf0;
	for(lyk = 0; lyk<50; lyk++){}
/////////////////////////////////////////
	OUTA = 0XFF;
	irq_yes_no = 0x00;
	USBPAIR = 0X00; 
//////////////////////////////////////////////

}
//TD_POLL函数的作用主要是传递采样结果
void TD_Poll(void) 				// Called repeatedly while the device is idle
{//0
unsigned int    ddd;		 
unsigned char 	i,K;	
union		 
	{
		unsigned char 	sequence_char[2];	 
	 	unsigned int    sequence_int;		 
	 } point_in;//这个变量的作用是对数据传送的次数进行计数
cls_cpld:	
//上位机每显示完一帧,则外部的指示灯状态变化一次
			K = PINSA + 0x80;	
			OUTA = K;
/////////复位数据采集卡/////////////////////
			irq_yes_no = 0x00;		
			OUTB=PINSB|0X01;		//cpld's cls signal, "1" is availability
			OUTB=PINSB&0XFE;		//cpld's cls signal, "0" is inavailability
 			point_in.sequence_int = 0;
/////////////////////////////////////////////
//以下这部分的作用是判断是否有有效的触发信号,
//如果没有就强制切换到内部的1K信号做触发
//如果有则开始采集数据

				for(ddd = 0;ddd<=60000; ddd++)
				{	if((PINSB&0x80) == 0x80)  goto begin;
					for(i = 0; i<=4; i++){}
				}
//延时一段时间,如果在这一段时间内没有采样结束信号,
//则说明没有有效的触发信号
//则将触发信号切换到1k信号

				trig = 0x00;
				hct574_control (channal_set[OUT2BUF[1]],channal_set[OUT2BUF[0]]);
				ad8400=0x89;
				goto cls_cpld;//切换完以后复位数据采集卡,重新开始采样

//read_data begin
begin:		point_in.sequence_int = 0;
			while((PINSB&0x80) == 0x80)//这句话可有可无,因为在上面已经判断过是否采样结束,
			{
						if(point_in.sequence_int == 0) 
 					    {	//将预触发停止地址在第一次传递采样结果时放在IN2的前2个字节
							IN2BUF[0] = QA_PRE_H;
							IN2BUF[1] = QA_PRE_L;
							
						}
hh:	if(irq_yes_no == 0xff)  goto cls_cpld;
//检测是否要重新开始一次采集过程,这个变量在out2的中断服务程序中设定

⌨️ 快捷键说明

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