I am writing what I thought to be a simple application to read and write memory using the ARM JTAG Scan Chain instructions. What I am finding is that I can read and write registers without issue but whan I try to use system speed instructions (as required) to do the memory accesses - all hell breaks loose.
My sequences are simple enough
IR SCAN_N DR x10 (scan chain 1) IR INTEST DR MOV R8 #0 sysspeed = 0 go to RTI for 1 TCK DR LDR R0 [R8] sysspeed = 0 go to RTI for 1 TCK DR MOV R0 R0 sysspeed = 0 (NOP) go to RTI for 2 TCK DR go to RTI for 2 TCK
So now I have a read address in R0 I have been able to use STR R0 [R8] in a sequence similar to the above to read it out and verify that I loaded the value
Now I want to read the address pointed to by R0 This is where the lights go out (as it were)
IR SCAN_N DR x10 IR INTEST DR MOV R0, R0 sysspeed = 0 go to RTI for 1 TCK DR MOV R0, R0 sysspeed = 1 go to RTI for 1 TCK LDR R1,[R0] sysspeed = 0 go to RTI for 1 TCK IR RESTART go to RTI for 1 TCK pulse
So now R1 should have the contents of the address that was in R0 Let's shift it out
IR SCAN_N DR x10 IR INTEST DR MOV R8 #0 sysspeed = 0 go to RTI for 1 TCK DR STR R1 [R8] sysspeed = 0 go to RTI for 1 TCK DR MOV R0 R0 sysspeed = 0 (NOP) go to RTI for 2 TCK DR go to RTI for 1 TCK
It doesn't work! I get random stuff or zeroes. Obviously I'm doing something wrong The TCK I have is pretty slow (330KHz). If I insert a debug status register check (on scan chain 2) after the RESTART and associated IDLE I see that DBGACK does not appear to come high but mREQ does. Why would that be? Is that a slow TCK issue? If it is - is there a workaround for that?
I do notice that the sysspeed bit is set on the outbound (TDO) bits as I shift in that first MOV R8 #0 instruction after the RESTART. I should also note that when I say go to RTI, in my algorithm above.
Thanks for any help you can provide in revealing the error of my ways. And please, buying or downloading a solution is not an option - I need to know the correct algorithm.