📄 comms.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 "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 + -