Could the GoodFET work? It's open source, and costs about $50 prebuilt.
All you would need is a USB-to-Serial converter module and its driver, something like the CP2102 or one of the FTDI parts...
All you would need is a USB-to-Serial converter module and its driver, something like the CP2102 or one of the FTDI parts...
There is no need for USB - UART module / driver because ddcc have MSP430G2 LP that can be used as BSL hardware base.
Launchpad-Based MSP430 UART BSL Interface http://www.ti.com/lit/an/slaa535a/slaa535a.pdf
But I guess that BSL password / vector of original firmware is unknown.
MSP-FET430UIF is stone age device, old and slow. MSP-FET is way to go with full JTAG interface.
http://www.ti.com/tool/MSP-FET
There are also UIF Chinese clones for 30$. https://www.ebay.com/itm/112472863311
If cost is a most relevant thing, than for simple checking if JTAG fuse is blown or not, can be used (simplified) open source replicator code with any MSP430 as host (I done it 10 years ago with F2xx as hardware base). http://www.ti.com/tool/REP430F
Or msp-debug on Pi or similar hardware. https://forum.43oh.com/topic/10035-4-wire-jtag-with-mspdebug-and-raspberry-pi-gpio/
Could the GoodFET work? It's open source, and costs about $50 prebuilt.
Hmm, the replicator does seem to be an option. I suppose I could modify the code and put it on a LaunchPad to check the JTAG fuse.
//! \brief Reset target JTAG interface and perform fuse-HW check.
void ResetTAP(void)
{
word i;
#ifdef SPYBIWIRE_MODE
...
#else
// process TDI first to settle fuse current
SetTDI();
SetTMS();
SetTCK();
// Reset JTAG FSM
for (i = 6; i > 0; i--)
{
ClrTCK();
SetTCK();
}
// JTAG FSM is now in Test-Logic-Reset
ClrTCK();
ClrTMS();
SetTCK();
SetTMS();
// JTAG FSM is now in Run-Test/IDLE
// Perform fuse check
ClrTMS();
usDelay(5); // at least 5us low required
SetTMS();
ClrTMS();
usDelay(5); // at least 5us low required
SetTMS();
#endif
}
static void CheckJtagFuse_JTAG(void)
{
// perform a JTAG fuse check
SetTMS();_NOP();_NOP();_NOP();
ClrTMS();_NOP();_NOP();_NOP();
usDelay(15);
SetTMS();_NOP();_NOP();_NOP();
ClrTMS();_NOP();_NOP();_NOP();
usDelay(15);
SetTMS();_NOP();_NOP();_NOP();
}
//----------------------------------------------------------------------------
//! \brief Function to start the JTAG communication
static word StartJtag(void)
{
// drive JTAG/TEST signals
DrvSignals();
MsDelay(10); // delay 10ms
if(INTERFACE == SPYBIWIRE_IF) {...} else if(INTERFACE == SPYBIWIREJTAG_IF) {...}
else // JTAG_IF
{
SetRST();
SetTST();
}
ResetTAP(); // reset TAP state machine -> Run-Test/Idle
if(INTERFACE == SPYBIWIRE_IF) {...}
else
{
CheckJtagFuse_JTAG();
}
return IR_Shift(IR_BYPASS);
}
//------------------------------------------------------------------------
//! \brief This function checks if the JTAG access security fuse is blown.
//! \return word (STATUS_OK if fuse is blown, STATUS_ERROR otherwise)
word IsFuseBlown(void)
{
word i;
for (i = 3; i > 0; i--) // First trial could be wrong
{
IR_Shift(IR_CNTRL_SIG_CAPTURE);
if (DR_Shift16(0xAAAA) == 0x5555)
{
return(STATUS_OK); // Fuse is blown
}
}
return(STATUS_ERROR); // fuse is not blown
}
//----------------------------------------------------------------------------
//! \brief Function to take target device under JTAG control. Disables the
//! target watchdog. Sets the global DEVICE variable as read from the target
//! device.
//! \return word (STATUS_ERROR if fuse is blown, incorrect JTAG ID or
//! synchronizing time-out; STATUS_OK otherwise)
word GetDevice(void)
{
word JtagId = 0; // initialize JtagId with an invalid value
word i;
for (i = 0; i < MAX_ENTRY_TRY; i++)
{
StopJtag(); // release JTAG/TEST signals to savely reset the test logic
JtagId = StartJtag(); // establish the physical connection to the JTAG interface
if(JtagId == JTAG_ID) // break if a valid JTAG ID is being returned
{
break;
}
}
if(i >= MAX_ENTRY_TRY)
{
return(STATUS_ERROR);
}
if (IsFuseBlown()) // Stop here if fuse is already blown
{
return(STATUS_FUSEBLOWN);
}
}
@ddcc, I'm curious about what you are hoping to accomplish here. You said the F437 has partially corrupted flash. How do you know that? Also, I assume that if you don't know the contents of the interrupt table, then this isn't your code you're dealing with. How will you fix the corrupted flash? How do you know what's supposed to be there? Sorry if this is obvious to everyone else, but just trying to understand.
Looking at the trace it seems to try to reset the JTAG TAP chip by holding TMS high for five cycles of TCK. This doesn't work on all devices (in general, not sure about MSP430 in particular). Following the reset it pulses TMS to advance the state machine. At the end it looks like it sets the IRCODE to 0xff, which is BYPASS, which means anything on TDI should repeat on TDO. This is to test the TAP is in the proper state and responding to commands It clocks in one TDI = H and expects to see the same on TDO, but doesn't and concludes it's not functioning correctly. Most likely because it was never reset. I'd change the code to explicitly pull nTRST instead, for reset.

Unfortunately, I don't know the history of this multimeter, nor how this data was erased, but it doesn't seem like any previous owner ever disassembled it, so it was probably a fluke.
Unfortunately, I don't know the history of this multimeter, nor how this data was erased, but it doesn't seem like any previous owner ever disassembled it, so it was probably a fluke.
We geniuses have all already replied there.