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

📄 comms.c

📁 AD5933评估板下位机程序(keil C)和上位机程序(VB)
💻 C
📖 第 1 页 / 共 2 页
字号:
#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 "fx2.h"
#include "fx2regs.h"

extern BOOL   GotSUD;         // Received setup data flag
extern BOOL   Sleep;
extern BOOL   Rwuen;
extern BOOL   Selfpwr;

#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_RENUM	    0xa8 // renum
#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_I2C_100    0xaa // put the i2c bus in 100Khz mode
#define VR_I2C_400    0xab // put the i2c bus in 400Khz mode

//***** My Vendor Requests *****//
#define VR_Heater    	0xda 
#define VR_ReadBlock	0xdc
#define VR_PORT_ACCESS 0xdd // Write/Read a byte to/from the i2c bus
#define VR_I2C_SMBUS	0xde
#define VR_I2C_SWITCH	0xdf
#define VR_I2C_SMBUS3DATA 0xe0

#define LED_ADDR		0x21
#define BTN_ADDR		0x20

#define SERIAL_ADDR		0x50
#define EP0BUFF_SIZE	0x40

//SPI interface definitions
#define SETDIN		IOA = IOA | 0x01
#define CLRDIN		IOA = IOA & 0xfe
#define SETCLK		IOA = IOA | 0x02
#define CLRCLK		IOA = IOA & 0xfd
#define SETCS		IOA = IOA | 0x04
#define CLRCS		IOA = IOA & 0xfb
#define READDOUT	(IOA & 0x10)/0x10

//heater definitions
#define SetHeater1		IOB |= 1
#define ClrHeater1		IOB &= 0xfe
#define SetHeater2		IOB |= 2
#define ClrHeater2		IOB &= 0xfd
#define MAXHEAT 200

#define GET_CHIP_REV()		((CPUCS >> 4) & 0x00FF) // EzUSB Chip Rev Field

//*****New Lines Added*****
#define LED_ADDR		0x21
#define BTN_ADDR		0x20

//-----------------------------------------------------------------------------
// Global Variables
//-----------------------------------------------------------------------------
BYTE	DB_Addr;					//TPM Dual Byte Address stat
BYTE    I2C_Addr, Heater1PWM=0, Heater2PWM=0;					//TPM I2C address
BOOL	DataRead, DataCollected, BlockReadEnabled=FALSE;

BYTE   Configuration;      // Current configuration
BYTE   AlternateSetting;   // Alternate settings
BYTE xdata BlockInfo[2][60] ;

BYTE xdata	DataVals[2];// Gerard BYTE xdata	DataVals[1];
BYTE xdata AddrPtr; 
BYTE TstCntr=0;
//-----------------------------------------------------------------------------
// 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 WriteSMBUSData(BYTE DevAddr, BYTE AddrPtr, BYTE DataOut);
void WriteSMBUS3Data(BYTE DevAddr, BYTE AddrPtr, BYTE DataOut, BYTE DataOut2);// Gerard
BYTE ReadSMBUSData(BYTE DevAddr, BYTE AddrPtr);
BYTE ReadSMBUS3Data(BYTE DevAddr, BYTE AddrPtr, BYTE DataOut);//Gerard

void WriteSWITCHData(BYTE DevAddr, BYTE DataOut);
BYTE ReadSWITCHData(BYTE DevAddr);
void ReadBlockData(BYTE DevAddr, BYTE Num, BYTE StartAddr);

//added for adm1032 test
//BYTE ReadSMBUSDataWithExtraClocks(BYTE DevAddr);


//-----------------------------------------------------------------------------
// Task Dispatcher hooks
//   The following hooks are called by the task dispatcher.
//-----------------------------------------------------------------------------

void TD_Init(void)             // Called once at startup
{

   	BREAKPT &= ~bmBPEN;      // to see BKPT LED go out TGE
   	Rwuen = TRUE;            // Enable remote-wakeup
   	EZUSB_InitI2C();			// Initialize I2C Bus
	CPUCS = (CPUCS & 0xe7) | 0x10;	// 48MHz
	OEB = 0x33;
	IOB = 0;
	OED = 0;
	//NumReads = 53;
	//for(i=0 ; i<NumReads ; i++)
	//	BlockInfo[i][0]= 0x88+i;

}

void TD_Poll(void)             // Called repeatedly while the device is idle
{
static BYTE i=0,j=0;

	I2CTL |= bm400KHZ;			//i2c interface runs at 400KHz

	if(i<Heater1PWM) 
		SetHeater1;
	else if(i<MAXHEAT)
		ClrHeater1;
	if(++i==MAXHEAT) 
		i=0;

	if(j<Heater2PWM) 
		SetHeater2;
	else if(j<MAXHEAT)
		ClrHeater2;
	if(++j==MAXHEAT)
		j=0;


/*	if(BlockReadEnabled == TRUE)
		if(DataCollected == TRUE)
			{
			DataRead = FALSE;
			ReadBlockData();
			DataRead = TRUE;
			DataCollected = FALSE;
			}
*/
}

BOOL TD_Suspend(void)          // Called before the device goes into suspend mode
{
   return(TRUE);
}

BOOL TD_Resume(void)          // Called after the device resumes
{
   return(TRUE);
}

//-----------------------------------------------------------------------------
// Device Request hooks
//   The following hooks are called by the end point 0 device request parser.
//-----------------------------------------------------------------------------

BOOL DR_GetDescriptor(void)
{
   return(TRUE);
}

BOOL DR_SetConfiguration(void)   // Called when a Set Configuration command is received
{
   Configuration = SETUPDAT[2];
   return(TRUE);            // Handled by user code
}

BOOL DR_GetConfiguration(void)   // Called when a Get Configuration command is received
{
   EP0BUF[0] = Configuration;
   EP0BCH = 0;
   EP0BCL = 1;
   return(TRUE);            // Handled by user code
}

BOOL DR_SetInterface(void)       // Called when a Set Interface command is received
{
   AlternateSetting = SETUPDAT[2];
   return(TRUE);            // Handled by user code
}

BOOL DR_GetInterface(void)       // Called when a Set Interface command is received
{
   EP0BUF[0] = AlternateSetting;
   EP0BCH = 0;
   EP0BCL = 1;
   return(TRUE);            // Handled by user code
}

BOOL DR_GetStatus(void)
{
   return(TRUE);
}

BOOL DR_ClearFeature(void)
{
   return(TRUE);
}

BOOL DR_SetFeature(void)
{
   return(TRUE);
}

BOOL DR_VendorCmnd(void)
{
	BYTE 	i2c_slad;

	// Determine I2C boot eeprom device address; addr = 0x0 for 8 bit addr eeproms (24LC00)
	I2C_Addr = SERIAL_ADDR | ((I2CS & 0x10) >> 4); // addr=0x01 for 16 bit addr eeprom (LC65)
	// Indicate if it is a dual byte address part
	DB_Addr = (BOOL)(I2C_Addr & 0x01); //TPM: ID1 is 16 bit addr bit - set by rocker sw or jumper
	I2CTL &= ~bm400KHZ;

	switch(SETUPDAT[1])
	{ //TPM handle new commands

		case VR_I2C_SMBUS:
			if (SETUPDAT[0] == VR_UPLOAD)
				{
				while(EP0CS & bmEPBUSY);
				i2c_slad = SETUPDAT[2];
				AddrPtr = SETUPDAT[4];
				//EZUSB_WriteI2C(i2c_slad, 0x01, &AddrPtr);	//0x01 = length
				//EZUSB_ReadI2C(i2c_slad, 0x01, EP0BUF);	//0x01 = length

				*EP0BUF = ReadSMBUSData(SETUPDAT[2], SETUPDAT[4]);

				//added for adm1032 test
				//*EP0BUF = ReadSMBUSDataWithExtraClocks(SETUPDAT[2]);

				//*EP0BUF = TstCntr++;

				EP0BCH = 0;
				EP0BCL = 1;  // Arm endpoint with # bytes to transfer
				}
			if (SETUPDAT[0] == VR_DOWNLOAD)
				{
				EP0BCH = 0;
				EP0BCL = 0; // Clear bytecount to allow new data in; also stops NAKing
				i2c_slad = SETUPDAT[2];
				DataVals[0] = SETUPDAT[4]; //AddrPtr
				DataVals[1] = SETUPDAT[5]; //DataOut
				//EZUSB_WriteI2C(i2c_slad, 0x02, DataVals);	//0x02 = length 
				WriteSMBUSData(SETUPDAT[2], SETUPDAT[4], SETUPDAT[5]);
				}
		break;  
		
		case VR_I2C_SMBUS3DATA:
			if (SETUPDAT[0] == VR_UPLOAD)
				{
				while(EP0CS & bmEPBUSY);
				i2c_slad = SETUPDAT[2];
				AddrPtr = SETUPDAT[4];
				//EZUSB_WriteI2C(i2c_slad, 0x01, &AddrPtr);	//0x01 = length
				//EZUSB_ReadI2C(i2c_slad, 0x01, EP0BUF);	//0x01 = length

				*EP0BUF = ReadSMBUS3Data(SETUPDAT[2], SETUPDAT[4], SETUPDAT[5]);

				//added for adm1032 test
				//*EP0BUF = ReadSMBUSDataWithExtraClocks(SETUPDAT[2]);

				//*EP0BUF = TstCntr++;

				EP0BCH = 0;
				EP0BCL = 1;  // Arm endpoint with # bytes to transfer
				}
			if (SETUPDAT[0] == VR_DOWNLOAD)
				{
				EP0BCH = 0;
				EP0BCL = 0; // Clear bytecount to allow new data in; also stops NAKing
				i2c_slad = SETUPDAT[2];
				DataVals[0] = SETUPDAT[4]; //AddrPtr
				DataVals[1] = SETUPDAT[5]; //DataOut
				//EZUSB_WriteI2C(i2c_slad, 0x02, DataVals);	//0x02 = length 
				WriteSMBUS3Data(SETUPDAT[2], SETUPDAT[4], SETUPDAT[5], SETUPDAT[6]);
				}
		break;  

		case VR_I2C_SWITCH:
			if (SETUPDAT[0] == VR_UPLOAD)
				{
				while(EP0CS & bmEPBUSY);
				i2c_slad = SETUPDAT[2];
				//EZUSB_ReadI2C(SETUPDAT[2], 0x01, EP0BUF);	//0x01 = length
				*EP0BUF = ReadSWITCHData(SETUPDAT[2]);
				EP0BCH = 0;
				EP0BCL = 1;  // Arm endpoint with # bytes to transfer
				}
			if (SETUPDAT[0] == VR_DOWNLOAD)
				{
				EP0BCH = 0;
				EP0BCL = 0; // Clear bytecount to allow new data in; also stops NAKing
				i2c_slad = SETUPDAT[2];
				//EZUSB_WriteI2C(i2c_slad, 0x01, &SETUPDAT[4]);	//0x02 = length 
				WriteSWITCHData(SETUPDAT[2], SETUPDAT[4]);
				}
		break;

		case VR_PORT_ACCESS:
			if (SETUPDAT[0] == VR_UPLOAD)
				{
				while(EP0CS & bmEPBUSY);
				*(EP0BUF+0) = IOA;
				*(EP0BUF+1) = OEA;
				*(EP0BUF+2) = IOB;
				*(EP0BUF+3) = OEB;
				*(EP0BUF+4) = IOD;
				*(EP0BUF+5) = OED;
				EP0BCH = 0;
				EP0BCL = SETUPDAT[6];  // Arm endpoint with # bytes to transfer
				}
			 if (SETUPDAT[0] == VR_DOWNLOAD)
				{
				EP0BCH = 0;
				EP0BCL = 0; // Clear bytecount to allow new data in; also stops NAKing

				IOB = SETUPDAT[2];
				OEB = SETUPDAT[4];
				}
		break;

		case VR_Heater:
			if (SETUPDAT[0] == VR_UPLOAD)
				{
				while(EP0CS & bmEPBUSY);

				*EP0BUF = Heater1PWM;
				*(EP0BUF+1) = Heater2PWM;
				*(EP0BUF+2) = IOB;

				EP0BCH = 0;
				EP0BCL = SETUPDAT[6];
				}

⌨️ 快捷键说明

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