diff --git a/armsrc/smartcard.c b/armsrc/smartcard.c index 24de02a5f..72f20bf2e 100644 --- a/armsrc/smartcard.c +++ b/armsrc/smartcard.c @@ -32,6 +32,9 @@ #define SMART_CARD_RECEIVE_BUFFER_SIZE (10) #define SMART_CARD_TRANSMIT_BUFFER_SIZE (10) +#define SMART_CARD_CLOCK AT91C_BASE_PWMC_CH1 + + // true = the distance between a and b is greater than c #define RANGE(a,b,c) ((MAX(a,b))-(MIN(a,b))>(c)) @@ -235,7 +238,8 @@ static bool SMART_CARD_MaintainConnection( void ) { */ static void SMART_CARD_DisableClock( void ) { // Disable TC2 - AT91C_BASE_TC2->TC_CCR = AT91C_TC_CLKDIS; + //AT91C_BASE_TC2->TC_CCR = AT91C_TC_CLKDIS; + AT91C_BASE_PWMC->PWMC_DIS = PWM_CHANNEL(1); generateClk = false; } @@ -247,7 +251,8 @@ static void SMART_CARD_DisableClock( void ) { */ static void SMART_CARD_EnableClock( void ) { // Enable and reset TC2 - AT91C_BASE_TC2->TC_CCR = AT91C_TC_CLKEN | AT91C_TC_SWTRG; + //AT91C_BASE_TC2->TC_CCR = AT91C_TC_CLKEN | AT91C_TC_SWTRG; + AT91C_BASE_PWMC->PWMC_ENA = PWM_CHANNEL(1); generateClk = true; } @@ -462,6 +467,7 @@ static bool SMART_CARD_EstablishCommunications( void ) { * @return void */ static void SMART_CARD_ConfigureClock( void ) { + /* AT91C_BASE_PMC->PMC_PCER |= (1 << AT91C_ID_TC2); // Enable Clock TC2 AT91C_BASE_TCB->TCB_BMR &= AT91C_TCB_TC2XC2S; // Clear the external clock selection @@ -473,6 +479,22 @@ static void SMART_CARD_ConfigureClock( void ) { | AT91C_TC_CPCTRG; // Capture Mode, reset the TC2 counter when RC is reached AT91C_BASE_TC2->TC_RC = 12; // RC Compare value = 24MHz / 2MHz = 12 AT91C_BASE_TC2->TC_IER = AT91C_TC_CPCS; // Generate an interrupt when the RC value is reached + + */ + + // enable PWM Clock + AT91C_BASE_PMC->PMC_PCER |= (1 << AT91C_ID_PWMC); + + // Enable channel1 as SMART CARD real-time clock + AT91C_BASE_PWMC->PWMC_ENA = PWM_CHANNEL(1); + + // 48 MHz / 16 gives 3MHz + SMART_CARD_CLOCK->PWMC_CMR = PWM_CH_MODE_PRESCALER(3); // Channel Mode Register + SMART_CARD_CLOCK->PWMC_CDTYR = 0; // Channel Duty Cycle Register + SMART_CARD_CLOCK->PWMC_CPRDR = 0xffff; // Channel Period Register + + AT91C_BASE_PWMC->PWMC_IER = 1 << 1; + // AT91C_BASE_PWMC->PWMC_IDR; // disable interrupt } @@ -673,14 +695,14 @@ void SmartCard_setup(void) { } void SmartCard_stop(void) { - StopTicks(); + //StopTicks(); if ( MF_DBGLEVEL > 3 ) Dbprintf("Smart Card Stop"); LED_A_OFF(); } bool SmartCard_init(void) { - StartTicks(); + //StartTicks(); LED_A_ON(); SmartCard_setup(); diff --git a/armsrc/ticks.c b/armsrc/ticks.c index 1533faebc..61c8aa82a 100644 --- a/armsrc/ticks.c +++ b/armsrc/ticks.c @@ -18,9 +18,9 @@ void SpinDelayUs(int us) { AT91C_BASE_PWMC->PWMC_ENA = PWM_CHANNEL(0); // 48 MHz / 1024 gives 46.875 kHz - AT91C_BASE_PWMC_CH0->PWMC_CMR = PWM_CH_MODE_PRESCALER(10); - AT91C_BASE_PWMC_CH0->PWMC_CDTYR = 0; - AT91C_BASE_PWMC_CH0->PWMC_CPRDR = 0xffff; + AT91C_BASE_PWMC_CH0->PWMC_CMR = PWM_CH_MODE_PRESCALER(10); // Channel Mode Register + AT91C_BASE_PWMC_CH0->PWMC_CDTYR = 0; // Channel Duty Cycle Register + AT91C_BASE_PWMC_CH0->PWMC_CPRDR = 0xffff; // Channel Period Register uint16_t start = AT91C_BASE_PWMC_CH0->PWMC_CCNTR; diff --git a/include/at91sam7s512.h b/include/at91sam7s512.h index 47c79ee41..7dd557636 100644 --- a/include/at91sam7s512.h +++ b/include/at91sam7s512.h @@ -1563,7 +1563,7 @@ typedef struct _AT91S_TCB { // ***************************************************************************** #ifndef __ASSEMBLY__ typedef struct _AT91S_PWMC_CH { - AT91_REG PWMC_CMR; // Channel Mode Register + AT91_REG PWMC_CMR; // Channel Mode Register AT91_REG PWMC_CDTYR; // Channel Duty Cycle Register AT91_REG PWMC_CPRDR; // Channel Period Register AT91_REG PWMC_CCNTR; // Channel Counter Register