Skip to content

Commit 4d2be45

Browse files
ArcaneNibblelaurensvalk
authored andcommitted
pbio/drv/adc/adc_ev3: Initialize SPI data format.
1 parent 0fb8389 commit 4d2be45

File tree

3 files changed

+28
-1
lines changed

3 files changed

+28
-1
lines changed

lib/pbio/drv/adc/adc_ev3.c

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,20 @@
3232

3333
#define PBDRV_CONFIG_ADC_EV3_NUM_DELAY_SAMPLES (2)
3434

35+
/**
36+
* Constants.
37+
*/
38+
enum {
39+
// The maximum ADC clock speed according to the datasheet is 20 MHz.
40+
// However, because the SPI peripheral does not have a fractional clock generator,
41+
// the closest achievable in-spec speed is a division factor of 8.
42+
//
43+
// 150 MHz / 8 = 18.75 MHz actual
44+
SPI_CLK_SPEED_ADC = 20000000,
45+
46+
ADC_SAMPLE_PERIOD = 10,
47+
};
48+
3549
static volatile uint16_t channel_data[PBDRV_CONFIG_ADC_EV3_ADC_NUM_CHANNELS + PBDRV_CONFIG_ADC_EV3_NUM_DELAY_SAMPLES];
3650

3751
static int adc_soon;
@@ -98,6 +112,15 @@ void pbdrv_adc_update_soon(void) {
98112
pbio_os_request_poll();
99113
}
100114

115+
void pbdrv_adc_ev3_configure_data_format() {
116+
SPIClkConfigure(SOC_SPI_0_REGS, SOC_SYSCLK_2_FREQ, SPI_CLK_SPEED_ADC, SPI_DATA_FORMAT1);
117+
// NOTE: Cannot be CPOL=1 CPHA=1 like SPI flash
118+
// The ADC seems to use the last falling edge to trigger conversions (see Figure 1 in the datasheet).
119+
SPIConfigClkFormat(SOC_SPI_0_REGS, SPI_CLK_POL_LOW | SPI_CLK_OUTOFPHASE, SPI_DATA_FORMAT1);
120+
SPIShiftMsbFirst(SOC_SPI_0_REGS, SPI_DATA_FORMAT1);
121+
SPICharLengthSet(SOC_SPI_0_REGS, 16, SPI_DATA_FORMAT1);
122+
}
123+
101124
void pbdrv_adc_ev3_shut_down_hack() {
102125
shut_down_hack = 1;
103126
pbio_os_request_poll();

lib/pbio/drv/adc/adc_ev3.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
#ifndef _INTERNAL_PBDRV_ADC_EV3_H_
55
#define _INTERNAL_PBDRV_ADC_EV3_H_
66

7+
void pbdrv_adc_ev3_configure_data_format();
8+
79
void pbdrv_adc_ev3_shut_down_hack();
810
int pbdrv_adc_ev3_is_shut_down_hack();
911

lib/pbio/drv/block_device/block_device_ev3.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -689,7 +689,9 @@ void pbdrv_block_device_init(void) {
689689
SPIConfigClkFormat(SOC_SPI_0_REGS, SPI_CLK_POL_LOW | SPI_CLK_OUTOFPHASE, SPI_DATA_FORMAT0);
690690
SPIShiftMsbFirst(SOC_SPI_0_REGS, SPI_DATA_FORMAT0);
691691
SPICharLengthSet(SOC_SPI_0_REGS, 8, SPI_DATA_FORMAT0);
692-
// TODO: Initialize ADC data format
692+
#if PBDRV_CONFIG_ADC_EV3
693+
pbdrv_adc_ev3_configure_data_format();
694+
#endif
693695

694696
// Configure the GPIO pins.
695697
pbdrv_gpio_alt(&pin_spi0_mosi, SYSCFG_PINMUX3_PINMUX3_15_12_SPI0_SIMO0);

0 commit comments

Comments
 (0)