亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? jtag.cpp

?? 新華龍單片機的ISP客戶端程序
?? CPP
字號:
// jtag.cpp: implementation of the jtag class.
//根據silicon laboratorles 提供的 AN105應用手冊編寫而成
//硬件使用 altera ByteBlaster 和xilinx PARALLELIII 線纜
//手冊上理論支持如下器件:
//C8051F000, C8051F001, C8051F002,
//C8051F005, C8051F006, C8051F010, C8051F011,
//C8051F012, C8051F015, C8051F016,
//C8051F017, C8051F206, C8051F220,
//C8051F221, C8051F226, C8051F230,
//C8051F231, C8051F236, C8051F020,
//C8051F021, C8051F022, and C8051F023.
//
//測試通過:
//C8051f020
//
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "C8051JTAG.h"
#include "jtag.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

jtag::jtag()
{
	m_iCcabletype = ALTERABLASTER;
	m_nPort = (WORD)0x378;
	m_ucWriteValue = 0x00;
	b_TDONoInv = TRUE;
	SetPortVal(m_nPort, m_ucWriteValue, 1);				//SET TMS,TCK,TDI to low

	FLCN_LEN = 8;				//	8			// number of bits in FLASHCON
	FLD_RDLEN = 10;				//10			// number of bits in an FLASHDAT read
	FLD_WRLEN = 8;				//8			// number of bits in an FLASHDAT write
	FLA_LEN	= 16;				//16			// number of bits in FLASHADR
	FLSC_LEN = 8;				//8			// number of bits in FLASHSCL
	ucFCONBIT7 = 0;
}

jtag::~jtag()
{
}
/////////////////////////////////////////////////////////////////////////////
// jtag message handlers
//TCK函數
void jtag::TCK(bool bValue)
{
	unsigned char ucTemp;
	ucTemp = 0;
	ucTemp = 1<<m_woTCKPin;
	if(bValue)
	{
		m_ucWriteValue |= ucTemp; 
	}
	else
	{
		ucTemp = ~ucTemp;
		m_ucWriteValue &= ucTemp; 
	}
	SetPortVal(m_nPort, m_ucWriteValue, 1);
}

void jtag::TMS(bool bValue)
{
	unsigned char ucTemp;
	ucTemp = 0;
	ucTemp = 1<<m_woTMSPin;
	if(bValue)
	{
		m_ucWriteValue |= ucTemp; 
		
	}
	else
	{
		ucTemp = ~ucTemp;
		m_ucWriteValue &= ucTemp; 
	}
	SetPortVal(m_nPort, m_ucWriteValue, 1);

}

void jtag::TDI(bool bValue)
{
	unsigned char ucTemp;
	ucTemp = 0;
	ucTemp = 1<<m_woTDIPin;
	if(bValue)
	{
		m_ucWriteValue |= ucTemp; 
	}
	else
	{
		ucTemp = ~ucTemp;
		m_ucWriteValue &= ucTemp; 
	}
	SetPortVal(m_nPort, m_ucWriteValue, 1);
}

bool jtag::TDO()
{
	//獲得控制端口的值,保持高位值不變,將要輸出的值從低4位輸出,且使連接器上的電位狀態與想輸出的值一致
	DWORD temp_dwPortVal;
	unsigned int temp_aa,uiTempPin;
	GetPortVal(m_nPort+m_iTDOAddP, &temp_dwPortVal, 1); //reads a BYTE value from an I/O port
	temp_aa = (unsigned int)temp_dwPortVal;
	uiTempPin = 1<<m_wiTDOPin;
	//1
	if(uiTempPin & temp_aa)
	{
		if (b_TDONoInv)
		{
			return 1;
		}
		else
			return 0;
	}
	//0
	else
	{
		if (b_TDONoInv)
		{
			return 0;
		}
		else
			return 1;
	}
}

void jtag::JTAG_StrobeTCK()
{
	TCK(1);
	TCK(0);
}

void jtag::JTAG_Reset()
{
	TMS (1);
	JTAG_StrobeTCK ();								// move to Test Logic Reset state
	JTAG_StrobeTCK ();
	JTAG_StrobeTCK ();
	JTAG_StrobeTCK ();
	JTAG_StrobeTCK ();
	TMS (0);
	JTAG_StrobeTCK ();								// move to Run_Test/Idle state
}

unsigned int jtag::JTAG_IR_Scan(unsigned int instruction, int num_bits)
{
	unsigned int retval;							// JTAG instruction read
	int i;											// JTAG IR bit counter
	retval = 0x0;
	TMS(1);
	JTAG_StrobeTCK ();								// move to SelectDR
	TMS(1);
	JTAG_StrobeTCK ();								// move to SelectIR
	TMS(0);
	JTAG_StrobeTCK ();								// move to Capture_IR
	TMS(0);
	JTAG_StrobeTCK ();								// move to Shift_IR state
	for (i=0; i < num_bits; i++) 
	{
		TDI(instruction & 0x01);					// shift IR, LSB-first
		instruction = instruction >> 1;
		retval = retval >> 1;
		if (TDO()) 
		{
			retval |= (0x01 << (num_bits - 1));
		}
		if (i == (num_bits - 1))
		{
			TMS(1);								// move to Exit1_IR state
		}
		JTAG_StrobeTCK();
	}
	TMS(1);
	JTAG_StrobeTCK ();								// move to Update_IR
	TMS(0);
	JTAG_StrobeTCK ();								// move to RTI state
	return retval;
}

unsigned long jtag::JTAG_DR_Scan(unsigned long dat, int num_bits)
{
	unsigned long retval; // JTAG return value
	int i; // JTAG DR bit counter

	retval = 0x0L;
	TMS(1);
	JTAG_StrobeTCK (); // move to SelectDR
	TMS(0);
	JTAG_StrobeTCK (); // move to Capture_DR
	TMS(0);
	JTAG_StrobeTCK (); // move to Shift_DR state
	for (i=0; i < num_bits; i++)
	{
		TDI(dat & 0x01); // shift DR, LSB-first
		dat = dat >> 1;
		retval = retval >> 1;
		if(TDO()) 
		{
			retval |= (0x01L << (num_bits - 1));
		}
		if ( i == (num_bits - 1))
		{
			TMS(1); // move to Exit1_DR state
		}
		JTAG_StrobeTCK();
	}
	TMS(1);
	JTAG_StrobeTCK (); // move to Update_DR
	TMS(0);
	JTAG_StrobeTCK (); // move to RTI state
	return retval;
}

void jtag::JTAG_IWrite(unsigned int ireg, unsigned long dat, int num_bits)
{
	int done;							// TRUE = write complete; FALSE otherwise
	JTAG_IR_Scan (ireg, INST_LENGTH);	// load IR with <ireg>
	dat |= (0x03L << num_bits);			// append ‘WRITE’ opcode to data
										// load DR with <dat>
	JTAG_DR_Scan (dat, num_bits + 2);	// initiate the JTAG write
	
	// load DR with ‘0’, and check for BUSY bit to go to ‘0’.
	do
	{
		done = !(JTAG_DR_Scan (0x0L, 1)); // poll for JTAG_BUSY bit
	} while (!done);
}

unsigned long jtag::JTAG_IRead(unsigned int ireg, int num_bits)
{
	unsigned long retval;						// value returned from READ operation
	int done;									// TRUE = write complete; FALSE otherwise
	JTAG_IR_Scan (ireg, INST_LENGTH);			// load IR with <ireg>
	// load DR with read opcode (0x02)
	JTAG_DR_Scan (0x02L, 2);					// initiate the JTAG read
	do 
	{
		done = !(JTAG_DR_Scan (0x0L, 1));		// poll for JTAG_BUSY bit
	} while (!done);
	retval = JTAG_DR_Scan (0x0L, num_bits + 1); // allow poll operation to
	// read remainder of the bits
	retval = retval >> 1;						// shift JTAG_BUSY bit off the end
	return retval;
}

int jtag::FLASH_ByteWrite(unsigned long addr, unsigned char dat)
{
	unsigned long testval;						// holds result of FLASHDAT read
	int done;									// TRUE/FALSE flag
	int retval;									// TRUE if operation successful
	JTAG_IWrite (FLASHSCL, 0x81L, FLSC_LEN);	// set FLASHSCL based on SYSCLK
	// frequency (2MHz = 0x86)
	// set FLASHADR to address to write to
	JTAG_IWrite (FLASHADR, (unsigned long) addr, FLA_LEN);
	JTAG_IWrite (FLASHCON, 0x10L|ucFCONBIT7, FLCN_LEN);	// set FLASHCON for FLASH Write
	// operation (0x10)
	// initiate the write operation
	JTAG_IWrite (FLASHDAT, (unsigned long) dat, FLD_WRLEN);
	JTAG_IWrite (FLASHCON, 0x0L|ucFCONBIT7, FLCN_LEN);		// set FLASHCON for ‘poll’ operation
	do 
	{
		done = !(JTAG_IRead (FLASHDAT, 1));		// poll for FLBusy to de-assert
	} while (!done);
	testval = JTAG_IRead (FLASHDAT, 2);			// read FLBusy and FLFail
	retval = (testval & 0x02) ? FALSE:TRUE;		// FLFail is next to LSB
	return retval;								// return FLASH Pass/Fail
}

int jtag::FLASH_PageErase(unsigned long addr)
{
	unsigned long testval;						// holds result of FLASHDAT read
	int done;									// TRUE/FALSE flag
	int retval;									// TRUE if operation successful
	JTAG_IWrite (FLASHSCL, 0x81L, FLSC_LEN);	// set FLASHSCL based on SYSCLK
	// frequency (2MHz = 0x86)
	// set FLASHADR to address within page to erase
	JTAG_IWrite (FLASHADR, (unsigned long) addr, FLA_LEN);
	JTAG_IWrite (FLASHCON, 0x20L|ucFCONBIT7, FLCN_LEN);	// set FLASHCON for FLASH Erase
	// operation (0x20)
	JTAG_IWrite (FLASHDAT, 0xa5L, FLD_WRLEN);	// set FLASHDAT to 0xa5 to initiate
	// erase procedure
	JTAG_IWrite (FLASHCON, 0x0L|ucFCONBIT7, FLCN_LEN);		// set FLASHCON for ‘poll’ operation
	do 
	{
		done = !(JTAG_IRead (FLASHDAT, 1));		// poll for FLBusy to de-assert
	} while (!done);
	testval = JTAG_IRead (FLASHDAT, 2);			// read FLBusy and FLFail
	retval = (testval & 0x02) ? FALSE: TRUE;	// FLFail is next to LSB
	// set return value based on FLFail bit
	return retval;								// return FLASH Pass/Fail
}

int jtag::FLASH_ByteRead(unsigned long addr, unsigned char *pdat)
{
	unsigned long testval;								// holds result of FLASHDAT read
	int done;											// TRUE/FALSE flag
	int retval;											// TRUE if operation successful
	JTAG_IWrite (FLASHSCL, 0x80L, FLSC_LEN);			// set FLASHSCL based on SYSCLK
	// frequency (2MHz = 0x86)
	// set FLASHADR to address to read from
	JTAG_IWrite (FLASHADR, (unsigned long) addr, FLA_LEN);
	JTAG_IWrite (FLASHCON, 0x02L|ucFCONBIT7, FLCN_LEN);			// set FLASHCON for FLASH Read
	// operation (0x02)
	JTAG_IRead (FLASHDAT, FLD_RDLEN);					// initiate the read operation
	JTAG_IWrite (FLASHCON, 0x0L|ucFCONBIT7, FLCN_LEN);				// set FLASHCON for ‘poll’ operation
	do 
	{

		done = !(JTAG_IRead (FLASHDAT, 1));				// poll for FLBUSY to de-assert

	} while (!done);
	testval = JTAG_IRead (FLASHDAT, FLD_RDLEN);			// read the resulting data
	retval = (testval & 0x02) ? FALSE: TRUE;			// FLFail is next to LSB
	testval = testval >> 2;								// shift data.0 into LSB position
	*pdat = (unsigned char) testval;					// place data in return location
	return retval;										// return FLASH Pass/Fail
}

unsigned char jtag::CableSetup(unsigned char ucCabtype)
{
	DWORD DWTemp;
	switch(ucCabtype)
	{
	case ALTERABLASTER:
		{
			m_wiTDOPin = 7;
			m_iTDOAddP = 1;
			m_woTCKPin = 0;
			m_woTMSPin = 1;
			m_woTDIPin = 6;
			b_TDONoInv = FALSE;
			SetPortVal(m_nPort+2, 0x0f, 1);				//244使能 OE = 0,
			GetPortVal(m_nPort+1,&DWTemp,1);			//讀取
			DWTemp = DWTemp & 0x08;
			if (!DWTemp)									//DB25-15為低,連接OK
			{
				OutputDebugString("DB25-15連接OK");
			}
			else
			{
				OutputDebugString("DB25-15與GND連接失敗!");
				return 1;						
			}

			//判斷DB25 7-10腳是否相連
			SetPortVal(m_nPort, 0x20, 1);				//設置DB25-7為高,以讀取DB25-10的電平
			GetPortVal(m_nPort+1,&DWTemp,1);			//讀取
			DWTemp = DWTemp & 0x40;						//DB25-10為高,連接OK
			if (DWTemp)									
			{
				OutputDebugString("DB25-7 -- 10 高測試OK");
			}
			else
			{
				OutputDebugString("DB25-7 -- 10 連接失敗");
				return 2;						
			}

			SetPortVal(m_nPort, 0x00, 1);				//設置DB25-7為高,以讀取DB25-10的電平
			GetPortVal(m_nPort+1,&DWTemp,1);			//讀取
			DWTemp = DWTemp & 0x40;						//DB25-10為低,連接OK
			if (!DWTemp)									
			{
				OutputDebugString("DB25-7 -- 10 低測試OK");
			}
			else
			{
				OutputDebugString("DB25-7 -- 10 連接失敗");
				return 3;						
			}
			
		}break;
	case PARALLELIII:
		{
			m_wiTDOPin = 4;
			m_iTDOAddP = 1;
			m_woTCKPin = 1;
			m_woTMSPin = 2;
			m_woTDIPin = 0;
			b_TDONoInv = TRUE;
			SetPortVal(m_nPort, 0x40, 1);				//設置DB25-8為高,以讀取Db25- 11,12引腳電平, 74125 C腳低(使能)
			GetPortVal(m_nPort+1,&DWTemp,1);			//讀取11,12電平, 0X1x xxxx
			if ((DWTemp | 0x7F)==0x7F)					//11腳為低
			{
				TRACE("連接11(低)腳成功!");
			}
			else
			{
				TRACE("連接11(低)腳失敗!");
				return 3;
			}

			if ((DWTemp & 0x20)==0x20)					//13腳為高
			{
				TRACE("連接31腳成功!");
			}
			else
			{
				TRACE("連接13腳失敗!");
				return 4;
			}

		}break;
	default:
		{
			TRACE("Error select cable type!!!");
		}
	}
	JTAG_Reset ();							// Reset the JTAG state machine on DUT
	return 0;

}


unsigned long jtag::JtagGetIDCode()
{
		unsigned long ulid;
		JTAG_IR_Scan (RESET, INST_LENGTH);					// Reset the DUT
		JTAG_IR_Scan (IDCODE, INST_LENGTH);					// load IDCODE into IR and HALT the DUT
		ulid = JTAG_DR_Scan (0x0L, IDCODE_LEN);					// read the IDCODE
		
		TRACE("ID號是:0x%08X",ulid);
		return ulid;
}

void jtag::ResetCpu()
{
	JTAG_Reset ();												// Reset the JTAG state machine on DUT
	JTAG_IR_Scan (IDCODE&0x0FFF, INST_LENGTH);					// Reset the DUT
}

int jtag::SelectCPU(unsigned int uiCouType)
{
	switch(uiCouType)
	{
		case C8051F020:
			{
				FLA_LEN	= 16;				//16			// number of bits in FLASHADR			
			}break;
		case C8051F120:
			{
				FLA_LEN	= 17;				//17			// number of bits in FLASHADR
			}break;

	}
	return 0;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美电影免费提供在线观看| 69av一区二区三区| 国产丝袜欧美中文另类| 色菇凉天天综合网| 欧美一区二区日韩| 91小视频在线免费看| 日韩一区二区三区视频| 91精品国产一区二区三区| 国产精品色哟哟网站| 久久成人麻豆午夜电影| 精品国产乱码久久久久久蜜臀| 97久久超碰精品国产| 91精品国产综合久久精品| 亚洲欧美日韩综合aⅴ视频| 一区二区三区四区蜜桃 | 91免费看视频| 欧美精品一区二区三区高清aⅴ| 日韩一区二区精品葵司在线| 日韩欧美不卡一区| 亚洲va天堂va国产va久| 日本欧美一区二区| 欧美色精品在线视频| 亚洲欧洲国产日本综合| 成人永久aaa| 国产亚洲综合在线| 国产福利精品一区| 欧美tickling挠脚心丨vk| 久久精品亚洲乱码伦伦中文| 天天影视网天天综合色在线播放 | 日韩精品亚洲一区二区三区免费| 亚洲猫色日本管| 亚洲福利一区二区三区| 色又黄又爽网站www久久| 国产精品成人一区二区艾草| 国产精品亚洲一区二区三区妖精 | 国产精品天干天干在线综合| 奇米精品一区二区三区在线观看| 日本视频在线一区| 91精品国产欧美一区二区| 久久蜜桃av一区精品变态类天堂| 1024国产精品| 91视频免费看| 亚洲一区二区精品久久av| 欧美中文字幕一区二区三区亚洲 | 中文字幕av资源一区| 国产91丝袜在线播放九色| 亚洲自拍另类综合| 欧美日韩国产影片| 免费成人美女在线观看.| 2023国产一二三区日本精品2022| 亚洲欧洲日韩av| 91捆绑美女网站| 丝瓜av网站精品一区二区| k8久久久一区二区三区 | 亚洲视频你懂的| 91电影在线观看| 日韩精品一二三| 久久婷婷成人综合色| 99久久精品免费看国产| 亚洲图片欧美色图| 欧美大片国产精品| 成人免费高清在线| 亚洲一区二区免费视频| 2024国产精品| 久久国产综合精品| 亚洲视频在线一区二区| 日韩一卡二卡三卡四卡| 成人免费视频国产在线观看| 洋洋av久久久久久久一区| 日韩精品一区二区三区在线| 亚洲成人精品在线观看| 精品国产sm最大网站免费看| 成人av高清在线| 蜜臀av在线播放一区二区三区| 欧美另类z0zxhd电影| 亚洲在线成人精品| 欧美va日韩va| 欧美色图天堂网| 国产成人综合在线| 欧美国产一区二区在线观看| 欧美色图12p| 成人网在线播放| 极品少妇一区二区| 偷窥少妇高潮呻吟av久久免费| 一本色道久久综合精品竹菊| 六月丁香婷婷久久| 一区二区三区免费看视频| 国产亚洲欧美日韩日本| 成人精品鲁一区一区二区| 日韩电影在线观看一区| 欧美成人性福生活免费看| 精品在线一区二区| 成人免费av在线| 奇米四色…亚洲| 亚洲国产精品一区二区www在线| 欧美亚洲愉拍一区二区| 成人精品一区二区三区四区| 激情欧美一区二区| 日韩精品国产欧美| 久久日一线二线三线suv| 欧美日韩国产小视频在线观看| 五月激情综合色| 亚洲精品乱码久久久久久久久| 欧洲亚洲国产日韩| 成人看片黄a免费看在线| 国产精品一区在线观看乱码| 免费在线观看视频一区| 国产色产综合产在线视频| 欧美不卡一区二区| 91精品国产麻豆| 777亚洲妇女| 成人午夜在线视频| 丁香六月综合激情| 亚洲自拍都市欧美小说| 亚洲欧美激情小说另类| 亚洲天天做日日做天天谢日日欢 | 久久精品亚洲国产奇米99| 日韩午夜av一区| 精品少妇一区二区三区在线播放 | 高清视频一区二区| 国产成人综合在线播放| 一区二区三区中文字幕| 亚洲色欲色欲www| 亚洲精品大片www| 午夜精品视频一区| 久久er99热精品一区二区| 久久超级碰视频| 国产成人在线影院 | 国产成人在线看| 国产成人综合在线播放| 成人精品在线视频观看| 在线免费不卡电影| 91精品国产福利在线观看| 精品国产污污免费网站入口 | 午夜精品久久久久久久99樱桃 | 福利一区二区在线观看| 性感美女久久精品| 麻豆成人久久精品二区三区小说| 有码一区二区三区| 日本不卡的三区四区五区| 精品一区二区三区免费播放| 国产成人免费视频精品含羞草妖精| 亚洲午夜电影网| 中文字幕日韩一区| 午夜精品福利视频网站| 激情欧美一区二区| 91在线一区二区| 678五月天丁香亚洲综合网| 久久久久国产精品麻豆ai换脸| 欧美三级日本三级少妇99| 欧美一区三区二区| 国产午夜亚洲精品不卡| 欧美mv日韩mv国产网站| 国产精品网站导航| 日韩成人一区二区| 成人av在线电影| 9191久久久久久久久久久| 欧美理论在线播放| 中文字幕乱码久久午夜不卡| 337p粉嫩大胆噜噜噜噜噜91av| 6080国产精品一区二区| 欧美日韩在线播放一区| 欧美中文字幕一二三区视频| 色综合夜色一区| 精品三级在线看| 亚洲国产sm捆绑调教视频| 国产宾馆实践打屁股91| 91精品国产手机| 亚洲一区在线看| 成人免费观看男女羞羞视频| 日韩亚洲欧美一区二区三区| 亚洲天堂av一区| 成人综合婷婷国产精品久久蜜臀 | 亚洲.国产.中文慕字在线| 国产成人av电影在线观看| 91麻豆精品久久久久蜜臀| 欧美一区日韩一区| 日韩精品一区二区三区视频在线观看 | 日韩欧美电影在线| 日韩精品一区二区三区三区免费 | 欧美另类z0zxhd电影| 亚洲少妇30p| 天天av天天翘天天综合网 | av资源网一区| 久久午夜国产精品| 麻豆精品新av中文字幕| 极品少妇一区二区三区精品视频 | 久久成人久久爱| 欧美日韩不卡视频| 一区二区三区四区av| 成人av资源在线观看| 国产精品第四页| 粉嫩av一区二区三区粉嫩 | 久久久久久久久久久久电影| 国产欧美一区视频| 亚洲天堂成人网| 日本韩国精品在线| 日韩理论片在线| 色噜噜久久综合| 亚洲高清不卡在线观看|