mirror of
https://github.com/paparazzi/paparazzi.git
synced 2026-05-30 19:47:50 +08:00
[spi] update spi_slave_hs for generic device (and chimu_spi)
This commit is contained in:
@@ -13,7 +13,7 @@
|
|||||||
<define name="USE_AHRS"/>
|
<define name="USE_AHRS"/>
|
||||||
<define name="USE_INS_MODULE"/>
|
<define name="USE_INS_MODULE"/>
|
||||||
<define name="USE_SPI"/>
|
<define name="USE_SPI"/>
|
||||||
<define name="INS_LINK" value="SpiSlave"/>
|
<define name="INS_LINK" value="spi_slave_hs"/>
|
||||||
<define name="USE_USB_HIGH_PCLK" />
|
<define name="USE_USB_HIGH_PCLK" />
|
||||||
<file name="ahrs_chimu_spi.c"/>
|
<file name="ahrs_chimu_spi.c"/>
|
||||||
<file name="imu_chimu.c"/>
|
<file name="imu_chimu.c"/>
|
||||||
|
|||||||
@@ -38,6 +38,7 @@
|
|||||||
#include "pprz_debug.h"
|
#include "pprz_debug.h"
|
||||||
#include "armVIC.h"
|
#include "armVIC.h"
|
||||||
|
|
||||||
|
struct spi_slave_hs spi_slave_hs;
|
||||||
|
|
||||||
/* High Speed SPI Slave Circular Buffer */
|
/* High Speed SPI Slave Circular Buffer */
|
||||||
uint16_t spi_slave_hs_rx_insert_idx, spi_slave_hs_rx_extract_idx;
|
uint16_t spi_slave_hs_rx_insert_idx, spi_slave_hs_rx_extract_idx;
|
||||||
@@ -103,6 +104,36 @@ static void SSP_ISR(void) __attribute__((naked));
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
// Functions for the generic device API
|
||||||
|
static int spi_slave_hs_check_free_space(struct spi_slave_hs *p __attribute__((unused)), uint8_t len __attribute__((unused)))
|
||||||
|
{
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void spi_slave_hs_transmit(struct spi_slave_hs *p __attribute__((unused)), uint8_t byte)
|
||||||
|
{
|
||||||
|
uint8_t temp = (spi_slave_hs_tx_insert_idx + 1) % SPI_SLAVE_HS_TX_BUFFER_SIZE;
|
||||||
|
if (temp != spi_slave_hs_tx_extract_idx) /* there is room left */
|
||||||
|
{
|
||||||
|
spi_slave_hs_tx_buffer[spi_slave_hs_tx_insert_idx] = byte;
|
||||||
|
spi_slave_hs_tx_insert_idx = temp;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void spi_slave_hs_send(struct spi_slave_hs *p __attribute__((unused))) { }
|
||||||
|
|
||||||
|
static int spi_slave_hs_char_available(struct spi_slave_hs *p __attribute__((unused)))
|
||||||
|
{
|
||||||
|
return spi_slave_hs_rx_insert_idx != spi_slave_hs_rx_extract_idx;
|
||||||
|
}
|
||||||
|
|
||||||
|
static uint8_t spi_slave_hs_getch(struct spi_slave_hs *p __attribute__((unused)))
|
||||||
|
{
|
||||||
|
uint8_t ret = spi_slave_hs_rx_buffer[spi_slave_hs_rx_extract_idx];
|
||||||
|
spi_slave_hs_rx_extract_idx = (spi_slave_hs_rx_extract_idx + 1)%SPI_SLAVE_HS_RX_BUFFER_SIZE;
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
void spi_slave_hs_init(void)
|
void spi_slave_hs_init(void)
|
||||||
{
|
{
|
||||||
|
|
||||||
@@ -129,6 +160,14 @@ void spi_slave_hs_init(void)
|
|||||||
// Enable Receive interrupt
|
// Enable Receive interrupt
|
||||||
SetBit(SSPIMSC, RXIM);
|
SetBit(SSPIMSC, RXIM);
|
||||||
|
|
||||||
|
// Configure generic device
|
||||||
|
spi_slave_hs.device.periph = (void *)(&spi_slave_hs);
|
||||||
|
spi_slave_hs.device.check_free_space = (check_free_space_t) spi_slave_hs_check_free_space;
|
||||||
|
spi_slave_hs.device.transmit = (transmit_t) spi_slave_hs_transmit;
|
||||||
|
spi_slave_hs.device.send_message = (send_message_t) spi_slave_hs_send;
|
||||||
|
spi_slave_hs.device.char_available = (char_available_t) spi_slave_hs_char_available;
|
||||||
|
spi_slave_hs.device.getchar = (getchar_t) spi_slave_hs_getch;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|||||||
@@ -32,7 +32,14 @@
|
|||||||
#define SPI_SLAVE_HS_ARCH_H
|
#define SPI_SLAVE_HS_ARCH_H
|
||||||
|
|
||||||
#include "std.h"
|
#include "std.h"
|
||||||
|
#include "mcu_periph/link_device.h"
|
||||||
|
|
||||||
|
struct spi_slave_hs {
|
||||||
|
/** Generic device interface */
|
||||||
|
struct link_device device;
|
||||||
|
};
|
||||||
|
|
||||||
|
extern struct spi_slave_hs spi_slave_hs;
|
||||||
|
|
||||||
#define SpiEnable() { \
|
#define SpiEnable() { \
|
||||||
SetBit(SSPCR1, SSE); \
|
SetBit(SSPCR1, SSE); \
|
||||||
@@ -48,29 +55,11 @@
|
|||||||
extern uint16_t spi_slave_hs_rx_insert_idx, spi_slave_hs_rx_extract_idx;
|
extern uint16_t spi_slave_hs_rx_insert_idx, spi_slave_hs_rx_extract_idx;
|
||||||
extern uint8_t spi_slave_hs_rx_buffer[SPI_SLAVE_HS_RX_BUFFER_SIZE];
|
extern uint8_t spi_slave_hs_rx_buffer[SPI_SLAVE_HS_RX_BUFFER_SIZE];
|
||||||
|
|
||||||
#define SpiSlaveChAvailable() (spi_slave_hs_rx_insert_idx != spi_slave_hs_rx_extract_idx)
|
|
||||||
|
|
||||||
#define SpiSlaveGetch() ({\
|
|
||||||
uint8_t ret = spi_slave_hs_rx_buffer[spi_slave_hs_rx_extract_idx]; \
|
|
||||||
spi_slave_hs_rx_extract_idx = (spi_slave_hs_rx_extract_idx + 1)%SPI_SLAVE_HS_RX_BUFFER_SIZE; \
|
|
||||||
ret; \
|
|
||||||
})
|
|
||||||
|
|
||||||
#define SPI_SLAVE_HS_TX_BUFFER_SIZE 64
|
#define SPI_SLAVE_HS_TX_BUFFER_SIZE 64
|
||||||
|
|
||||||
extern uint8_t spi_slave_hs_tx_insert_idx, spi_slave_hs_tx_extract_idx;
|
extern uint8_t spi_slave_hs_tx_insert_idx, spi_slave_hs_tx_extract_idx;
|
||||||
extern uint8_t spi_slave_hs_tx_buffer[SPI_SLAVE_HS_TX_BUFFER_SIZE];
|
extern uint8_t spi_slave_hs_tx_buffer[SPI_SLAVE_HS_TX_BUFFER_SIZE];
|
||||||
|
|
||||||
#define SpiSlaveTransmit(data) {\
|
|
||||||
uint8_t temp = (spi_slave_hs_tx_insert_idx + 1) % SPI_SLAVE_HS_TX_BUFFER_SIZE; \
|
|
||||||
if (temp != spi_slave_hs_tx_extract_idx) /* there is room left */ \
|
|
||||||
{ \
|
|
||||||
spi_slave_hs_tx_buffer[spi_slave_hs_tx_insert_idx] = (uint8_t)data; \
|
|
||||||
spi_slave_hs_tx_insert_idx = temp; \
|
|
||||||
} \
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -365,6 +365,7 @@ extern bool_t spi_slave_wait(struct spi_periph *p);
|
|||||||
/** @}*/
|
/** @}*/
|
||||||
|
|
||||||
#if SPI_SLAVE_HS
|
#if SPI_SLAVE_HS
|
||||||
|
#include "mcu_periph/spi_slave_hs_arch.h"
|
||||||
extern void spi_slave_hs_init(void);
|
extern void spi_slave_hs_init(void);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|||||||
@@ -77,6 +77,7 @@ void parse_ins_buffer(uint8_t);
|
|||||||
|
|
||||||
#ifndef SITL
|
#ifndef SITL
|
||||||
#include "mcu_periph/uart.h"
|
#include "mcu_periph/uart.h"
|
||||||
|
#include "mcu_periph/spi.h"
|
||||||
|
|
||||||
#define InsSend1(c) InsLinkDevice->transmit(InsLinkDevice->periph, c)
|
#define InsSend1(c) InsLinkDevice->transmit(InsLinkDevice->periph, c)
|
||||||
#define InsUartSend1(c) InsSend1(c)
|
#define InsUartSend1(c) InsSend1(c)
|
||||||
|
|||||||
@@ -87,8 +87,8 @@ bool_t chibios_logInit(const bool_t binaryFile)
|
|||||||
chibios_sdlog.device.check_free_space = (check_free_space_t) sdlog_check_free_space;
|
chibios_sdlog.device.check_free_space = (check_free_space_t) sdlog_check_free_space;
|
||||||
chibios_sdlog.device.transmit = (transmit_t) sdlog_transmit;
|
chibios_sdlog.device.transmit = (transmit_t) sdlog_transmit;
|
||||||
chibios_sdlog.device.send_message = (send_message_t) sdlog_send;
|
chibios_sdlog.device.send_message = (send_message_t) sdlog_send;
|
||||||
chibios_sdlog.device.char_available = (char_available_t) null_function; // read only
|
chibios_sdlog.device.char_available = (char_available_t) null_function; // write only
|
||||||
chibios_sdlog.device.getchar = (getchar_t) null_function; // read only
|
chibios_sdlog.device.getchar = (getchar_t) null_function; // write only
|
||||||
|
|
||||||
if (sdLogInit (NULL) != SDLOG_OK)
|
if (sdLogInit (NULL) != SDLOG_OK)
|
||||||
goto error;
|
goto error;
|
||||||
|
|||||||
Reference in New Issue
Block a user