#pragma once #include "crc.h" #define SPI_TIMEOUT_US 10000U // got max rate from hitting a non-existent endpoint // in a tight loop, plus some buffer #define SPI_IRQ_RATE 16000U #ifdef STM32H7 #define SPI_BUF_SIZE 2048U // H7 DMA2 located in D2 domain, so we need to use SRAM1/SRAM2 __attribute__((section(".sram12"))) extern uint8_t spi_buf_rx[SPI_BUF_SIZE]; __attribute__((section(".sram12"))) extern uint8_t spi_buf_tx[SPI_BUF_SIZE]; #else #define SPI_BUF_SIZE 1024U extern uint8_t spi_buf_rx[SPI_BUF_SIZE]; extern uint8_t spi_buf_tx[SPI_BUF_SIZE]; #endif #define SPI_CHECKSUM_START 0xABU #define SPI_SYNC_BYTE 0x5AU #define SPI_HACK 0x79U #define SPI_DACK 0x85U #define SPI_NACK 0x1FU // SPI states enum { SPI_STATE_HEADER, SPI_STATE_HEADER_ACK, SPI_STATE_HEADER_NACK, SPI_STATE_DATA_RX, SPI_STATE_DATA_RX_ACK, SPI_STATE_DATA_TX }; extern uint16_t spi_checksum_error_count; #define SPI_HEADER_SIZE 7U // low level SPI prototypes void llspi_init(void); void llspi_mosi_dma(uint8_t *addr, int len); void llspi_miso_dma(uint8_t *addr, int len); void can_tx_comms_resume_spi(void); #if defined(ENABLE_SPI) || defined(BOOTSTUB) void spi_init(void); void spi_rx_done(void); void spi_tx_done(bool reset); #endif