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