ZHOUSHIKE
驱动牛犊
驱动牛犊
  • 注册日期2002-04-22
  • 最后登录2002-06-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1167回复:0

怎样通过Jtag口读芯片的signature?

楼主#
更多 发布于:2002-06-05 16:32
我要用Jtag做一个编程器,首先我要读取芯片的signature以确认我的芯片flash是否能被编程。可是无论我怎么试,都无法正确的读出芯片的signature值,请问高手我该怎么做。谢谢指教!
我的源代码如下:

void CJtagView::WriteData(int tms, int tdi,int rp)
{
    //该函数中的参数rp为计数器
//在TCK的上升沿写入数据,在TCK的下降沿读入数据,每写入、读出一个数据都需要写入两个TCK脉冲。
port->WriteData(0x378,tdi+tms*4);             // TCK low
port->WriteData(0x378,tdi+tms*4+2);           // TCK high
}

int CJtagView::WriteDataReturn(int tms, int tdi,int rp)
{
    int tdo=0;
    //该函数中的参数rp为计数器
//在TCK的上升沿写入数据,在TCK的下降沿读入数据,没写入、读出一个数据都需要写入两个TCK脉冲。
port->WriteData(0x378,tdi+tms*4);             // TCK low
port->WriteData(0x378,tdi+tms*4+2);           // TCK high
if(rp==5)
port->WriteData(0x378,tdi+tms*4);    // TCK low
if(rp==5)
tdo=((port->ReadData(0x379))&0x10)>>4;           // 读状态位
return tdo;
}
void CJtagView::Write9a()
{
//写入9a指令
//在连续15个TCK的上升沿使tdi=010-0011-0000-1000
SelectShiftIR();

WriteData(0,0,5);
WriteData(0,0,5);
WriteData(0,0,5);
WriteData(0,1,5);

WriteData(0,0,5);
WriteData(0,0,5);
WriteData(0,0,5);
WriteData(0,0,5);

WriteData(0,1,5);
WriteData(0,1,5);
WriteData(0,0,5);
WriteData(0,0,5);

WriteData(0,0,5);
WriteData(0,1,5);
WriteData(1,0,5);     //在最后一个TCK上升沿使tms为1
ReturnFromEUpdate();
}

int CJtagView::ReadSignatureBytes(short unsigned addr)
{
    int sig=0;
// Write9a();
//用9b指令加载地址位
SelectShiftIR();
//写入9b指令
  
//在连续8个TCK的上升沿使tdi的值从高位到低位排列,组成一个整数
int bit;
bit=addr%2;
WriteData(0,bit,5);
bit=(addr%4)/2;
WriteData(0,bit,5);
bit=(addr%8)/4;
WriteData(0,bit,5);
bit=(addr%16)/8;
WriteData(0,bit,5);
bit=(addr%32)/16;
WriteData(0,bit,5);
bit=(addr%64)/32;
WriteData(0,bit,5);
bit=(addr%128)/64;
WriteData(0,bit,5);
bit=addr/128;
WriteData(0,bit,5);
//在连续7个TCK的上升沿使tdi=000-0011
WriteData(0,1,5);
WriteData(0,1,5);
WriteData(0,0,5);
WriteData(0,0,5);

WriteData(0,0,5);
WriteData(0,0,5);
WriteData(1,0,5);

    //在最后一个TCK上升沿使tms为1
ReturnFromEUpdate();

//用9c指令加载地址位对应的值
SelectShiftIR();
//写入9c指令的前半个指令码
//在连续15个TCK的上升沿使tdi=011-0010-0000-0000
WriteData(0,0,5);
WriteData(0,0,5);
WriteData(0,0,5);
WriteData(0,0,5);

WriteData(0,0,5);
WriteData(0,0,5);
WriteData(0,0,5);
WriteData(0,0,5);

WriteData(0,0,5);
WriteData(0,1,5);
WriteData(0,0,5);
WriteData(0,0,5);

WriteData(0,1,5);
WriteData(0,1,5);
WriteData(1,0,5);     //在最后一个TCK上升沿使tms为1
ReturnFromEUpdate();

//写入9c指令的后半个指令码
    int a[10];
int t0,t1,t2,t3,t4,t5,t6,t7;
////在连续8个TCK的上升沿使tdi=000-0000,然后在tdo下降沿读取签名
t0=WriteDataReturn(0,0,5);
t1=WriteDataReturn(0,0,5);
t2=WriteDataReturn(0,0,5);
t3=WriteDataReturn(0,0,5);
t4=WriteDataReturn(0,0,5);
t5=WriteDataReturn(0,0,5);
t6=WriteDataReturn(0,0,5);
t7=WriteDataReturn(0,0,5);
//在连续7个TCK的上升沿使tdi=011-0011
a[0]=WriteDataReturn(0,1,5);
a[1]=WriteDataReturn(0,1,5);
a[2]=WriteDataReturn(0,0,5);
a[3]=WriteDataReturn(0,0,5);

a[4]=WriteDataReturn(0,1,5);
a[5]=WriteDataReturn(0,1,5);
a[6]=WriteDataReturn(1,0,5);
  
ReturnFromEUpdate();
    sig=t0+t1*2+t2*4+t3*8+t4*16+t5*32+t6*64+t7*128;
return sig;
}

void CJtagView::ReadSig()
{
int byte0,byte1,byte2;
    Write9a();
byte0=ReadSignatureBytes(0);
byte1=ReadSignatureBytes(1);
byte2=ReadSignatureBytes(2);

CString temp;
temp.Format(\"%d-%d-%d\",byte0,byte1,byte2);
AfxMessageBox(temp);
if((byte0==0x1e)&&(byte1==0x97)&&(byte2==0x02))
{
AfxMessageBox(\"ok!\");
}
else
{
// AfxMessageBox(\"Fail!\");
}
}
游客

返回顶部