Unify spi_master headers (#24857)
* Move default config to .c file * Explicitly define PAL modes for boards with custom init * Unify spi_master headers
This commit is contained in:
parent
0747f887d6
commit
ee63d39058
12 changed files with 183 additions and 175 deletions
|
@ -88,7 +88,7 @@ Start an SPI transaction.
|
||||||
#### Arguments {#api-spi-start-arguments}
|
#### Arguments {#api-spi-start-arguments}
|
||||||
|
|
||||||
- `pin_t slavePin`
|
- `pin_t slavePin`
|
||||||
The QMK pin to assert as the slave select pin, eg. `B4`.
|
The GPIO pin connected to the desired device's `SS` line.
|
||||||
- `bool lsbFirst`
|
- `bool lsbFirst`
|
||||||
Determines the endianness of the transmission. If `true`, the least significant bit of each byte is sent first.
|
Determines the endianness of the transmission. If `true`, the least significant bit of each byte is sent first.
|
||||||
- `uint8_t mode`
|
- `uint8_t mode`
|
||||||
|
@ -106,7 +106,7 @@ Start an SPI transaction.
|
||||||
|
|
||||||
#### Return Value {#api-spi-start-return}
|
#### Return Value {#api-spi-start-return}
|
||||||
|
|
||||||
`false` if the supplied parameters are invalid or the SPI peripheral is already in use, or `true`.
|
`true` if the operation was successful, otherwise `false` if the supplied parameters are invalid or the SPI peripheral is already in use.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
@ -131,7 +131,7 @@ Read a byte from the selected SPI device.
|
||||||
|
|
||||||
#### Return Value {#api-spi-read-return}
|
#### Return Value {#api-spi-read-return}
|
||||||
|
|
||||||
`SPI_STATUS_TIMEOUT` if the timeout period elapses, or the byte read from the device.
|
`SPI_STATUS_TIMEOUT` if the timeout period elapses, otherwise the byte read from the device.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
@ -159,7 +159,7 @@ Receive multiple bytes from the selected SPI device.
|
||||||
#### Arguments {#api-spi-receive-arguments}
|
#### Arguments {#api-spi-receive-arguments}
|
||||||
|
|
||||||
- `uint8_t *data`
|
- `uint8_t *data`
|
||||||
A pointer to the buffer to read into.
|
A pointer to a buffer to read into.
|
||||||
- `uint16_t length`
|
- `uint16_t length`
|
||||||
The number of bytes to read. Take care not to overrun the length of `data`.
|
The number of bytes to read. Take care not to overrun the length of `data`.
|
||||||
|
|
||||||
|
|
116
drivers/spi_master.h
Normal file
116
drivers/spi_master.h
Normal file
|
@ -0,0 +1,116 @@
|
||||||
|
// Copyright 2025 QMK
|
||||||
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include "gpio.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \file
|
||||||
|
*
|
||||||
|
* \defgroup spi_master SPI Master API
|
||||||
|
*
|
||||||
|
* \brief API to communicate with SPI devices.
|
||||||
|
* \{
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Hardware SS pin is defined in the header so that user code can refer to it
|
||||||
|
#ifdef __AVR__
|
||||||
|
# if defined(__AVR_AT90USB162__) || defined(__AVR_ATmega16U2__) || defined(__AVR_ATmega32U2__) || defined(__AVR_ATmega16U4__) || defined(__AVR_ATmega32U4__) || defined(__AVR_AT90USB646__) || defined(__AVR_AT90USB647__) || defined(__AVR_AT90USB1286__) || defined(__AVR_AT90USB1287__)
|
||||||
|
# define SPI_SS_PIN B0
|
||||||
|
# elif defined(__AVR_ATmega32A__)
|
||||||
|
# define SPI_SS_PIN B4
|
||||||
|
# elif defined(__AVR_ATmega328P__) || defined(__AVR_ATmega328__)
|
||||||
|
# define SPI_SS_PIN B2
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
typedef int16_t spi_status_t;
|
||||||
|
|
||||||
|
#define SPI_STATUS_SUCCESS (0)
|
||||||
|
#define SPI_STATUS_ERROR (-1)
|
||||||
|
#define SPI_STATUS_TIMEOUT (-2)
|
||||||
|
|
||||||
|
#define SPI_TIMEOUT_IMMEDIATE (0)
|
||||||
|
#define SPI_TIMEOUT_INFINITE (0xFFFF)
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
typedef struct spi_start_config_t {
|
||||||
|
pin_t slave_pin;
|
||||||
|
bool lsb_first;
|
||||||
|
uint8_t mode;
|
||||||
|
uint16_t divisor;
|
||||||
|
bool cs_active_low;
|
||||||
|
} spi_start_config_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Initialize the SPI driver. This function must be called only once, before any of the below functions can be called.
|
||||||
|
*/
|
||||||
|
void spi_init(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Start an SPI transaction.
|
||||||
|
*
|
||||||
|
* \param slavePin The GPIO pin connected to the desired device's `SS` line.
|
||||||
|
* \param lsbFirst Determines the endianness of the transmission. If `true`, the least significant bit of each byte is sent first.
|
||||||
|
* \param mode The SPI mode to use.
|
||||||
|
* \param divisor The SPI clock divisor.
|
||||||
|
*
|
||||||
|
* \return `true` if the operation was successful, otherwise `false` if the supplied parameters are invalid or the SPI peripheral is already in use.
|
||||||
|
*/
|
||||||
|
bool spi_start(pin_t slavePin, bool lsbFirst, uint8_t mode, uint16_t divisor);
|
||||||
|
|
||||||
|
bool spi_start_extended(spi_start_config_t *start_config);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Write a byte to the selected SPI device.
|
||||||
|
*
|
||||||
|
* \param data The byte to write.
|
||||||
|
*
|
||||||
|
* \return `SPI_STATUS_TIMEOUT` if the timeout period elapses, or `SPI_STATUS_SUCCESS`.
|
||||||
|
*/
|
||||||
|
spi_status_t spi_write(uint8_t data);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Read a byte from the selected SPI device.
|
||||||
|
*
|
||||||
|
* \return `SPI_STATUS_TIMEOUT` if the timeout period elapses, otherwise the byte read from the device.
|
||||||
|
*/
|
||||||
|
spi_status_t spi_read(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Send multiple bytes to the selected SPI device.
|
||||||
|
*
|
||||||
|
* \param data A pointer to the data to write from.
|
||||||
|
* \param length The number of bytes to write. Take care not to overrun the length of `data`.
|
||||||
|
*
|
||||||
|
* \return `SPI_STATUS_TIMEOUT` if the timeout period elapses, `SPI_STATUS_ERROR` if some other error occurs, otherwise `SPI_STATUS_SUCCESS`.
|
||||||
|
*/
|
||||||
|
spi_status_t spi_transmit(const uint8_t *data, uint16_t length);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Receive multiple bytes from the selected SPI device.
|
||||||
|
*
|
||||||
|
* \param data A pointer to a buffer to read into.
|
||||||
|
* \param length The number of bytes to read. Take care not to overrun the length of `data`.
|
||||||
|
*
|
||||||
|
* \return `SPI_STATUS_TIMEOUT` if the timeout period elapses, `SPI_STATUS_ERROR` if some other error occurs, otherwise `SPI_STATUS_SUCCESS`.
|
||||||
|
*/
|
||||||
|
spi_status_t spi_receive(uint8_t *data, uint16_t length);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief End the current SPI transaction. This will deassert the slave select pin and reset the endianness, mode and divisor configured by `spi_start()`.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
void spi_stop(void);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/** \} */
|
|
@ -22,8 +22,11 @@
|
||||||
/* SPI Config for LED Driver */
|
/* SPI Config for LED Driver */
|
||||||
#define SPI_DRIVER SPIDQ
|
#define SPI_DRIVER SPIDQ
|
||||||
#define SPI_SCK_PIN A5
|
#define SPI_SCK_PIN A5
|
||||||
|
#define SPI_SCK_PAL_MODE 5
|
||||||
#define SPI_MOSI_PIN A7
|
#define SPI_MOSI_PIN A7
|
||||||
|
#define SPI_MOSI_PAL_MODE 5
|
||||||
#define SPI_MISO_PIN A6
|
#define SPI_MISO_PIN A6
|
||||||
|
#define SPI_MISO_PAL_MODE 5
|
||||||
|
|
||||||
#define AW20216S_CS_PIN_1 A15
|
#define AW20216S_CS_PIN_1 A15
|
||||||
#define AW20216S_CS_PIN_2 B15
|
#define AW20216S_CS_PIN_2 B15
|
||||||
|
|
|
@ -22,8 +22,11 @@
|
||||||
/* SPI Config for LED Driver */
|
/* SPI Config for LED Driver */
|
||||||
#define SPI_DRIVER SPIDQ
|
#define SPI_DRIVER SPIDQ
|
||||||
#define SPI_SCK_PIN A5
|
#define SPI_SCK_PIN A5
|
||||||
|
#define SPI_SCK_PAL_MODE 5
|
||||||
#define SPI_MOSI_PIN A7
|
#define SPI_MOSI_PIN A7
|
||||||
|
#define SPI_MOSI_PAL_MODE 5
|
||||||
#define SPI_MISO_PIN A6
|
#define SPI_MISO_PIN A6
|
||||||
|
#define SPI_MISO_PAL_MODE 5
|
||||||
|
|
||||||
#define AW20216S_CS_PIN_1 A15
|
#define AW20216S_CS_PIN_1 A15
|
||||||
#define AW20216S_CS_PIN_2 B15
|
#define AW20216S_CS_PIN_2 B15
|
||||||
|
|
|
@ -22,8 +22,11 @@
|
||||||
/* SPI Config for LED Driver */
|
/* SPI Config for LED Driver */
|
||||||
#define SPI_DRIVER SPIDQ
|
#define SPI_DRIVER SPIDQ
|
||||||
#define SPI_SCK_PIN A5
|
#define SPI_SCK_PIN A5
|
||||||
|
#define SPI_SCK_PAL_MODE 5
|
||||||
#define SPI_MOSI_PIN A7
|
#define SPI_MOSI_PIN A7
|
||||||
|
#define SPI_MOSI_PAL_MODE 5
|
||||||
#define SPI_MISO_PIN A6
|
#define SPI_MISO_PIN A6
|
||||||
|
#define SPI_MISO_PAL_MODE 5
|
||||||
|
|
||||||
#define AW20216S_CS_PIN_1 A15
|
#define AW20216S_CS_PIN_1 A15
|
||||||
#define AW20216S_CS_PIN_2 B15
|
#define AW20216S_CS_PIN_2 B15
|
||||||
|
|
|
@ -22,8 +22,11 @@
|
||||||
/* SPI Config for LED Driver */
|
/* SPI Config for LED Driver */
|
||||||
#define SPI_DRIVER SPIDQ
|
#define SPI_DRIVER SPIDQ
|
||||||
#define SPI_SCK_PIN A5
|
#define SPI_SCK_PIN A5
|
||||||
|
#define SPI_SCK_PAL_MODE 5
|
||||||
#define SPI_MOSI_PIN A7
|
#define SPI_MOSI_PIN A7
|
||||||
|
#define SPI_MOSI_PAL_MODE 5
|
||||||
#define SPI_MISO_PIN A6
|
#define SPI_MISO_PIN A6
|
||||||
|
#define SPI_MISO_PAL_MODE 5
|
||||||
|
|
||||||
#define AW20216S_CS_PIN_1 A15
|
#define AW20216S_CS_PIN_1 A15
|
||||||
#define AW20216S_CS_PIN_2 B15
|
#define AW20216S_CS_PIN_2 B15
|
||||||
|
|
|
@ -22,8 +22,11 @@
|
||||||
/* SPI Config for LED Driver */
|
/* SPI Config for LED Driver */
|
||||||
#define SPI_DRIVER SPIDQ
|
#define SPI_DRIVER SPIDQ
|
||||||
#define SPI_SCK_PIN A5
|
#define SPI_SCK_PIN A5
|
||||||
|
#define SPI_SCK_PAL_MODE 5
|
||||||
#define SPI_MOSI_PIN A7
|
#define SPI_MOSI_PIN A7
|
||||||
|
#define SPI_MOSI_PAL_MODE 5
|
||||||
#define SPI_MISO_PIN A6
|
#define SPI_MISO_PIN A6
|
||||||
|
#define SPI_MISO_PAL_MODE 5
|
||||||
|
|
||||||
#define AW20216S_CS_PIN_1 A15
|
#define AW20216S_CS_PIN_1 A15
|
||||||
#define AW20216S_EN_PIN C13
|
#define AW20216S_EN_PIN C13
|
||||||
|
|
|
@ -22,8 +22,11 @@
|
||||||
/* SPI Config for LED Driver */
|
/* SPI Config for LED Driver */
|
||||||
#define SPI_DRIVER SPIDQ
|
#define SPI_DRIVER SPIDQ
|
||||||
#define SPI_SCK_PIN A5
|
#define SPI_SCK_PIN A5
|
||||||
|
#define SPI_SCK_PAL_MODE 5
|
||||||
#define SPI_MOSI_PIN A7
|
#define SPI_MOSI_PIN A7
|
||||||
|
#define SPI_MOSI_PAL_MODE 5
|
||||||
#define SPI_MISO_PIN A6
|
#define SPI_MISO_PIN A6
|
||||||
|
#define SPI_MISO_PAL_MODE 5
|
||||||
|
|
||||||
#define AW20216S_CS_PIN_1 A15
|
#define AW20216S_CS_PIN_1 A15
|
||||||
#define AW20216S_CS_PIN_2 B15
|
#define AW20216S_CS_PIN_2 B15
|
||||||
|
|
|
@ -22,8 +22,11 @@
|
||||||
/* SPI Config for LED Driver */
|
/* SPI Config for LED Driver */
|
||||||
#define SPI_DRIVER SPIDQ
|
#define SPI_DRIVER SPIDQ
|
||||||
#define SPI_SCK_PIN A5
|
#define SPI_SCK_PIN A5
|
||||||
|
#define SPI_SCK_PAL_MODE 5
|
||||||
#define SPI_MOSI_PIN A7
|
#define SPI_MOSI_PIN A7
|
||||||
|
#define SPI_MOSI_PAL_MODE 5
|
||||||
#define SPI_MISO_PIN A6
|
#define SPI_MISO_PIN A6
|
||||||
|
#define SPI_MISO_PAL_MODE 5
|
||||||
|
|
||||||
#define AW20216S_CS_PIN_1 A15
|
#define AW20216S_CS_PIN_1 A15
|
||||||
#define AW20216S_CS_PIN_2 B15
|
#define AW20216S_CS_PIN_2 B15
|
||||||
|
|
|
@ -1,68 +0,0 @@
|
||||||
/* Copyright 2020
|
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include <stdbool.h>
|
|
||||||
|
|
||||||
#include "gpio.h"
|
|
||||||
|
|
||||||
typedef int16_t spi_status_t;
|
|
||||||
|
|
||||||
// Hardware SS pin is defined in the header so that user code can refer to it
|
|
||||||
#if defined(__AVR_AT90USB162__) || defined(__AVR_ATmega16U2__) || defined(__AVR_ATmega32U2__) || defined(__AVR_ATmega16U4__) || defined(__AVR_ATmega32U4__) || defined(__AVR_AT90USB646__) || defined(__AVR_AT90USB647__) || defined(__AVR_AT90USB1286__) || defined(__AVR_AT90USB1287__)
|
|
||||||
# define SPI_SS_PIN B0
|
|
||||||
#elif defined(__AVR_ATmega32A__)
|
|
||||||
# define SPI_SS_PIN B4
|
|
||||||
#elif defined(__AVR_ATmega328P__) || defined(__AVR_ATmega328__)
|
|
||||||
# define SPI_SS_PIN B2
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define SPI_STATUS_SUCCESS (0)
|
|
||||||
#define SPI_STATUS_ERROR (-1)
|
|
||||||
#define SPI_STATUS_TIMEOUT (-2)
|
|
||||||
|
|
||||||
#define SPI_TIMEOUT_IMMEDIATE (0)
|
|
||||||
#define SPI_TIMEOUT_INFINITE (0xFFFF)
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
typedef struct spi_start_config_t {
|
|
||||||
pin_t slave_pin;
|
|
||||||
bool lsb_first;
|
|
||||||
uint8_t mode;
|
|
||||||
uint16_t divisor;
|
|
||||||
bool cs_active_low;
|
|
||||||
} spi_start_config_t;
|
|
||||||
|
|
||||||
void spi_init(void);
|
|
||||||
|
|
||||||
bool spi_start(pin_t slavePin, bool lsbFirst, uint8_t mode, uint16_t divisor);
|
|
||||||
bool spi_start_extended(spi_start_config_t *start_config);
|
|
||||||
|
|
||||||
spi_status_t spi_write(uint8_t data);
|
|
||||||
|
|
||||||
spi_status_t spi_read(void);
|
|
||||||
|
|
||||||
spi_status_t spi_transmit(const uint8_t *data, uint16_t length);
|
|
||||||
|
|
||||||
spi_status_t spi_receive(uint8_t *data, uint16_t length);
|
|
||||||
|
|
||||||
void spi_stop(void);
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
|
@ -15,8 +15,49 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "spi_master.h"
|
#include "spi_master.h"
|
||||||
|
#include "chibios_config.h"
|
||||||
|
#include <ch.h>
|
||||||
|
#include <hal.h>
|
||||||
|
|
||||||
#include "timer.h"
|
#ifndef SPI_DRIVER
|
||||||
|
# define SPI_DRIVER SPID2
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef SPI_SCK_PIN
|
||||||
|
# define SPI_SCK_PIN B13
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef SPI_SCK_PAL_MODE
|
||||||
|
# ifdef USE_GPIOV1
|
||||||
|
# define SPI_SCK_PAL_MODE PAL_MODE_ALTERNATE_PUSHPULL
|
||||||
|
# else
|
||||||
|
# define SPI_SCK_PAL_MODE 5
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef SPI_MOSI_PIN
|
||||||
|
# define SPI_MOSI_PIN B15
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef SPI_MOSI_PAL_MODE
|
||||||
|
# ifdef USE_GPIOV1
|
||||||
|
# define SPI_MOSI_PAL_MODE PAL_MODE_ALTERNATE_PUSHPULL
|
||||||
|
# else
|
||||||
|
# define SPI_MOSI_PAL_MODE 5
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef SPI_MISO_PIN
|
||||||
|
# define SPI_MISO_PIN B14
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef SPI_MISO_PAL_MODE
|
||||||
|
# ifdef USE_GPIOV1
|
||||||
|
# define SPI_MISO_PAL_MODE PAL_MODE_ALTERNATE_PUSHPULL
|
||||||
|
# else
|
||||||
|
# define SPI_MISO_PAL_MODE 5
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
static bool spiStarted = false;
|
static bool spiStarted = false;
|
||||||
#if SPI_SELECT_MODE == SPI_SELECT_MODE_NONE
|
#if SPI_SELECT_MODE == SPI_SELECT_MODE_NONE
|
||||||
|
|
|
@ -1,102 +0,0 @@
|
||||||
/* Copyright 2020 Nick Brassel (tzarc)
|
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include <ch.h>
|
|
||||||
#include <hal.h>
|
|
||||||
#include <stdbool.h>
|
|
||||||
|
|
||||||
#include "gpio.h"
|
|
||||||
#include "chibios_config.h"
|
|
||||||
|
|
||||||
#ifndef SPI_DRIVER
|
|
||||||
# define SPI_DRIVER SPID2
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef SPI_SCK_PIN
|
|
||||||
# define SPI_SCK_PIN B13
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef SPI_SCK_PAL_MODE
|
|
||||||
# if defined(USE_GPIOV1)
|
|
||||||
# define SPI_SCK_PAL_MODE PAL_MODE_ALTERNATE_PUSHPULL
|
|
||||||
# else
|
|
||||||
# define SPI_SCK_PAL_MODE 5
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef SPI_MOSI_PIN
|
|
||||||
# define SPI_MOSI_PIN B15
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef SPI_MOSI_PAL_MODE
|
|
||||||
# if defined(USE_GPIOV1)
|
|
||||||
# define SPI_MOSI_PAL_MODE PAL_MODE_ALTERNATE_PUSHPULL
|
|
||||||
# else
|
|
||||||
# define SPI_MOSI_PAL_MODE 5
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef SPI_MISO_PIN
|
|
||||||
# define SPI_MISO_PIN B14
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef SPI_MISO_PAL_MODE
|
|
||||||
# if defined(USE_GPIOV1)
|
|
||||||
# define SPI_MISO_PAL_MODE PAL_MODE_ALTERNATE_PUSHPULL
|
|
||||||
# else
|
|
||||||
# define SPI_MISO_PAL_MODE 5
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
typedef int16_t spi_status_t;
|
|
||||||
|
|
||||||
#define SPI_STATUS_SUCCESS (0)
|
|
||||||
#define SPI_STATUS_ERROR (-1)
|
|
||||||
#define SPI_STATUS_TIMEOUT (-2)
|
|
||||||
|
|
||||||
#define SPI_TIMEOUT_IMMEDIATE (0)
|
|
||||||
#define SPI_TIMEOUT_INFINITE (0xFFFF)
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
typedef struct spi_start_config_t {
|
|
||||||
pin_t slave_pin;
|
|
||||||
bool lsb_first;
|
|
||||||
uint8_t mode;
|
|
||||||
uint16_t divisor;
|
|
||||||
bool cs_active_low;
|
|
||||||
} spi_start_config_t;
|
|
||||||
|
|
||||||
void spi_init(void);
|
|
||||||
|
|
||||||
bool spi_start(pin_t slavePin, bool lsbFirst, uint8_t mode, uint16_t divisor);
|
|
||||||
bool spi_start_extended(spi_start_config_t *start_config);
|
|
||||||
|
|
||||||
spi_status_t spi_write(uint8_t data);
|
|
||||||
|
|
||||||
spi_status_t spi_read(void);
|
|
||||||
|
|
||||||
spi_status_t spi_transmit(const uint8_t *data, uint16_t length);
|
|
||||||
|
|
||||||
spi_status_t spi_receive(uint8_t *data, uint16_t length);
|
|
||||||
|
|
||||||
void spi_stop(void);
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
Loading…
Add table
Reference in a new issue