From 63a1d80130db41e4d18bce2e6ada85c6a2c569ac Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Wed, 24 Aug 2016 12:37:31 +0200 Subject: [PATCH] FIX: the underlaying bug on deviceside code. The SSPCLOCK wasn't reset to zero sometimes. More specific, TC2 wasn't reset cause all sorts of timing issues for the device side randomly. Like 'hf mf mifare', like iclass, like 'hf mf sim' etc etc. --- armsrc/util.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/armsrc/util.c b/armsrc/util.c index 1efc2b2bf..b4d3dec59 100644 --- a/armsrc/util.c +++ b/armsrc/util.c @@ -400,9 +400,9 @@ void StartCountSspClk() { | AT91C_TC_WAVE // Waveform Mode | AT91C_TC_WAVESEL_UP; // just count - AT91C_BASE_TC0->TC_CCR = AT91C_TC_CLKEN; // enable TC0 - AT91C_BASE_TC1->TC_CCR = AT91C_TC_CLKEN; // enable TC1 - AT91C_BASE_TC2->TC_CCR = AT91C_TC_CLKEN; // enable TC2 + AT91C_BASE_TC0->TC_CCR = AT91C_TC_CLKEN | AT91C_TC_SWTRG; // enable and reset TC0 + AT91C_BASE_TC1->TC_CCR = AT91C_TC_CLKEN | AT91C_TC_SWTRG; // enable and reset TC1 + AT91C_BASE_TC2->TC_CCR = AT91C_TC_CLKEN | AT91C_TC_SWTRG; // enable and reset TC2 // synchronize the counter with the ssp_frame signal. // Note: FPGA must be in any iso14443 mode, otherwise the frame signal would not be present @@ -420,7 +420,13 @@ void StartCountSspClk() { // The high word of the counter (TC2) will not reset until the low word (TC0) overflows. // Therefore need to wait quite some time before we can use the counter. - while (AT91C_BASE_TC0->TC_CV < 0xFFF0); + while (AT91C_BASE_TC2->TC_CV >= 1); +} +void ResetSspClk(void) { + //enable clock of timer and software trigger + AT91C_BASE_TC0->TC_CCR = AT91C_TC_SWTRG; + AT91C_BASE_TC1->TC_CCR = AT91C_TC_SWTRG; + AT91C_BASE_TC2->TC_CCR = AT91C_TC_SWTRG; } uint32_t RAMFUNC GetCountSspClk(){