No uglavnom, pokušavam isprogramirat FPGA preko bin file-a bez programatora i taj dio radi, jednostavno sam s logičkim analizatorom pratio komunikaciju između FPGA i usb blastera, napisao arduino program da čita bin file s sd kartice i ok uspio sam isprogramirat FPGA.
E sad pošto sve to trebam prebacit na STM32 a i bilo bi ok zapravo razumjet što se događa u komunikaciji zanima me dal neko ima kakvu literaturu o JTAG komunikaciji?? ovo sve što sam na google-u našao mi ne služi praktički nićemu.... sve je to površno.
Zapravo me zanima recimo nalazim se u data registru i hoću iči u instruction registar, dali smijem iči u "run test/idle state" ili moram odma u instruction registar ili će ono što je uprisano u DR biti izbrisano?
Odnosno dali je isto:
exit DR -> update DR -> select DR -> select IR -> capture IR -> shift IR
kao i:
exit DR -> update DR -> ->run test/idle -> select DR -> select IR -> capture IR -> shift IR
Isto tako nije mi baš najjasnije zašto nekad program ide kroz exit DR i update DR s data line = 1 a nekad je 0?
Zašto nekada program više puta u isti registar upisuje istu vrijednost??? Recimo dva tri puta prolazi kroz instruction registar i upisuje iste vrijednosti??
no kao što vidite nemam pojma ništa o JTAG-u pa ako neko ima nekakvu literaturu bilo bi super.
Ako nekoga interesira arduino program .. eto ga
Code: Select all
#include <SPI.h>
#include <SD.h>
const int chipSelect = 4; //SPI_sd card
const int TDO = 5;
const int TCK = 6;
const int TMS = 7;
void setup() {
pinMode(TDO, OUTPUT);
pinMode(TMS, OUTPUT);
pinMode(TCK, OUTPUT);
digitalWrite(TDO, LOW);
digitalWrite(TMS, LOW);
digitalWrite(SCK, LOW);
Serial.begin(9600);
BeforeFile();
File dataFile = SD.open("Led73_bin.bin");
if (dataFile) {
while (dataFile.available()) {
byte i = dataFile.read();
shiftOut(TDO, TCK, LSBFIRST, i);
}
dataFile.close();
AfterFile();
}
}
void loop() {
}
void BeforeFile(){
digitalWrite(TDO, HIGH);
digitalWrite(TMS, HIGH);
for (int v = 0; v< 6; v++){Clock();}
digitalWrite(TMS, LOW);
Clock(); //In Run test/idle
shift_DR();
shiftOut(TDO, TCK, LSBFIRST, 0xFF);
shiftOut(TDO, TCK, LSBFIRST, 0xC0);
shiftOut(TDO, TCK, LSBFIRST, 0xEC);
shiftOut(TDO, TCK, LSBFIRST, 0x0F);
digitalWrite(TDO, HIGH);
for (int v = 0; v< 95; v++){Clock();}
From_Register_To_Shift_Ir(); //in shift ir
shiftOut(TDO, TCK, LSBFIRST, 0xFF);
shiftOut(TDO, TCK, LSBFIRST, 0xC0);
shiftOut(TDO, TCK, LSBFIRST, 0xEC);
shiftOut(TDO, TCK, LSBFIRST, 0x0F);
digitalWrite(TDO, HIGH);
for (int v = 0; v< 95; v++){Clock();}
From_Register_To_Shift_Ir(); //in shift ir
shiftOut(TDO, TCK, LSBFIRST, 0xFF);
shiftOut(TDO, TCK, LSBFIRST, 0xC0);
shiftOut(TDO, TCK, LSBFIRST, 0xEC);
shiftOut(TDO, TCK, LSBFIRST, 0x0F);
digitalWrite(TDO, HIGH);
for (int v = 0; v< 95; v++){Clock();}
From_Register_To_Shift_Dr(); //in shift ir
shiftOut(TDO, TCK, LSBFIRST, 0xFF);
shiftOut(TDO, TCK, LSBFIRST, 0xC0);
shiftOut(TDO, TCK, LSBFIRST, 0xEC);
shiftOut(TDO, TCK, LSBFIRST, 0x0F);
digitalWrite(TDO, HIGH);
for (int v = 0; v< 95; v++){Clock();}
From_Register_To_Shift_Ir();
Clock();
shiftOut(TDO, TCK, LSBFIRST, 0xFF);
From_Register_To_Shift_Dr();
digitalWrite(TMS, HIGH);
digitalWrite(TDO,LOW);
Clock();
digitalWrite(TDO,HIGH);
Clock();
Clock();
Clock();
digitalWrite(TMS, LOW);
Clock();
Clock();
shiftOut(TDO, TCK, LSBFIRST, 0xFE);
shiftOut(TDO, TCK, LSBFIRST, 0xFF);
digitalWrite(TDO,HIGH);
Clock();
From_Register_To_Shift_Ir();
digitalWrite(TDO,LOW);
Clock();
shiftOut(TDO, TCK, LSBFIRST, 0x03);
digitalWrite(TMS, HIGH);
Clock();
digitalWrite(TDO,HIGH);
Clock();
digitalWrite(TMS, LOW);
shiftOut(TDO, TCK, LSBFIRST, 0xFF);
shiftOut(TDO, TCK, LSBFIRST, 0xFF);
digitalWrite(TMS, HIGH);
digitalWrite(TDO, HIGH);
Clock();
digitalWrite(TMS, LOW);
Clock();
Clock();
digitalWrite(TDO, LOW);
shiftOut(TDO, TCK, LSBFIRST, 0x00);
shiftOut(TDO, TCK, LSBFIRST, 0x00);
shiftOut(TDO, TCK, LSBFIRST, 0x00);
shiftOut(TDO, TCK, LSBFIRST, 0x00);
shiftOut(TDO, TCK, LSBFIRST, 0x50);
shiftOut(TDO, TCK, LSBFIRST, 0x15);
shiftOut(TDO, TCK, LSBFIRST, 0x00);
Clock();
Clock();
Clock();
Clock();
Clock();
Clock();
Clock();
digitalWrite(TMS, HIGH);
Clock();
digitalWrite(TDO, HIGH);
Clock();
digitalWrite(TMS, LOW);
Clock();
digitalWrite(TMS, HIGH);
Clock();
Clock();
digitalWrite(TMS, LOW);
Clock();
Clock();
digitalWrite(TDO, LOW);
Clock();
shiftOut(TDO, TCK, LSBFIRST, 0x68);
digitalWrite(TMS, HIGH);
digitalWrite(TDO, HIGH);
Clock();
Clock();
digitalWrite(TMS, LOW);
shiftOut(TDO, TCK, LSBFIRST, 0xFF);
shiftOut(TDO, TCK, LSBFIRST, 0xFF);
digitalWrite(TMS, HIGH);
digitalWrite(TDO, HIGH);
Clock();
Clock();
digitalWrite(TMS, LOW);
Clock();
Clock();
digitalWrite(TDO, LOW);
Clock();
shiftOut(TDO, TCK, LSBFIRST, 0x01);
digitalWrite(TMS, HIGH);
Clock();
digitalWrite(TDO, HIGH);
Clock();
digitalWrite(TMS, LOW);
for (int i = 0; i<255; i++){
shiftOut(TDO, TCK, LSBFIRST, 0xFF);
shiftOut(TDO, TCK, LSBFIRST, 0xFF);
shiftOut(TDO, TCK, LSBFIRST, 0xFF);
shiftOut(TDO, TCK, LSBFIRST, 0xFF);
shiftOut(TDO, TCK, LSBFIRST, 0xFF);
shiftOut(TDO, TCK, LSBFIRST, 0xFF);
shiftOut(TDO, TCK, LSBFIRST, 0xFF);
shiftOut(TDO, TCK, LSBFIRST, 0xFF);
}
digitalWrite(TMS, HIGH);
digitalWrite(TDO, HIGH);
Clock();
digitalWrite(TMS, LOW);
Clock();
Clock();
for (int i = 0; i<37; i++){
shiftOut(TDO, TCK, LSBFIRST, 0xFF);
}
return;
}
void AfterFile(){
digitalWrite(TDO, LOW);
for (int i = 0; i<31; i++){
Clock();
}
digitalWrite(TMS, HIGH);
Clock();
digitalWrite(TDO, HIGH);
Clock();
Clock();
Clock();
digitalWrite(TMS, LOW);
Clock();
Clock();
digitalWrite(TDO, LOW);
Clock();
shiftOut(TDO, TCK, LSBFIRST, 0x02);
digitalWrite(TMS, HIGH);
Clock();
digitalWrite(TDO, HIGH);
Clock();
digitalWrite(TMS, LOW);
shiftOut(TDO, TCK, LSBFIRST, 0xFF);
shiftOut(TDO, TCK, LSBFIRST, 0xFF);
digitalWrite(TDO, HIGH);
digitalWrite(TMS, HIGH);
Clock();
digitalWrite(TMS, LOW);
Clock();
Clock();
digitalWrite(TDO, LOW);
Clock();
for (int i = 0; i< 150; i++){
shiftOut(TDO, TCK, LSBFIRST, 0x00);
}
Clock();
Clock();
digitalWrite(TMS, HIGH);
Clock();
digitalWrite(TDO, HIGH);
Clock();
digitalWrite(TMS, LOW);
Clock();
digitalWrite(TMS, HIGH);
Clock();
Clock();
digitalWrite(TMS, LOW);
Clock();
Clock();
digitalWrite(TDO, LOW);
Clock();
shiftOut(TDO, TCK, LSBFIRST, 0xFF);
shiftOut(TDO, TCK, LSBFIRST, 0xFF);
From_Register_To_Shift_Ir();
Clock();
shiftOut(TDO, TCK, LSBFIRST, 0x01);
digitalWrite(TMS, HIGH);
Clock();
digitalWrite(TDO, HIGH);
Clock();
digitalWrite(TMS, LOW);
Clock();
for (int i = 0; i< 150; i++){
shiftOut(TDO, TCK, LSBFIRST, 0xFF);
}
digitalWrite(TDO, HIGH);
digitalWrite(TMS, HIGH);
Clock();
Clock();
digitalWrite(TMS, LOW);
Clock();
Clock();
digitalWrite(TDO, LOW);
Clock();
shiftOut(TDO, TCK, LSBFIRST, 0x03);
digitalWrite(TMS, HIGH);
Clock();
digitalWrite(TDO, HIGH);
Clock();
digitalWrite(TMS, LOW);
shiftOut(TDO, TCK, LSBFIRST, 0xFF);
shiftOut(TDO, TCK, LSBFIRST, 0xFF);
digitalWrite(TMS, HIGH);
Clock();
digitalWrite(TMS, LOW);
Clock();
Clock();
shiftOut(TDO, TCK, LSBFIRST, 0x00);
shiftOut(TDO, TCK, LSBFIRST, 0x00);
shiftOut(TDO, TCK, LSBFIRST, 0x00);
shiftOut(TDO, TCK, LSBFIRST, 0x00);
shiftOut(TDO, TCK, LSBFIRST, 0xA8);
shiftOut(TDO, TCK, LSBFIRST, 0xCA);
shiftOut(TDO, TCK, LSBFIRST, 0x1F);
Clock();
Clock();
digitalWrite(TDO, HIGH);
Clock();
digitalWrite(TDO, LOW);
Clock();
digitalWrite(TDO, HIGH);
Clock();
digitalWrite(TDO, LOW);
Clock();
digitalWrite(TDO, HIGH);
Clock();
digitalWrite(TDO, LOW);
digitalWrite(TMS, HIGH);
Clock();
digitalWrite(TDO, HIGH);
Clock();
digitalWrite(TMS, LOW);
Clock();
digitalWrite(TMS, HIGH);
Clock();
Clock();
Clock();
Clock();
Clock();
Clock();
digitalWrite(TDO, HIGH);
delay(2000);
return;
}
void shift_DR(){
digitalWrite(TMS, HIGH);
Clock(); //dr scan
digitalWrite(TMS, LOW);
Clock(); //capture dr
Clock(); //shift dr
return;
}
void From_Register_To_Shift_Ir(){
digitalWrite(TDO, HIGH);
digitalWrite(TMS, HIGH);
Clock();
Clock();
Clock();
Clock();
digitalWrite(TMS, LOW);
Clock();
Clock();
return;
}
void From_Register_To_Shift_Dr(){
digitalWrite(TDO, HIGH);
digitalWrite(TMS, HIGH);
Clock();
Clock();
Clock();
digitalWrite(TMS, LOW);
Clock();
Clock();
return;
}
void Clock(){
digitalWrite(TCK, HIGH);
digitalWrite(TCK, LOW);
return;
}
Program je majko moja mila užaš našta to liči ali to je samo za početak da vidim dali je uopće moguće isprogramirat FPGA s sd kartice tako da nema brige.