Skip to content

Commit b80a5ec

Browse files
committed
Fixed adc_init() function.
See arduino#1418
1 parent 01eba2f commit b80a5ec

File tree

4 files changed

+86
-36
lines changed

4 files changed

+86
-36
lines changed

system/libsam/source/adc.c

Lines changed: 50 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ extern "C" {
4646
* @{
4747
*/
4848

49-
#if SAM3S_SERIES || SAM4S_SERIES || SAM3N_SERIES || SAM3XA_SERIES
49+
#if SAM3S_SERIES || SAM4S_SERIES || SAM3N_SERIES
5050
/**
5151
* \brief Initialize the given ADC with the specified ADC clock and startup time.
5252
*
@@ -80,6 +80,55 @@ uint32_t adc_init(Adc *p_adc, const uint32_t ul_mck,
8080
ADC_MR_STARTUP_Msk);
8181
return 0;
8282
}
83+
#elif SAM3XA_SERIES
84+
/**
85+
* \brief Initialize the given ADC with the specified ADC clock and startup time.
86+
*
87+
* \param p_adc Pointer to an ADC instance.
88+
* \param ul_mck Main clock of the device (value in Hz).
89+
* \param ul_adc_clock Analog-to-Digital conversion clock (value in Hz).
90+
* \param uc_startup ADC start up time. Please refer to the product datasheet
91+
* for details.
92+
*
93+
* \return 0 on success.
94+
*/
95+
uint32_t adc_init(Adc *p_adc, const uint32_t ul_mck,
96+
const uint32_t ul_adc_clock, const uint8_t uc_startuptime)
97+
{
98+
uint32_t startup_table[] = { 0, 8, 16, 24, 64, 80, 96, 112, 512, 576, 640, 704, 768, 832, 896, 960 };
99+
uint32_t ul_prescal, ul_startup, ul_mr_startup, ul_real_adc_clock;
100+
p_adc->ADC_CR = ADC_CR_SWRST;
101+
102+
/* Reset Mode Register. */
103+
p_adc->ADC_MR = 0;
104+
105+
/* Reset PDC transfer. */
106+
p_adc->ADC_PTCR = (ADC_PTCR_RXTDIS | ADC_PTCR_TXTDIS);
107+
p_adc->ADC_RCR = 0;
108+
p_adc->ADC_RNCR = 0;
109+
if (ul_mck % (2 * ul_adc_clock)) {
110+
// Division with reminder
111+
ul_prescal = ul_mck / (2 * ul_adc_clock);
112+
} else {
113+
// Whole division
114+
ul_prescal = ul_mck / (2 * ul_adc_clock) - 1;
115+
}
116+
ul_real_adc_clock = ul_mck / (2 * (ul_prescal + 1));
117+
118+
// ADC clocks needed to get ul_startuptime uS
119+
ul_startup = (ul_real_adc_clock / 1000000) * uc_startuptime;
120+
121+
// Find correct MR_STARTUP value from conversion table
122+
for (ul_mr_startup=0; ul_mr_startup<16; ul_mr_startup++) {
123+
if (startup_table[ul_mr_startup] >= ul_startup)
124+
break;
125+
}
126+
if (ul_mr_startup==16)
127+
return -1;
128+
p_adc->ADC_MR |= ADC_MR_PRESCAL(ul_prescal) |
129+
((ul_mr_startup << ADC_MR_STARTUP_Pos) & ADC_MR_STARTUP_Msk);
130+
return 0;
131+
}
83132
#elif SAM3U_SERIES
84133
/**
85134
* \brief Initialize the given ADC with the specified ADC clock and startup time.
-222 Bytes
Binary file not shown.

variants/arduino_due_x/libsam_sam3x8e_gcc_rel.a.txt

Lines changed: 35 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ pmc.o:
7272
00000000 T pmc_switch_udpck_to_upllck
7373

7474
pwmc.o:
75-
00000000 r C.18.4409
75+
00000000 r C.9.8049
7676
00000000 t FindClockConfiguration
7777
00000000 T PWMC_ConfigureChannel
7878
00000000 T PWMC_ConfigureChannelExt
@@ -100,14 +100,14 @@ pwmc.o:
100100
00000000 T PWMC_SetSyncChannelUpdateUnlock
101101
00000000 T PWMC_WriteBuffer
102102
U __assert_func
103-
00000000 r __func__.4405
104-
00000000 r __func__.4429
105-
00000000 r __func__.4463
106-
00000000 r __func__.4509
107-
00000000 r __func__.4542
108-
00000000 r __func__.4563
109-
00000000 r __func__.4712
110-
00000000 r __func__.4726
103+
00000000 r __func__.6631
104+
00000000 r __func__.6642
105+
00000000 r __func__.6657
106+
00000000 r __func__.6668
107+
00000000 r __func__.6679
108+
00000000 r __func__.6686
109+
00000000 r __func__.6770
110+
00000000 r __func__.6776
111111

112112
rtc.o:
113113
00000000 T RTC_ClearSCCR
@@ -123,9 +123,9 @@ rtc.o:
123123
00000000 T RTC_SetTime
124124
00000000 T RTC_SetTimeAlarm
125125
U __assert_func
126-
00000000 r __func__.4402
127-
00000000 r __func__.4415
128-
00000000 r __func__.4423
126+
00000000 r __func__.6628
127+
00000000 r __func__.6637
128+
00000000 r __func__.6642
129129

130130
rtt.o:
131131
00000000 T RTT_EnableIT
@@ -134,8 +134,8 @@ rtt.o:
134134
00000000 T RTT_SetAlarm
135135
00000000 T RTT_SetPrescaler
136136
U __assert_func
137-
00000000 r __func__.4412
138-
00000000 r __func__.4426
137+
00000000 r __func__.6635
138+
00000000 r __func__.6643
139139

140140
spi.o:
141141
00000000 T SPI_Configure
@@ -161,9 +161,9 @@ tc.o:
161161
00000000 T TC_Start
162162
00000000 T TC_Stop
163163
U __assert_func
164-
00000000 r __func__.4404
165-
00000000 r __func__.4415
166-
00000000 r __func__.4425
164+
00000000 r __func__.6630
165+
00000000 r __func__.6636
166+
00000000 r __func__.6642
167167

168168
timetick.o:
169169
00000000 T GetTickCount
@@ -190,18 +190,18 @@ twi.o:
190190
00000000 T TWI_TransferComplete
191191
00000000 T TWI_WriteByte
192192
U __assert_func
193-
00000000 r __func__.4770
194-
00000000 r __func__.4801
195-
00000000 r __func__.4814
196-
00000000 r __func__.4823
197-
00000000 r __func__.4845
198-
00000000 r __func__.4854
199-
00000000 r __func__.4865
200-
00000000 r __func__.4904
201-
00000000 r __func__.4914
202-
00000000 r __func__.4923
203-
00000000 r __func__.4931
204-
00000000 r __func__.4939
193+
00000000 r __func__.7003
194+
00000000 r __func__.7018
195+
00000000 r __func__.7022
196+
00000000 r __func__.7029
197+
00000000 r __func__.7033
198+
00000000 r __func__.7038
199+
00000000 r __func__.7046
200+
00000000 r __func__.7060
201+
00000000 r __func__.7065
202+
00000000 r __func__.7069
203+
00000000 r __func__.7074
204+
00000000 r __func__.7078
205205

206206
usart.o:
207207
00000000 T USART_Configure
@@ -220,7 +220,7 @@ usart.o:
220220
00000000 T USART_Write
221221
00000000 T USART_WriteBuffer
222222
U __assert_func
223-
00000000 r __func__.4778
223+
00000000 r __func__.6924
224224

225225
wdt.o:
226226
00000000 T WDT_Disable
@@ -298,6 +298,7 @@ startup_sam3xa.o:
298298
U main
299299

300300
adc.o:
301+
00000000 r C.0.8141
301302
00000000 T adc_configure_power_save
302303
00000000 T adc_configure_sequence
303304
00000000 T adc_configure_timing
@@ -482,12 +483,12 @@ efc.o:
482483
00000000 T efc_get_wait_state
483484
00000000 T efc_init
484485
00000000 T efc_perform_command
485-
00000074 T efc_perform_fcr
486+
00000070 T efc_perform_fcr
486487
00000000 T efc_perform_read_sequence
487488
00000000 T efc_set_flash_access_mode
488489
00000000 T efc_set_wait_state
489-
00000070 T efc_write_fmr
490-
00000000 b iap_perform_command.4696
490+
0000006c T efc_write_fmr
491+
00000000 b iap_perform_command.6905
491492

492493
gpbr.o:
493494
00000000 T gpbr_read
@@ -552,7 +553,6 @@ rstc.o:
552553
00000000 T rstc_start_software_reset
553554

554555
emac.o:
555-
00000000 t T.43
556556
00000000 t circ_inc
557557
00000000 T emac_dev_get_tx_load
558558
00000000 T emac_dev_init
@@ -566,6 +566,7 @@ emac.o:
566566
00000000 T emac_phy_write
567567
00000000 t emac_reset_rx_mem
568568
00000000 t emac_reset_tx_mem
569+
00000000 t emac_wait_phy.clone.1
569570
00000000 b gs_rx_desc
570571
00000000 b gs_tx_callback
571572
00000000 b gs_tx_desc

variants/arduino_due_x/variant.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -433,7 +433,7 @@ void init( void )
433433

434434
// Initialize Analog Controller
435435
pmc_enable_periph_clk(ID_ADC);
436-
adc_init(ADC, SystemCoreClock, ADC_FREQ_MAX, /*ADC_STARTUP_FAST*/ 3);
436+
adc_init(ADC, SystemCoreClock, ADC_FREQ_MAX, ADC_STARTUP_FAST);
437437
adc_configure_timing(ADC, 0, ADC_SETTLING_TIME_3, 1);
438438
adc_configure_trigger(ADC, ADC_TRIG_SW, 0); // Disable hardware trigger.
439439
adc_disable_interrupt(ADC, 0xFFFFFFFF); // Disable all ADC interrupts.

0 commit comments

Comments
 (0)