#include <reg52.h>
#include "define.h"
#include "jtag.h"
BYTE data CurState;
BYTE data MsgMode;
BYTE xdata TDI_Buffer[26];
BYTE xdata TDO_Buffer[22];
BYTE xdata MASK_Buffer[22];
BYTE xdata Scon_Buffer[32];
void main(void)
{
BYTE data result,i;
SysInit();
Init_JTAG();
result = NoResult;
MsgMode = Idle_Msg;
while(1)
{
while(MsgMode == Idle_Msg);
switch(MsgMode)
{
case EnterProgram_Msg:
MsgMode = Idle_Msg;
Init_JTAG();
result = SUCCESS;
break;
case CheckIDCode_Msg:
MsgMode = Idle_Msg;
result = Check_IDCode();
break;
case ProgramBscanRegister_Msg:
MsgMode = Idle_Msg;
result = Program_Bscan_Register();
break;
case EnableProgram_Msg:
MsgMode = Idle_Msg;
result = Enable_Program();
break;
case EraseDevice_Msg:
MsgMode = Idle_Msg;
result = Erase_Device();
break;
case ReadStatusBit_Msg:
MsgMode = Idle_Msg;
result = Read_Status_Bit();
break;
case InitAddress_Msg:
MsgMode = Idle_Msg;
result = Init_Address();
break;
case Program1Row_Msg:
MsgMode = Idle_Msg;
for(i = 0;i < 16;i++)TDI_Buffer[i] = Scon_Buffer[15-i];
result = Program_Row();
break;
case ProgramUserCode_Msg:
MsgMode = Idle_Msg;
result = Program_User_Code();
break;
case ReadIncrRti_Msg:
MsgMode = Idle_Msg;
result = LSC_READ_INCR_NV();
break;
case Verify1Row_Msg:
MsgMode = Idle_Msg;
for(i = 0;i < 16;i++)TDO_Buffer[i] = Scon_Buffer[15-i];
result = Verify_Row();
break;
case VerifyUserCode_Msg:
MsgMode = Idle_Msg;
result = Verify_User_Code();
break;
case ProgramDoneBit_Msg:
MsgMode = Idle_Msg;
result = Program_Done_Bit();
break;
case ExitProgram_Msg:
MsgMode = Idle_Msg;
Exit_Program();
result = Refresh();
break;
case Idle_Msg:
break;
default:
MsgMode = Idle_Msg;
result = INVALID;
}
if(result == SUCCESS){result = NoResult;Uart_Send1Byte(SuccessByte);}
else if (result == FAIL){result = NoResult;Uart_Send1Byte(FailByte);}
else if (result == INVALID){result = NoResult;Uart_Send1Byte(InvalidByte);}
}
}
/***************************
system init
***************************/
void SysInit(void)
{
EA = 0;
EXTRAM = 0x02;
TMOD = 0x11;
TH0 = 0xf2;
TL0 = 0x00;
TH1 = 0x00;
TL1 = 0x00;
ET0 = 0;
PT0 = 0;
TR0 = 0;
ET1 = 0;
PT1 = 0;
TR1 = 0;
IT0 = 0;
PX0 = 0;
EX0 = 0;
IT1 = 0;
EX1 = 0;
PX1 = 0;
RCAP2H = 0xff;
RCAP2L = 0xea;//57600
TH2 = 0;
TL2 = 0;
T2CON = 0x34;
SCON = 0x50;
PS = 1;
ES = 1;
TXEN = 0;
EA = 1;
}
void Uart_Send1Byte(BYTE x)
{
ES = 0;
TI = 0;
SBUF = x;
while(!TI);
TI = 0;
ES = 1;
}
void SconInt(void) interrupt 4
{
BYTE data temp;
ES = 0;
temp = SBUF;RI = 0;
if(temp != 0x00)goto exit;/*固定值*/
if(Scon_Wait_Time_Out())goto exit;
temp = SBUF;RI = 0;
if(temp != 0xaa)goto exit;/*固定值*/
if(Scon_Wait_Time_Out())goto exit;
temp = SBUF;RI = 0;
if(temp != 0x55)goto exit;/*固定值*/
if(Scon_Wait_Time_Out())goto exit;
temp = SBUF;RI = 0;
if(temp != 0x00)goto exit;/*固定值*/
/*如果前面4个字节都正确,说明是一条有效信息*/
Receive_Conifg();/*进入配置模式接收程序*/
exit:
ES = 1;
}
/*接收配置命令及内容*/
void Receive_Conifg(void)
{
BYTE data temp,tempx,checksum;
BYTE data i,len;
//Uart_Send1Byte(SuccessByte);
checksum = 0;
if(Scon_Wait_Time_Out() == SUCCESS)goto error;
tempx = SBUF;RI = 0;
checksum = checksum + tempx;
if(Scon_Wait_Time_Out() == SUCCESS)goto error;
temp = SBUF;RI = 0;
checksum = checksum + temp;
if(temp != tempx)goto error;
if(Scon_Wait_Time_Out() == SUCCESS)goto error;
temp = SBUF;RI = 0;
checksum = checksum + temp;
len = temp;
if(Scon_Wait_Time_Out() == SUCCESS)goto error;
temp = SBUF;RI = 0;
checksum = checksum + temp;
len = (len << 8)|temp;
for(i = 0;i < len;i++)
{
if(Scon_Wait_Time_Out()== SUCCESS)goto error;
temp = SBUF;RI = 0;
checksum = checksum + temp;
Scon_Buffer[i] = temp;
}
if(Scon_Wait_Time_Out()== SUCCESS)goto error;
temp = SBUF;RI = 0;
if(checksum != temp)goto error;
MsgMode = tempx;
return;
error:
Uart_Send1Byte(CommErrorByte);
}
/*****************
等待50ms
*****************/
BYTE Scon_Wait_Time_Out(void)
{
WORD data j;
for(j = 0;j < 0x5000;j++)
{
if(RI == 1) return(FAIL);
}
return(SUCCESS);
}
///////////////////串口相关END////////////////////////
void Set_JTAG_State_Machine(BYTE nextstate)
{
BYTE data i,j,temp;
if((CurState == nextstate)&&(CurState != RESET))return;
for(i = 0;i < 25;i++)
{
if((CurState == JTAGStateTable[i].CurState)&&(nextstate == JTAGStateTable[i].NextState))break;
}
CurState = nextstate;
temp = JTAGStateTable[i].Pattern;
for(j = 0;j < JTAGStateTable[i].Pulses;j++)
{
if((temp & 0x80)== 0x80)TMSPin = 0x01;
else TMSPin = 0x00;
Send_1Clk();
temp = temp << 1;
}
TDIPin = 0x00;
TMSPin = 0x00;
}
/****************************************
Excute SIR instruction
*****************************************/
BYTE Excute_SIR(BYTE instruction)
{
BYTE data i;
Set_JTAG_State_Machine(IRPAUSE);
Set_JTAG_State_Machine(SHIFTIR);
for(i = 0;i < 8;i++)
{
TDIPin = instruction&0x01;
instruction = instruction >> 1;
if(i < 7)Send_1Clk();
}
Set_JTAG_State_Machine(IRPAUSE);
return(SUCCESS);
}
/*************************************************
Excute SIR instruction with TDO data and mask data
*************************************************/
BYTE Excute_SIRX(BYTE instruction,BYTE TDO_data,BYTE mask_data)
{
BYTE data i,result;
result = SUCCESS;
Set_JTAG_State_Machine(IRPAUSE);
Set_JTAG_State_Machine(SHIFTIR);
for(i = 0;i < 8;i++)
{
TDIPin = instruction & 0x01;
if((TDO_data & mask_data & 0x01)!= TDOPin) result = FAIL;
instruction = instruction >> 1;
TDO_data = TDO_data >> 1;
mask_data = mask_data >> 1;
if(i < 7)Send_1Clk();
}
Set_JTAG_State_Machine(IRPAUSE);
return(result);
}
/*************************************************
Excute SDR instruction with TDO data and mask data
*************************************************/
BYTE Excute_SDR(BYTE bit_len,BYTE TDI_mark,BYTE TDO_mark,BYTE mask_mark)
{
BYTE data i;
BYTE data TDI_data,TDO_data,mask_data,ptr,result;
ptr = 0;
result = SUCCESS;
Set_JTAG_State_Machine(DRPAUSE);
Set_JTAG_State_Machine(SHIFTDR);
for(i = 0;i < bit_len;i++)
{
if((i%8)== 0)
{
if(TDI_mark == 1)TDI_data = TDI_Buffer[ptr];else TDI_data = 0x00;
if(mask_mark == 1)mask_data = MASK_Buffer[ptr];else mask_data = 0xff;
TDO_data = TDO_Buffer[ptr];
ptr++;
}
if((TDI_data & 0x01) == 0x01) TDIPin = 1; else TDIPin = 0;
if((TDO_mark == 1)&&((mask_data & 0x01) == 0x01))
{
if((TDO_data & 0x01) != TDOPin) result = FAIL;
}
TDI_data = TDI_data >> 1;
TDO_data = TDO_data >> 1;
mask_data = mask_data >> 1;
if((i+1) < bit_len)Send_1Clk();
}
Set_JTAG_State_Machine(DRPAUSE);
return(result);
}
/************************************
! Check the IDCODE
! Shift in IDCODE_PUB(0xE0) instruction
SIR 8 TDI (E0);
SDR 32 TDI (00000000)
TDO (012B2043)
MASK (FFFFFFFF);
**************************************/
BYTE Check_IDCode(void)
{
BYTE data result;
SIMJTAG MCU模拟JTAG口在线编程CPLD_v1
5星 · 超过95%的资源 需积分: 50 153 浏览量
2019-02-25
14:56:23
上传
评论 3
收藏 32KB RAR 举报
大码路呀
- 粉丝: 22
- 资源: 43
最新资源
- Unity WebGL(IIS)配置pdf文档
- 三菱PLC例程源码电机高低速变换
- 【matlab / python / tkinter / BasicSR】基于EDVR SRCNN FSRCNN 的超分辨率部署
- 3400-CMN3400-VB一款N-Channel沟道SOT23的MOSFET晶体管参数介绍与应用说明
- 336P-VB一款SOT23封装P-Channel场效应MOS管
- untitled0 - 副本.py
- 基于python+opencv开发的图片批量去黑边+裁剪+压缩工具源码+开发文档+实用教程(期末大作业&课设&项目开发)
- 三菱PLC例程源码电镀线程序
- 从PDF文件中读取表格内容并写入到EXCEL文档的pyton小程序
- 3365-VB一款P-Channel沟道SOT23的MOSFET晶体管参数介绍与应用说明
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈