10 #pragma GCC optimize ("O2") 27 .clock = RCC_APB2Periph_SPI1,
38 .clock = RCC_APB1Periph_SPI2,
49 .clock = RCC_APB1Periph_SPI3,
59 if (dev->
SPIx == SPI1) {
60 RCC_APB2PeriphResetCmd(RCC_APB2Periph_SPI1, ENABLE);
61 RCC_APB2PeriphResetCmd(RCC_APB2Periph_SPI1, DISABLE);
62 }
else if (dev->
SPIx == SPI2) {
63 RCC_APB1PeriphResetCmd(RCC_APB1Periph_SPI2, ENABLE);
64 RCC_APB1PeriphResetCmd(RCC_APB1Periph_SPI2, DISABLE);
65 }
else if (dev->
SPIx == SPI3) {
66 RCC_APB1PeriphResetCmd(RCC_APB1Periph_SPI3, ENABLE);
67 RCC_APB1PeriphResetCmd(RCC_APB1Periph_SPI3, DISABLE);
68 }
else if (dev->
SPIx == SPI4) {
69 RCC_APB2PeriphResetCmd(RCC_APB2Periph_SPI4, ENABLE);
70 RCC_APB2PeriphResetCmd(RCC_APB2Periph_SPI4, DISABLE);
71 }
else if (dev->
SPIx == SPI5) {
72 RCC_APB2PeriphResetCmd(RCC_APB2Periph_SPI5, ENABLE);
73 RCC_APB2PeriphResetCmd(RCC_APB2Periph_SPI5, DISABLE);
74 }
else if (dev->
SPIx == SPI6) {
75 RCC_APB2PeriphResetCmd(RCC_APB2Periph_SPI6, ENABLE);
76 RCC_APB2PeriphResetCmd(RCC_APB2Periph_SPI6, DISABLE);
133 SPI_InitTypeDef SPI_InitStructure;
144 if (dev->
SPIx == SPI1)
145 RCC_APB2PeriphClockCmd(dev->
clock, ENABLE);
146 else if (dev->
SPIx == SPI2)
147 RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);
149 RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI3, ENABLE);
152 SPI_StructInit(&SPI_InitStructure);
153 SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
154 SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
158 SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
159 SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;
162 SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
163 SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
166 SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;
167 SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;
170 SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;
171 SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
178 SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
179 SPI_InitStructure.SPI_BaudRatePrescaler = baudPrescaler;
181 SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_LSB;
183 SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
185 SPI_InitStructure.SPI_CRCPolynomial = 7;
187 SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
189 SPI_InitStructure.SPI_Mode = SPI_Mode_Slave;
191 SPI_Init(dev->
SPIx, &SPI_InitStructure);
193 SPI_Cmd(dev->
SPIx, ENABLE);
201 (void) dev->
SPIx->DR;
207 #define BR_CLEAR_MASK 0xFFC7 209 SPI_Cmd(dev->
SPIx, DISABLE);
213 SPI_Cmd(dev->
SPIx, ENABLE);
220 const uint8_t *txbuf,
225 uint16_t txc_in=txcount;
233 dev->
SPIx->DR = *txbuf++;
238 (void) dev->
SPIx->DR;
246 dev->
SPIx->DR = 0xFF;
251 *rxbuf++ = dev->
SPIx->DR;
266 NVIC_ClearPendingIRQ(dev->
irq);
const spi_dev *const _SPI2
static const spi_dev spi1
static void spi_peripheral_disable(const spi_dev *dev)
Disable a SPI peripheral.
void spi_set_speed(const spi_dev *dev, uint16_t baudPrescaler)
void spi_init(const spi_dev *dev)
Initialize and reset a SPI device.
void gpio_set_mode(const gpio_dev *const dev, uint8_t pin, gpio_pin_mode mode)
int spimaster_transfer(const spi_dev *dev, const uint8_t *txbuf, uint16_t txcount, uint8_t *rxbuf, uint16_t rxcount)
const spi_dev *const _SPI3
static AP_HAL::OwnPtr< AP_HAL::Device > dev
void spi_gpio_slave_cfg(const spi_dev *dev, const gpio_dev *comm_dev, uint8_t sck_bit, uint8_t miso_bit, uint8_t mosi_bit)
static void spi_disable_irq(const spi_dev *dev, spi_interrupt interrupt_flags)
static void isr_handler(const spi_dev *dev)
static uint8_t spi_is_busy(const spi_dev *dev)
static const spi_dev spi3
static const spi_dev spi2
static spi_state spi1_state IN_CCM
static void gpio_set_speed(const gpio_dev *const dev, uint8_t pin, GPIOSpeed_t gpio_speed)
const spi_dev *const _SPI1
static void gpio_set_af_mode(const gpio_dev *const dev, uint8_t pin, uint8_t mode)
static void delay_ns100(uint32_t us)
void revo_call_handler(Handler h, uint32_t arg)
void spi_foreach(void(*fn)(const spi_dev *))
Call a function on each SPI port.
void spi_gpio_master_cfg(const spi_dev *dev, const gpio_dev *comm_dev, uint8_t sck_bit, uint8_t miso_bit, uint8_t mosi_bit)
Configure and enable a SPI device as bus master.
void spi_reconfigure(const spi_dev *dev, uint8_t ismaster, uint16_t baudPrescaler, uint16_t bitorder, uint8_t mode)