Loading...
Searching...
No Matches
periph_cpu_common.h
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2015-2018 Freie Universität Berlin
3 * SPDX-License-Identifier: LGPL-2.1-only
4 */
5
6#pragma once
7
17
18#include "cpu.h"
19
20#ifdef __cplusplus
21extern "C" {
22#endif
23
27#if (defined(CPU_FAM_NRF53) || defined(CPU_FAM_NRF9160)) && \
28 !defined(NRF_TRUSTZONE_NONSECURE)
29# define NRF_FICR NRF_FICR_S
30#endif
31
36#ifdef CPU_MODEL_NRF52832XXAA
37#define ERRATA_SPI_SINGLE_BYTE_WORKAROUND (1)
38#endif
39
44#define PROVIDES_PM_OFF
46
50#ifdef FICR_INFO_DEVICEID_DEVICEID_Msk
51#define CPUID_ADDR (&NRF_FICR->INFO.DEVICEID[0])
52#else
53#define CPUID_ADDR (&NRF_FICR->DEVICEID[0])
54#endif
58#define CPUID_LEN (8U)
59
65#if GPIO_COUNT > 1
66#define GPIO_PIN(x, y) ((x << 5) | y)
67#else
68#define GPIO_PIN(x, y) ((x & 0) | y)
69#endif
70
74/* The precise value matters where GPIO_UNDEF is set in registers like
75 * PWM.PSEL.OUT where it is used in sign-extended form to get a UINT32_MAX */
76#define GPIO_UNDEF (UINT8_MAX)
77
84#ifdef NRF_GPIOTE0_S
85#define ISR_GPIOTE isr_gpiote0
86#else
87#define ISR_GPIOTE isr_gpiote
88#endif
89
99#define GPIO_MODE(oe, ic, pr, dr) (oe | (ic << 1) | (pr << 2) | (dr << 8))
100
101#ifndef DOXYGEN /* BEGIN: GPIO LL overwrites */
102#define HAVE_GPIO_SLEW_T
103typedef enum {
105 GPIO_SLEW_SLOW = 0,
106 GPIO_SLEW_FAST = 0,
109
110#define HAVE_GPIO_PULL_STRENGTH_T
111typedef enum {
113 GPIO_PULL_WEAK = 0,
117
118#define HAVE_GPIO_DRIVE_STRENGTH_T
119typedef enum {
121 GPIO_DRIVE_WEAK = 0,
125
126#define HAVE_GPIO_IRQ_TRIG_T
127typedef enum {
128 GPIO_TRIGGER_EDGE_RISING = GPIOTE_CONFIG_POLARITY_LoToHi << GPIOTE_CONFIG_POLARITY_Pos,
129 GPIO_TRIGGER_EDGE_FALLING = GPIOTE_CONFIG_POLARITY_HiToLo << GPIOTE_CONFIG_POLARITY_Pos,
134
135#define HAVE_GPIO_PULL_T
136typedef enum {
137 GPIO_FLOATING = 0,
138 GPIO_PULL_UP = GPIO_PIN_CNF_PULL_Pullup,
139 GPIO_PULL_DOWN = GPIO_PIN_CNF_PULL_Pulldown,
140 GPIO_PULL_KEEP = 2,
142
143#define HAVE_GPIO_STATE_T
144typedef enum {
152
153#define HAVE_GPIO_CONF_T
154typedef union gpio_conf_nrf5x gpio_conf_t;
155
156#endif
157
163 uint8_t bits;
164 struct {
197 uint8_t : 1;
198 };
199};
200/* END: GPIO LL overwrites */
201
202#if !defined(DOXYGEN) && (defined(CPU_NRF53) || defined(CPU_NRF9160))
206#define UART_BAUDRATE_BAUDRATE_Baud1200 UARTE_BAUDRATE_BAUDRATE_Baud1200
207#define UART_BAUDRATE_BAUDRATE_Baud2400 UARTE_BAUDRATE_BAUDRATE_Baud2400
208#define UART_BAUDRATE_BAUDRATE_Baud4800 UARTE_BAUDRATE_BAUDRATE_Baud4800
209#define UART_BAUDRATE_BAUDRATE_Baud9600 UARTE_BAUDRATE_BAUDRATE_Baud9600
210#define UART_BAUDRATE_BAUDRATE_Baud14400 UARTE_BAUDRATE_BAUDRATE_Baud14400
211#define UART_BAUDRATE_BAUDRATE_Baud19200 UARTE_BAUDRATE_BAUDRATE_Baud19200
212#define UART_BAUDRATE_BAUDRATE_Baud28800 UARTE_BAUDRATE_BAUDRATE_Baud28800
213#define UART_BAUDRATE_BAUDRATE_Baud31250 UARTE_BAUDRATE_BAUDRATE_Baud31250
214#define UART_BAUDRATE_BAUDRATE_Baud38400 UARTE_BAUDRATE_BAUDRATE_Baud38400
215#define UART_BAUDRATE_BAUDRATE_Baud56000 UARTE_BAUDRATE_BAUDRATE_Baud56000
216#define UART_BAUDRATE_BAUDRATE_Baud57600 UARTE_BAUDRATE_BAUDRATE_Baud57600
217#define UART_BAUDRATE_BAUDRATE_Baud76800 UARTE_BAUDRATE_BAUDRATE_Baud76800
218#define UART_BAUDRATE_BAUDRATE_Baud115200 UARTE_BAUDRATE_BAUDRATE_Baud115200
219#define UART_BAUDRATE_BAUDRATE_Baud230400 UARTE_BAUDRATE_BAUDRATE_Baud230400
220#define UART_BAUDRATE_BAUDRATE_Baud250000 UARTE_BAUDRATE_BAUDRATE_Baud250000
221#define UART_BAUDRATE_BAUDRATE_Baud460800 UARTE_BAUDRATE_BAUDRATE_Baud460800
222#define UART_BAUDRATE_BAUDRATE_Baud921600 UARTE_BAUDRATE_BAUDRATE_Baud921600
223#define UART_BAUDRATE_BAUDRATE_Baud1M UARTE_BAUDRATE_BAUDRATE_Baud1M
224
225#define SPI_FREQUENCY_FREQUENCY_K125 SPIM_FREQUENCY_FREQUENCY_K125
226#define SPI_FREQUENCY_FREQUENCY_K500 SPIM_FREQUENCY_FREQUENCY_K500
227#define SPI_FREQUENCY_FREQUENCY_M1 SPIM_FREQUENCY_FREQUENCY_M1
228#define SPI_FREQUENCY_FREQUENCY_M4 SPIM_FREQUENCY_FREQUENCY_M4
229#define SPI_FREQUENCY_FREQUENCY_M8 SPIM_FREQUENCY_FREQUENCY_M8
230#define SPI_CONFIG_CPHA_Msk SPIM_CONFIG_CPHA_Msk
231#define SPI_CONFIG_CPOL_Msk SPIM_CONFIG_CPOL_Msk
232#endif
233
237#define SPI_HWCS(x) (SPI_CS_UNDEF)
238
243#define PERIPH_SPI_NEEDS_INIT_CS
244#define PERIPH_SPI_NEEDS_TRANSFER_BYTE
245#define PERIPH_SPI_NEEDS_TRANSFER_REG
246#define PERIPH_SPI_NEEDS_TRANSFER_REGS
248
249#ifndef DOXYGEN
254#define HAVE_GPIO_T
255typedef uint8_t gpio_t;
257
267#define HAVE_GPIO_MODE_T
268typedef enum {
269 GPIO_IN = GPIO_MODE(0, 0, 0, 0),
270 GPIO_IN_PD = GPIO_MODE(0, 0, 1, 0),
271 GPIO_IN_PU = GPIO_MODE(0, 0, 3, 0),
272 GPIO_IN_OD_PU = GPIO_MODE(0, 0, 3, 6),
273 GPIO_OUT = GPIO_MODE(1, 1, 0, 0),
274 GPIO_OD = (0xff),
275 GPIO_OD_PU = (0xfe)
278
283#define HAVE_GPIO_FLANK_T
284typedef enum {
285 GPIO_FALLING = 2,
286 GPIO_RISING = 1,
287 GPIO_BOTH = 3
290#endif /* ndef DOXYGEN */
291
295typedef struct {
296 NRF_TIMER_Type *dev;
304 uint8_t channels;
305 uint8_t bitmode;
306 uint8_t irqn;
308
312#define PERIPH_TIMER_PROVIDES_SET 1
313
322#define TIMER_CHANNEL_NUMOF 5
323
324#ifndef DOXYGEN
329#define HAVE_SPI_MODE_T
330typedef enum {
331 SPI_MODE_0 = 0,
332 SPI_MODE_1 = SPI_CONFIG_CPHA_Msk,
333 SPI_MODE_2 = SPI_CONFIG_CPOL_Msk,
334 SPI_MODE_3 = (SPI_CONFIG_CPOL_Msk | SPI_CONFIG_CPHA_Msk)
335} spi_mode_t;
337
342#define HAVE_SPI_CLK_T
343typedef enum {
344 SPI_CLK_100KHZ = SPI_FREQUENCY_FREQUENCY_K125,
345 SPI_CLK_400KHZ = SPI_FREQUENCY_FREQUENCY_K500,
346 SPI_CLK_1MHZ = SPI_FREQUENCY_FREQUENCY_M1,
347 SPI_CLK_5MHZ = SPI_FREQUENCY_FREQUENCY_M4,
348 SPI_CLK_10MHZ = SPI_FREQUENCY_FREQUENCY_M8
349} spi_clk_t;
351#endif /* ndef DOXYGEN */
352
357#define NWDT_TIME_LOWER_LIMIT (1)
358/* Set upper limit to the maximum possible value that could go in CRV register */
359#define NWDT_TIME_UPPER_LIMIT ((UINT32_MAX >> 15) * US_PER_MS + 1)
361
365typedef struct {
366 gpio_t a_pin;
367 gpio_t b_pin;
368 gpio_t led_pin;
373
382uint8_t gpio_int_get_exti(gpio_t pin);
383
387typedef struct {
388#ifdef UARTE_PRESENT
389 NRF_UARTE_Type *dev;
391#else
392 NRF_UART_Type *dev;
393#endif
394 gpio_t rx_pin;
395 gpio_t tx_pin;
396#ifdef MODULE_PERIPH_UART_HW_FC
397 gpio_t rts_pin;
398 gpio_t cts_pin;
399#endif
400 uint8_t irqn;
402
406#ifndef UART_TXBUF_SIZE
407#define UART_TXBUF_SIZE (64)
408#endif
409
413#define USBDEV_CPU_DMA_ALIGNMENT (4)
414
418#define USBDEV_CPU_DMA_REQUIREMENTS __attribute__((aligned(USBDEV_CPU_DMA_ALIGNMENT)))
419
420#if !defined(CPU_FAM_NRF51) && !defined(DOXYGEN)
425#define PWM_CHANNELS (4U)
426
434#define PWM_MODE(ud, pol) (ud | (pol << 15))
435
439#define HAVE_PWM_MODE_T
440typedef enum {
441 PWM_LEFT = PWM_MODE(0, 1),
442 PWM_RIGHT = PWM_MODE(0, 0),
443 PWM_CENTER = PWM_MODE(1, 1),
444 PWM_CENTER_INV = PWM_MODE(1, 0)
445} pwm_mode_t;
446
461#if defined(PWM_PRESENT)
462typedef struct {
463 NRF_PWM_Type *dev;
464 gpio_t pin[PWM_CHANNELS];
465} pwm_conf_t;
466#endif
467#endif /* ndef CPU_FAM_NRF51 */
468#ifndef CPU_NRF51
469
473#define SPI_SCKSEL (dev(bus)->PSEL.SCK)
474#define SPI_MOSISEL (dev(bus)->PSEL.MOSI)
475#define SPI_MISOSEL (dev(bus)->PSEL.MISO)
476
480typedef struct {
481 NRF_SPIM_Type *dev;
482 gpio_t sclk;
483 gpio_t mosi;
484 gpio_t miso;
485#if ERRATA_SPI_SINGLE_BYTE_WORKAROUND
486 uint8_t ppi;
487#endif
488} spi_conf_t;
489
495typedef void (*shared_irq_cb_t)(void *arg);
496
504void shared_irq_register_spi(NRF_SPIM_Type *bus,
505 shared_irq_cb_t cb, void *arg);
506
514void shared_irq_register_i2c(NRF_TWIM_Type *bus,
515 shared_irq_cb_t cb, void *arg);
516
524void shared_irq_register_uart(NRF_UARTE_Type *bus,
525 shared_irq_cb_t cb, void *arg);
526
534void nrf5x_i2c_acquire(NRF_TWIM_Type *bus, shared_irq_cb_t cb, void *arg);
535
541void nrf5x_i2c_release(NRF_TWIM_Type *bus);
542
550void nrf5x_spi_acquire(NRF_SPIM_Type *bus, shared_irq_cb_t cb, void *arg);
551
557void nrf5x_spi_release(NRF_SPIM_Type *bus);
558
562#ifndef UART_TXBUF_SIZE
563#define UART_TXBUF_SIZE (64)
564#endif
565
570#ifndef CONFIG_SPI_MBUF_SIZE
571#define CONFIG_SPI_MBUF_SIZE 64
572#endif
573
574#ifndef DOXYGEN
579#define HAVE_I2C_SPEED_T
580typedef enum {
581 I2C_SPEED_LOW = 0xff,
582 I2C_SPEED_NORMAL = TWIM_FREQUENCY_FREQUENCY_K100,
583 I2C_SPEED_FAST = TWIM_FREQUENCY_FREQUENCY_K400,
584 I2C_SPEED_FAST_PLUS = 0xfe,
585 I2C_SPEED_HIGH = 0xfd,
588#endif /* ndef DOXYGEN */
589
594typedef struct {
595 NRF_TWIM_Type *dev;
596 gpio_t scl;
597 gpio_t sda;
599} i2c_conf_t;
601
606#define PERIPH_I2C_NEED_READ_REG
607#define PERIPH_I2C_NEED_WRITE_REG
609
614#define i2c_pin_sda(dev) i2c_config[dev].sda
615#define i2c_pin_scl(dev) i2c_config[dev].scl
617#endif /* ndef CPU_NRF51 */
618
619#ifdef __cplusplus
620}
621#endif
622
gpio_flank_t
Definition periph_cpu.h:176
@ GPIO_OUT
select GPIO MASK as output
Definition periph_cpu.h:161
@ GPIO_IN
select GPIO MASK as input
Definition periph_cpu.h:160
i2c_speed_t
Definition periph_cpu.h:272
@ I2C_SPEED_NORMAL
normal mode: ~100 kbit/s
Definition periph_cpu.h:274
@ I2C_SPEED_FAST_PLUS
fast plus mode: ~1000 kbit/s
Definition periph_cpu.h:276
@ I2C_SPEED_LOW
low speed mode: ~10 kbit/s
Definition periph_cpu.h:273
@ I2C_SPEED_HIGH
high speed mode: ~3400 kbit/s
Definition periph_cpu.h:278
@ I2C_SPEED_FAST
fast mode: ~400 kbit/s
Definition periph_cpu.h:275
spi_clk_t
Definition periph_cpu.h:348
@ SPI_CLK_10MHZ
drive the SPI bus with 10MHz
Definition periph_cpu.h:353
@ SPI_CLK_5MHZ
drive the SPI bus with 5MHz
Definition periph_cpu.h:352
@ SPI_CLK_400KHZ
drive the SPI bus with 400KHz
Definition periph_cpu.h:350
@ SPI_CLK_1MHZ
drive the SPI bus with 1MHz
Definition periph_cpu.h:351
@ SPI_CLK_100KHZ
drive the SPI bus with 100KHz
Definition periph_cpu.h:349
pwm_mode_t
@ PWM_CENTER
center aligned
@ PWM_LEFT
left aligned
@ PWM_RIGHT
right aligned
gpio_mode_t
Available pin modes.
Definition periph_cpu.h:96
gpio_irq_trig_t
Definition of possible IRQ triggers.
Definition gpio_ll_irq.h:68
@ GPIO_TRIGGER_EDGE_FALLING
edge triggered IRQ on falling flanks only
Definition gpio_ll_irq.h:69
@ GPIO_TRIGGER_LEVEL_HIGH
level triggered IRQ on high input
Definition gpio_ll_irq.h:74
@ GPIO_TRIGGER_EDGE_RISING
edge triggered IRQ on rising flanks only
Definition gpio_ll_irq.h:71
@ GPIO_TRIGGER_EDGE_BOTH
edge triggered IRQ on falling AND rising flanks
Definition gpio_ll_irq.h:72
@ GPIO_TRIGGER_LEVEL_LOW
level triggered IRQ on low input
Definition gpio_ll_irq.h:75
gpio_pull_t
Enumeration of pull resistor configurations.
Definition gpio_ll.h:254
gpio_pull_strength_t
Enumeration of pull resistor values.
Definition gpio_ll.h:272
gpio_state_t
Enumeration of GPIO states (direction)
Definition gpio_ll.h:162
gpio_slew_t
Enumeration of slew rate settings.
Definition gpio_ll.h:336
gpio_drive_strength_t
Enumeration of drive strength options.
Definition gpio_ll.h:303
typedef gpio_conf_t
GPIO pin configuration.
Definition gpio_ll.h:420
@ GPIO_FLOATING
No pull ups nor pull downs enabled.
Definition gpio_ll.h:255
@ GPIO_PULL_KEEP
Keep the signal at current logic level with pull up/down resistors.
Definition gpio_ll.h:258
@ GPIO_PULL_DOWN
Pull down resistor enabled.
Definition gpio_ll.h:257
@ GPIO_PULL_UP
Pull up resistor enabled.
Definition gpio_ll.h:256
@ GPIO_PULL_WEAKEST
Use the weakest (highest Ohm value) resistor.
Definition gpio_ll.h:273
@ GPIO_PULL_WEAK
Use a weak pull resistor.
Definition gpio_ll.h:274
@ GPIO_PULL_STRONG
Use a strong pull resistor.
Definition gpio_ll.h:275
@ GPIO_PULL_STRONGEST
Use the strongest pull resistor.
Definition gpio_ll.h:276
@ GPIO_OUTPUT_OPEN_SOURCE
Use pin as output in open emitter configuration.
Definition gpio_ll.h:199
@ GPIO_USED_BY_PERIPHERAL
The GPIO pin is used by a peripheral.
Definition gpio_ll.h:218
@ GPIO_OUTPUT_OPEN_DRAIN
Use pin as output in open collector configuration.
Definition gpio_ll.h:186
@ GPIO_OUTPUT_PUSH_PULL
Use pin as output in push-pull configuration.
Definition gpio_ll.h:173
@ GPIO_DISCONNECT
Disconnect pin from all peripherals.
Definition gpio_ll.h:246
@ GPIO_INPUT
Use pin as input.
Definition gpio_ll.h:205
@ GPIO_SLEW_SLOWEST
let the output voltage level rise/fall as slow as possible
Definition gpio_ll.h:337
@ GPIO_SLEW_FAST
let the output voltage level rise/fall fast
Definition gpio_ll.h:340
@ GPIO_SLEW_SLOW
let the output voltage level rise/fall slowly
Definition gpio_ll.h:339
@ GPIO_SLEW_FASTEST
let the output voltage level rise/fall as fast as possible
Definition gpio_ll.h:341
@ GPIO_DRIVE_STRONG
Use a strong drive strength.
Definition gpio_ll.h:306
@ GPIO_DRIVE_WEAK
Use a weak drive strength.
Definition gpio_ll.h:305
@ GPIO_DRIVE_STRONGEST
Use the strongest drive strength.
Definition gpio_ll.h:307
@ GPIO_DRIVE_WEAKEST
Use the weakest drive strength.
Definition gpio_ll.h:304
spi_mode_t
Support SPI modes.
Definition periph_cpu.h:39
@ SPI_MODE_0
CPOL=0, CPHA=0.
Definition periph_cpu.h:40
@ SPI_MODE_2
CPOL=1, CPHA=0.
Definition periph_cpu.h:42
@ SPI_MODE_1
CPOL=0, CPHA=1.
Definition periph_cpu.h:41
@ SPI_MODE_3
CPOL=1, CPHA=1.
Definition periph_cpu.h:43
void nrf5x_i2c_acquire(NRF_TWIM_Type *bus, shared_irq_cb_t cb, void *arg)
Acquire the shared I2C/SPI peripheral in I2C mode.
uint8_t gpio_int_get_exti(gpio_t pin)
Retrieve the exti(GPIOTE) channel associated with a gpio.
void shared_irq_register_i2c(NRF_TWIM_Type *bus, shared_irq_cb_t cb, void *arg)
Register an I2C IRQ handler for a shared UART/I2C/SPI irq vector.
void nrf5x_spi_release(NRF_SPIM_Type *bus)
Acquire the shared I2C/SPI peripheral in SPI mode.
void(* shared_irq_cb_t)(void *arg)
Common UART/SPI/I2C interrupt callback.
#define GPIO_MODE(oe, ic, pr, dr)
Generate GPIO mode bitfields.
void nrf5x_spi_acquire(NRF_SPIM_Type *bus, shared_irq_cb_t cb, void *arg)
Acquire the shared I2C/SPI peripheral in SPI mode.
void shared_irq_register_spi(NRF_SPIM_Type *bus, shared_irq_cb_t cb, void *arg)
Register a SPI IRQ handler for a shared UART/I2C/SPI irq vector.
void shared_irq_register_uart(NRF_UARTE_Type *bus, shared_irq_cb_t cb, void *arg)
Register an UART IRQ handler for a shared UART/I2C/SPI irq vector.
void nrf5x_i2c_release(NRF_TWIM_Type *bus)
Release the shared I2C/SPI peripheral in I2C mode.
I2C configuration structure.
Definition periph_cpu.h:295
i2c_speed_t speed
Configured bus speed, actual speed may be lower but never higher.
Definition periph_cpu.h:300
TWI_t * dev
Pointer to hardware module registers.
Definition periph_cpu.h:296
gpio_t sda
GPIO used as SDA pin.
Definition periph_cpu.h:468
gpio_t scl
GPIO used as SCL pin.
Definition periph_cpu.h:467
PWM device configuration.
Quadrature decoder configuration struct.
bool debounce_filter
Enable/disable debounce filter.
gpio_t b_pin
GPIO Pin for phase B.
gpio_t a_pin
GPIO Pin for phase A.
bool led_active_state
Active state of the LED.
gpio_t led_pin
LED GPIO, GPIO_UNDEF to disable.
uint8_t sample_period
Sample period used, e.g.
SPI device configuration.
Definition periph_cpu.h:333
gpio_t mosi
GPIO used as MOSI pin.
Definition periph_cpu.h:868
SPI_t * dev
pointer to the used SPI device
Definition periph_cpu.h:334
gpio_t sclk
SCLK pin.
Definition periph_cpu.h:86
gpio_t miso
GPIO used as MISO pin.
Definition periph_cpu.h:869
Timer device configuration.
Definition periph_cpu.h:260
uint8_t irqn
global IRQ channel
Definition periph_cpu.h:320
uint8_t bitmode
counter width
int channels
Number of channels for the timer.
Definition periph_cpu.h:113
TC0_t * dev
Pointer to the used as Timer device.
Definition periph_cpu.h:261
UART device configuration.
Definition periph_cpu.h:214
USART_t * dev
pointer to the used UART device
Definition periph_cpu.h:215
gpio_t tx_pin
pin used for TX
Definition periph_cpu.h:218
gpio_t rx_pin
pin used for RX
Definition periph_cpu.h:217
uint8_t irqn
IRQ channel.
Definition periph_cpu.h:332
GPIO pin configuration for nRF5x MCUs.
gpio_pull_t pull
Pull resistor configuration.
gpio_drive_strength_t drive_strength
Drive strength of the GPIO.
gpio_state_t state
State of the pin.
bool initial_value
Initial value of the output.
uint8_t bits
the raw bits