阅读:1167回复:0
怎样通过Jtag口读芯片的signature?
我要用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!\"); } } |
|