| | #include <SPI.h> |
| | #include <Adafruit_LSM6DSOX.h> |
| | #include <stdint.h> |
| |
|
| | #define BUFFER_SIZE 48 |
| | #define SS_PIN 10 |
| |
|
| | |
| | Adafruit_LSM6DSOX sensor1; |
| | uint8_t sensor1_addr = 0x6A; |
| | Adafruit_LSM6DSOX sensor2; |
| | uint8_t sensor2_addr = 0x6B; |
| |
|
| | |
| | float sensorData[12]; |
| |
|
| | volatile uint8_t pos = 0; |
| | volatile bool dataReady = false; |
| | volatile bool transferComplete = false; |
| |
|
| | uint8_t sendStorage[BUFFER_SIZE]; |
| |
|
| | |
| | #define SPI0_INTERRUPT_NUMBER (IRQn_Type)24 |
| |
|
| | void setup() { |
| | Serial.begin(115200); |
| | slaveBegin(SS_PIN); |
| | } |
| |
|
| | void loop() { |
| | if (transferComplete) { |
| | transferComplete = false; |
| |
|
| | |
| | updateSensorData(); |
| |
|
| | |
| | memcpy(sendStorage, sensorData, sizeof(sensorData)); |
| |
|
| |
|
| | |
| | |
| | REG_SPI0_TDR = sendStorage[0]; |
| | pos = 1; |
| | } |
| | } |
| |
|
| | void slaveBegin(uint8_t _pin) { |
| | |
| | NVIC_ClearPendingIRQ(SPI0_INTERRUPT_NUMBER); |
| | NVIC_EnableIRQ(SPI0_INTERRUPT_NUMBER); |
| |
|
| | |
| | SPI.begin(_pin); |
| | REG_SPI0_CR = SPI_CR_SWRST; |
| |
|
| | |
| | REG_SPI0_IDR = SPI_IDR_TDRE | SPI_IDR_MODF | SPI_IDR_OVRES | |
| | SPI_IDR_NSSR | SPI_IDR_TXEMPTY | SPI_IDR_UNDES; |
| | REG_SPI0_IER = SPI_IER_RDRF; |
| |
|
| | |
| | REG_SPI0_CR = SPI_CR_SPIEN; |
| | REG_SPI0_MR = SPI_MR_MODFDIS; |
| | REG_SPI0_CSR = SPI_MODE0; |
| |
|
| | |
| | while (!sensor1.begin_I2C(sensor1_addr)) { |
| | Serial.println("Failed to initialize sensor1!"); |
| | delay(10); |
| | } |
| |
|
| | while (!sensor2.begin_I2C(sensor2_addr)) { |
| | Serial.println("Failed to initialize sensor2!"); |
| | delay(10); |
| | } |
| |
|
| | sensor1.setAccelDataRate(LSM6DS_RATE_416_HZ); |
| | sensor2.setAccelDataRate(LSM6DS_RATE_416_HZ); |
| |
|
| | |
| | updateSensorData(); |
| | memcpy(sendStorage, sensorData, sizeof(sensorData)); |
| |
|
| | |
| | REG_SPI0_TDR = sendStorage[0]; |
| | pos = 1; |
| | } |
| |
|
| | void updateSensorData() { |
| | |
| | sensor1.readAcceleration(sensorData[0], sensorData[1], sensorData[2]); |
| | sensor1.readGyroscope(sensorData[3], sensorData[4], sensorData[5]); |
| |
|
| | |
| | sensor2.readAcceleration(sensorData[6], sensorData[7], sensorData[8]); |
| | sensor2.readGyroscope(sensorData[9], sensorData[10], sensorData[11]); |
| | } |
| |
|
| | void SPI0_Handler(void) { |
| | uint32_t status = REG_SPI0_SR; |
| |
|
| | |
| | if (status & SPI_SR_RDRF) { |
| | |
| | uint8_t received_byte = REG_SPI0_RDR & 0xFF; |
| |
|
| | |
| | if (pos < BUFFER_SIZE) { |
| | REG_SPI0_TDR = sendStorage[pos++]; |
| | } else { |
| | |
| | transferComplete = true; |
| | pos = 0; |
| | } |
| | } |
| | } |
| |
|