| | #include <Wire.h> |
| | extern TwoWire Wire1; |
| | #include <SPI.h> |
| | #include <Adafruit_LSM6DSOX.h> |
| |
|
| | #define CS_PIN 10 |
| |
|
| | #define BUFFER_SIZE 48 |
| |
|
| | |
| | Adafruit_LSM6DSOX sensor1; |
| | uint8_t sensor1_addr = 0x6A; |
| | Adafruit_LSM6DSOX sensor2; |
| | uint8_t sensor2_addr = 0x6B; |
| |
|
| | |
| | float masterData[12]; |
| | float slaveData[12]; |
| |
|
| | uint8_t slaveStorage[BUFFER_SIZE]; |
| |
|
| | |
| | #define TOTAL_DATA_SIZE 96 |
| | uint8_t i2cData[TOTAL_DATA_SIZE]; |
| |
|
| | |
| | volatile uint8_t requestedChunk = 0; |
| | #define CHUNK_SIZE 32 |
| | #define TOTAL_CHUNKS ((TOTAL_DATA_SIZE + CHUNK_SIZE - 1) / CHUNK_SIZE) |
| |
|
| | void setup() |
| | { |
| | Serial.begin(115200); |
| |
|
| | |
| | pinMode(CS_PIN, OUTPUT); |
| | digitalWrite(CS_PIN, HIGH); |
| | SPI.begin(); |
| | SPI.beginTransaction(SPISettings(21000000, MSBFIRST, SPI_MODE0)); |
| |
|
| | |
| | Wire.begin(); |
| | while (!sensor1.begin_I2C(sensor1_addr, &Wire)) |
| | { |
| | Serial.println("Failed to initialize sensor1!"); |
| | delay(10); |
| | } |
| |
|
| | while (!sensor2.begin_I2C(sensor2_addr, &Wire)) |
| | { |
| | Serial.println("Failed to initialize sensor2!"); |
| | delay(10); |
| | } |
| |
|
| | sensor1.setAccelDataRate(LSM6DS_RATE_416_HZ); |
| | sensor2.setAccelDataRate(LSM6DS_RATE_416_HZ); |
| |
|
| | |
| | Wire1.begin(0x08); |
| | Wire1.onReceive(receiveEvent); |
| | Wire1.onRequest(requestEvent); |
| | } |
| |
|
| | void loop() |
| | { |
| | |
| | updateMasterSensorData(); |
| |
|
| | |
| | digitalWrite(CS_PIN, LOW); |
| | for (size_t i = 0; i < BUFFER_SIZE; i++) |
| | { |
| | slaveStorage[i] = SPI.transfer(0x00); |
| | } |
| | digitalWrite(CS_PIN, HIGH); |
| |
|
| | |
| | memcpy(slaveData, slaveStorage, sizeof(slaveData)); |
| |
|
| | |
| |
|
| | Serial.println(slaveData[0]); |
| | prepareI2CData(); |
| | } |
| |
|
| | |
| | void updateMasterSensorData() |
| | { |
| |
|
| | |
| | sensor1.readAcceleration(masterData[0], masterData[1], masterData[2]); |
| | sensor1.readGyroscope(masterData[3], masterData[4], masterData[5]); |
| |
|
| | |
| | sensor2.readAcceleration(masterData[6], masterData[7], masterData[8]); |
| | sensor2.readGyroscope(masterData[9], masterData[10], masterData[11]); |
| | } |
| |
|
| | |
| | void prepareI2CData() |
| | { |
| | |
| | memcpy(i2cData, masterData, sizeof(masterData)); |
| | memcpy(i2cData + sizeof(masterData), slaveData, sizeof(slaveData)); |
| | } |
| |
|
| | |
| | void receiveEvent(int numBytes) |
| | { |
| | if (numBytes >= 1) |
| | { |
| | requestedChunk = Wire1.read(); |
| | |
| | } |
| | } |
| |
|
| | |
| | void requestEvent() |
| | { |
| | |
| | uint16_t offset = requestedChunk * CHUNK_SIZE; |
| | uint8_t bytesToSend = CHUNK_SIZE; |
| |
|
| | if (offset + CHUNK_SIZE > TOTAL_DATA_SIZE) |
| | { |
| | bytesToSend = TOTAL_DATA_SIZE - offset; |
| | } |
| |
|
| | Wire1.write(i2cData + offset, bytesToSend); |
| | } |
| |
|