0

I'm working on a samc21 and using the fat libraries provided in ASF.

I have a program that takes from serial information and has to write to an SD card. The amount of bytes its around 50KB.

I'm using the internal oscillator (48MHz).

The problem is that the write operation is extremely slow, like 5 seconds every 1KB of information.

Do I have to change the oscillator, or fat is always going to be that slow? I mean, when I write to the SD card from the computer it takes like a second.

Please help.

Where do I configure the SPI speed?

  • How have you verified your cpu is running at 48MHz? How have you verified the spi speed? I assume you have a debugger - where is the code spending its time? – Kartman Jan 25 '21 at 22:39
  • Thank you kartman! I checked if the clock was configured at 48MHz and it was not xD. When I changed that frequency it worked at the max speed that I configured, 12Mghz for SPI. Please remember me to invite you a beer when I go to AU. – EL TIGRE CHINO Jan 28 '21 at 15:09

1 Answers1

0

@kartman was right. The clock was not configured correctly. This is my new conf_clocks.h

#include <clock.h>
#ifndef CONF_CLOCKS_H_INCLUDED
#  define CONF_CLOCKS_H_INCLUDED

/* System clock bus configuration */
#  define CONF_CLOCK_FLASH_WAIT_STATES            2
#  define CONF_CLOCK_CPU_DIVIDER                  SYSTEM_MAIN_CLOCK_DIV_1
    
/* SYSTEM_CLOCK_SOURCE_OSC48M configuration - Internal 48MHz oscillator */

#  define CONF_CLOCK_OSC48M_FREQ_DIV              SYSTEM_OSC48M_DIV_1

#  define CONF_CLOCK_OSC48M_ON_DEMAND             true

#  define CONF_CLOCK_OSC48M_RUN_IN_STANDBY        false



/* SYSTEM_CLOCK_SOURCE_XOSC configuration - External clock/oscillator */

#  define CONF_CLOCK_XOSC_ENABLE                  false

#  define CONF_CLOCK_XOSC_EXTERNAL_CRYSTAL        SYSTEM_CLOCK_EXTERNAL_CRYSTAL

#  define CONF_CLOCK_XOSC_EXTERNAL_FREQUENCY      12000000UL

#  define CONF_CLOCK_XOSC_STARTUP_TIME            SYSTEM_XOSC_STARTUP_32768

#  define CONF_CLOCK_XOSC_AUTO_GAIN_CONTROL       true

#  define CONF_CLOCK_XOSC_ON_DEMAND               true

#  define CONF_CLOCK_XOSC_RUN_IN_STANDBY          false

#  define CONF_CLOCK_XOSC_FAILURE_DETECTOR_PRE    SYSTEM_CLOCK_XOSC_FAILURE_DETECTOR_PRESCALER_1

#  define CONF_CLOCK_XOSC_FAILURE_DETECTOR_EVENT_OUTPUT_ENABLE  false

#  define CONF_CLOCK_XOSC_FAILURE_DETECTOR_ENABLE  false

#  define CONF_CLOCK_XOSC_FAILURE_SWITCH_BACK_ENABLE  false



/* SYSTEM_CLOCK_SOURCE_XOSC32K configuration - External 32KHz crystal/clock 
oscillator */

#  define CONF_CLOCK_XOSC32K_ENABLE               false

#  define CONF_CLOCK_XOSC32K_EXTERNAL_CRYSTAL     SYSTEM_CLOCK_EXTERNAL_CRYSTAL

#  define CONF_CLOCK_XOSC32K_STARTUP_TIME         SYSTEM_XOSC32K_STARTUP_65536

#  define CONF_CLOCK_XOSC32K_ENABLE_1KHZ_OUPUT    false

#  define CONF_CLOCK_XOSC32K_ENABLE_32KHZ_OUTPUT  true

#  define CONF_CLOCK_XOSC32K_ON_DEMAND            true

#  define CONF_CLOCK_XOSC32K_RUN_IN_STANDBY       false

#  define CONF_CLOCK_XOSC32K_FAILURE_DETECTOR_PRE    SYSTEM_CLOCK_XOSC32K_FAILURE_DETECTOR_PRESCALER_1

#  define CONF_CLOCK_XOSC32K_FAILURE_DETECTOR_EVENT_OUTPUT_ENABLE  false

#  define CONF_CLOCK_XOSC32K_FAILURE_DETECTOR_ENABLE  false

#  define CONF_CLOCK_XOSC32K_FAILURE_SWITCH_BACK_ENABLE  false







/* SYSTEM_CLOCK_SOURCE_OSC32K configuration - Internal 32KHz oscillator */

#  define CONF_CLOCK_OSC32K_ENABLE                false

#  define CONF_CLOCK_OSC32K_STARTUP_TIME          SYSTEM_OSC32K_STARTUP_130

#  define CONF_CLOCK_OSC32K_ENABLE_1KHZ_OUTPUT    true

#  define CONF_CLOCK_OSC32K_ENABLE_32KHZ_OUTPUT   true

#  define CONF_CLOCK_OSC32K_ON_DEMAND             true

#  define CONF_CLOCK_OSC32K_RUN_IN_STANDBY        false





/* SYSTEM_CLOCK_SOURCE_DPLL configuration - Digital Phase-Locked Loop */

#  define CONF_CLOCK_DPLL_ENABLE                  false

#  define CONF_CLOCK_DPLL_ON_DEMAND               true

#  define CONF_CLOCK_DPLL_RUN_IN_STANDBY          false

#  define CONF_CLOCK_DPLL_LOCK_BYPASS             false

#  define CONF_CLOCK_DPLL_WAKE_UP_FAST            false

#  define CONF_CLOCK_DPLL_LOW_POWER_ENABLE        false



#  define CONF_CLOCK_DPLL_LOCK_TIME   SYSTEM_CLOCK_SOURCE_DPLL_LOCK_TIME_DEFAULT

#  define CONF_CLOCK_DPLL_REFERENCE_CLOCK   SYSTEM_CLOCK_SOURCE_DPLL_REFERENCE_CLOCK_XOSC32K

#  define CONF_CLOCK_DPLL_FILTER    SYSTEM_CLOCK_SOURCE_DPLL_FILTER_DEFAULT

#  define CONF_CLOCK_DPLL_PRESCALER   SYSTEM_CLOCK_SOURCE_DPLL_DIV_1





#  define CONF_CLOCK_DPLL_REFERENCE_FREQUENCY     32767

#  define CONF_CLOCK_DPLL_REFERENCE_DIVIDER       1

#  define CONF_CLOCK_DPLL_OUTPUT_FREQUENCY        48000000



/* DPLL GCLK reference configuration */

#  define CONF_CLOCK_DPLL_REFERENCE_GCLK_GENERATOR GCLK_GENERATOR_1


    /* DPLL GCLK 32K reference configuration */

#  define CONF_CLOCK_DPLL_REFERENCE_GCLK_32K_GENERATOR GCLK_GENERATOR_1



/* Set this to true to configure the GCLK when running clocks_init. If set to

 * false, none of the GCLK generators will be configured in clocks_init(). */

#  define CONF_CLOCK_CONFIGURE_GCLK               true


/* Configure GCLK generator 0 (Main Clock) */

#  define CONF_CLOCK_GCLK_0_ENABLE                true

#  define CONF_CLOCK_GCLK_0_RUN_IN_STANDBY        false

#  define CONF_CLOCK_GCLK_0_CLOCK_SOURCE          SYSTEM_CLOCK_SOURCE_OSC48M

#  define CONF_CLOCK_GCLK_0_PRESCALER             1

#  define CONF_CLOCK_GCLK_0_OUTPUT_ENABLE         false



/* Configure GCLK generator 1 */

#  define CONF_CLOCK_GCLK_1_ENABLE                true

#  define CONF_CLOCK_GCLK_1_RUN_IN_STANDBY        false

#  define CONF_CLOCK_GCLK_1_CLOCK_SOURCE          SYSTEM_CLOCK_SOURCE_XOSC32K

#  define CONF_CLOCK_GCLK_1_PRESCALER             1

#  define CONF_CLOCK_GCLK_1_OUTPUT_ENABLE         false


/* Configure GCLK generator 2  */

#  define CONF_CLOCK_GCLK_2_ENABLE                false

#  define CONF_CLOCK_GCLK_2_RUN_IN_STANDBY        false

#  define CONF_CLOCK_GCLK_2_CLOCK_SOURCE          SYSTEM_CLOCK_SOURCE_OSC48M

#  define CONF_CLOCK_GCLK_2_PRESCALER             1

#  define CONF_CLOCK_GCLK_2_OUTPUT_ENABLE         false


/* Configure GCLK generator 3 */

#  define CONF_CLOCK_GCLK_3_ENABLE                false

#  define CONF_CLOCK_GCLK_3_RUN_IN_STANDBY        false

#  define CONF_CLOCK_GCLK_3_CLOCK_SOURCE          SYSTEM_CLOCK_SOURCE_OSC48M

#  define CONF_CLOCK_GCLK_3_PRESCALER             1

#  define CONF_CLOCK_GCLK_3_OUTPUT_ENABLE         false


/* Configure GCLK generator 4 */

#  define CONF_CLOCK_GCLK_4_ENABLE                false

#  define CONF_CLOCK_GCLK_4_RUN_IN_STANDBY        false

#  define CONF_CLOCK_GCLK_4_CLOCK_SOURCE          SYSTEM_CLOCK_SOURCE_OSC48M

#  define CONF_CLOCK_GCLK_4_PRESCALER             1

#  define CONF_CLOCK_GCLK_4_OUTPUT_ENABLE         false


/* Configure GCLK generator 5 */

#  define CONF_CLOCK_GCLK_5_ENABLE                false

#  define CONF_CLOCK_GCLK_5_RUN_IN_STANDBY        false

#  define CONF_CLOCK_GCLK_5_CLOCK_SOURCE          SYSTEM_CLOCK_SOURCE_OSC48M

#  define CONF_CLOCK_GCLK_5_PRESCALER             1

#  define CONF_CLOCK_GCLK_5_OUTPUT_ENABLE         false


/* Configure GCLK generator 6 */

#  define CONF_CLOCK_GCLK_6_ENABLE                false

#  define CONF_CLOCK_GCLK_6_RUN_IN_STANDBY        false

#  define CONF_CLOCK_GCLK_6_CLOCK_SOURCE          SYSTEM_CLOCK_SOURCE_OSC48M

#  define CONF_CLOCK_GCLK_6_PRESCALER             1

#  define CONF_CLOCK_GCLK_6_OUTPUT_ENABLE         false


/* Configure GCLK generator 7 */

#  define CONF_CLOCK_GCLK_7_ENABLE                false

#  define CONF_CLOCK_GCLK_7_RUN_IN_STANDBY        false

#  define CONF_CLOCK_GCLK_7_CLOCK_SOURCE          SYSTEM_CLOCK_SOURCE_OSC48M

#  define CONF_CLOCK_GCLK_7_PRESCALER             1

#  define CONF_CLOCK_GCLK_7_OUTPUT_ENABLE         false


/* Configure GCLK generator 8 */

#  define CONF_CLOCK_GCLK_8_ENABLE                false

#  define CONF_CLOCK_GCLK_8_RUN_IN_STANDBY        false

#  define CONF_CLOCK_GCLK_8_CLOCK_SOURCE          SYSTEM_CLOCK_SOURCE_OSC48M

#  define CONF_CLOCK_GCLK_8_PRESCALER             1

#  define CONF_CLOCK_GCLK_8_OUTPUT_ENABLE         false

#endif /* CONF_CLOCKS_H_INCLUDED */