diff --git a/src/entrypoints/anakin-test-dma.cpp b/src/entrypoints/anakin-test-dma.cpp index 72350005f70eb4d065bfa89f2d1978a53085ce28..8242bfaee52a0918ea52c037d6348866f1c19ac4 100644 --- a/src/entrypoints/anakin-test-dma.cpp +++ b/src/entrypoints/anakin-test-dma.cpp @@ -27,6 +27,35 @@ using namespace miosix; +void fifoQueueSz(void *arg) +{ + const SPIDriver& spi = SPIDriver::instance(); + int tx_accum = 0, rx_accum = 0, sz_ctr = 0; + + sLog->logString("Thread started"); + + while(1) + { + DMAFIFOStatus tx = spi.getTxFIFOStatus(); + DMAFIFOStatus rx = spi.getRxFIFOStatus(); + + if(tx > -1 && rx > -1) + { + tx_accum += tx; + rx_accum += rx; + if(++sz_ctr == 100) + { + float tx1 = tx_accum / (float)(DFS_100 - DFS_EE + 1) * 255.0f; + float rx1 = rx_accum / (float)(DFS_100 - DFS_EE + 1) * 255.0f; + tx_accum = rx_accum = sz_ctr = 0; + sLog->logLimitedInt(17, 0, 255, tx1); + sLog->logLimitedInt(18, 0, 255, rx1); + sLog->logUInt32(19, spi.getFIFOFaultCtr()); + } + } + Thread::sleep(1); + } +} int main() { @@ -39,9 +68,7 @@ int main() const std::vector<SingleSensor>& data = sBoard->debugGetSensors(); int ctr=0; - char buf[128] = {0}; - - const SPIDriver& spi = SPIDriver::instance(); + Thread::create(fifoQueueSz, 1024); while(1) { for(const auto& s : data) @@ -58,13 +85,8 @@ int main() break; } } - DMAFIFOStatus tx = spi.getTxFIFOStatus(); - DMAFIFOStatus rx = spi.getRxFIFOStatus(); - - if(tx > -1) sLog->logLimitedInt(17, DFS_EE, DFS_100, tx); - if(rx > -1) sLog->logLimitedInt(18, DFS_EE, DFS_100, rx); - Thread::sleep(1); + Thread::sleep(10); } // NOT EXECUTED diff --git a/src/shared/DMA/DMA.cpp b/src/shared/DMA/DMA.cpp index 14a8df2024954e5a6264c0568593543bab75e195..43581c8261cf1dcf42ec7b7575d38d21b7e3632a 100644 --- a/src/shared/DMA/DMA.cpp +++ b/src/shared/DMA/DMA.cpp @@ -35,6 +35,7 @@ static Thread *waiting = nullptr; static vector<SPIRequest> *requestVector = nullptr; static size_t requestIndex = 0; static bool error = false; +static uint32_t fifoFaultCtr = 0; /** * DMA RX end of transfer @@ -52,10 +53,16 @@ void __attribute__((naked)) DMA2_Stream0_IRQHandler() void __attribute__((used)) SPI1rxDmaHandlerImpl() { if(DMA2->LISR & (DMA_LISR_TEIF0 | DMA_LISR_DMEIF0 | DMA_LISR_FEIF0)) + { error = true; - if(DMA2->HISR & (DMA_HISR_TEIF5 | DMA_HISR_DMEIF5 | DMA_HISR_FEIF5)) + fifoFaultCtr++; + } + if(DMA2->HISR & (DMA_HISR_TEIF5 | DMA_HISR_DMEIF5)) + { error = true; - + fifoFaultCtr++; + } + DMA2->LIFCR = DMA_LIFCR_CTCIF0 | DMA_LIFCR_CTEIF0 | DMA_LIFCR_CDMEIF0 @@ -66,6 +73,7 @@ void __attribute__((used)) SPI1rxDmaHandlerImpl() | DMA_HIFCR_CDMEIF5 | DMA_HIFCR_CFEIF5; + if(requestVector==nullptr) return; (*requestVector)[requestIndex].IRQendTransaction(); @@ -171,6 +179,11 @@ SPIDriver::SPIDriver() } } +uint32_t SPIDriver::getFIFOFaultCtr() const +{ + return fifoFaultCtr; +} + // // class SPIRequest // @@ -193,7 +206,6 @@ void SPIRequest::IRQbeginTransaction() | DMA_SxFCR_FTH_1; DMA2_Stream0->CR = DMA_SxCR_CHSEL_1 | DMA_SxCR_CHSEL_0 // Channel 3 - | DMA_SxCR_MBURST_0 //Read 4 byte at a time from RAM | DMA_SxCR_PL_1 //High priority because fifo disabled | DMA_SxCR_MINC //Increment memory pointer | DMA_SxCR_TCIE //Interrupt on transfer complete @@ -214,7 +226,6 @@ void SPIRequest::IRQbeginTransaction() | DMA_SxFCR_FTH_1; DMA2_Stream5->CR = DMA_SxCR_CHSEL_1 | DMA_SxCR_CHSEL_0 // Channel 3 - | DMA_SxCR_MBURST_0 //Read 4 byte at a time from RAM | DMA_SxCR_PL_1 //High priority because fifo disabled | DMA_SxCR_MINC //Increment memory pointer | DMA_SxCR_DIR_0 //Memory to peripheral diff --git a/src/shared/DMA/DMA.h b/src/shared/DMA/DMA.h index f5f929e407303add384847fb2fe9cac67defd093..dbaba8eba2f05ae8ea45be917ce045f909ed9e85 100644 --- a/src/shared/DMA/DMA.h +++ b/src/shared/DMA/DMA.h @@ -54,6 +54,7 @@ public: { return intToFIFOStatus((DMA2_Stream0->FCR & DMA_SxFCR_FS) >> 3); } + uint32_t getFIFOFaultCtr() const; private: SPIDriver(); diff --git a/src/shared/DMA/SensorSampling.h b/src/shared/DMA/SensorSampling.h index fcb9accbbcb0289cd2cfc796cb414de6449e0b9d..10ac318587d884ced8990df9d92fc2eec4293cea 100644 --- a/src/shared/DMA/SensorSampling.h +++ b/src/shared/DMA/SensorSampling.h @@ -24,6 +24,7 @@ #include <Common.h> #include <DMA/DMA.h> +#include <log/Log.h> class Sensor; class DMASensorSampler @@ -45,10 +46,11 @@ public: void Update() { auto& driver = SPIDriver::instance(); - driver.transaction(mRequests); + bool ret = driver.transaction(mRequests); - for(size_t i=0; i< mSensors.size(); i++) - mSensors[i]->onDMAUpdate(mRequests[i]); + if(ret) + for(size_t i=0; i< mSensors.size(); i++) + mSensors[i]->onDMAUpdate(mRequests[i]); } private: std::vector<Sensor*> mSensors; diff --git a/src/shared/boards/AnakinBoard.cpp b/src/shared/boards/AnakinBoard.cpp index 283fa7ec5c7a5ee1e313a48474bf1b41c06ae9a1..4a0a5be177b870a76e3cabfe6f566f8c2f374f96 100644 --- a/src/shared/boards/AnakinBoard.cpp +++ b/src/shared/boards/AnakinBoard.cpp @@ -49,26 +49,27 @@ bool AnakinBoard::init() INIT_AND_CHECK(mS_LPS331AP); INIT_AND_CHECK(mS_MS580); - AddSensor(MPU9250_ACCEL, DATA_VEC3, mS_MPU9250->accelDataPtr()); - AddSensor(MPU9250_GYRO, DATA_VEC3, mS_MPU9250->gyroDataPtr()); - AddSensor(MPU9250_COMPASS, DATA_VEC3, mS_MPU9250->compassDataPtr()); - AddSensor(MPU9250_TEMP, DATA_FLOAT, mS_MPU9250->tempDataPtr()); - - AddSensor(INEMO_ACCEL, DATA_VEC3, mS_INEMO->accelDataPtr()); - AddSensor(INEMO_GYRO, DATA_VEC3, mS_INEMO->gyroDataPtr()); - AddSensor(INEMO_COMPASS, DATA_VEC3, mS_INEMO->compassDataPtr()); - AddSensor(INEMO_TEMP, DATA_FLOAT, mS_INEMO->tempDataPtr()); - AddSensor(FXAS21002_GYRO, DATA_VEC3, mS_FXAS->gyroDataPtr()); - - AddSensor(LPS331AP_PRESS, DATA_FLOAT, mS_LPS331AP->pressureDataPtr()); - AddSensor(LPS331AP_TEMP, DATA_FLOAT, mS_LPS331AP->tempDataPtr()); - - AddSensor(MAX21105_ACCEL, DATA_VEC3, mS_MAX21105->accelDataPtr()); - AddSensor(MAX21105_GYRO, DATA_VEC3, mS_MAX21105->gyroDataPtr()); - AddSensor(MAX21105_TEMP, DATA_FLOAT, mS_MAX21105->tempDataPtr()); - - AddSensor(MS580_PRESSURE, DATA_FLOAT, mS_MS580->pressureDataPtr()); - AddSensor(MS580_TEMP, DATA_FLOAT, mS_MS580->tempDataPtr()); + AddSensor(ACCEL_MPU9250, DATA_VEC3, mS_MPU9250->accelDataPtr()); + AddSensor(GYRO_MPU9250, DATA_VEC3, mS_MPU9250->gyroDataPtr()); + AddSensor(COMPASS_MPU9250, DATA_VEC3, mS_MPU9250->compassDataPtr()); + AddSensor(TEMP_MPU9250, DATA_FLOAT, mS_MPU9250->tempDataPtr()); + + AddSensor(ACCEL_INEMO, DATA_VEC3, mS_INEMO->accelDataPtr()); + AddSensor(GYRO_INEMO, DATA_VEC3, mS_INEMO->gyroDataPtr()); + AddSensor(COMPASS_INEMO, DATA_VEC3, mS_INEMO->compassDataPtr()); + AddSensor(TEMP_INEMO, DATA_FLOAT, mS_INEMO->tempDataPtr()); + + AddSensor(GYRO_FXAS21002, DATA_VEC3, mS_FXAS->gyroDataPtr()); + + AddSensor(PRESS_LPS331AP, DATA_FLOAT, mS_LPS331AP->pressureDataPtr()); + AddSensor(TEMP_LPS331AP, DATA_FLOAT, mS_LPS331AP->tempDataPtr()); + + AddSensor(ACCEL_MAX21105, DATA_VEC3, mS_MAX21105->accelDataPtr()); + AddSensor(GYRO_MAX21105, DATA_VEC3, mS_MAX21105->gyroDataPtr()); + AddSensor(TEMP_MAX21105, DATA_FLOAT, mS_MAX21105->tempDataPtr()); + + AddSensor(PRESS_MS580, DATA_FLOAT, mS_MS580->pressureDataPtr()); + AddSensor(TEMP_MS580, DATA_FLOAT, mS_MS580->tempDataPtr()); sLog->logString("Adding sensors to 100Hz DMA sampler\n"); m100HzDMA.AddSensor(mS_MPU9250); diff --git a/src/shared/boards/AnakinBoard.h b/src/shared/boards/AnakinBoard.h index 10e6ee347619efff4e82fa74dddaae94827172cd..87a24080af08e4ea06f38ecd0bb380549978c2ae 100644 --- a/src/shared/boards/AnakinBoard.h +++ b/src/shared/boards/AnakinBoard.h @@ -38,27 +38,30 @@ typedef MS580301BA07<spiMS580301BA07> ms580_t; // AnakinSensor numbers must be in range 0 <= x <= 65535 (uint16_t) enum AnakinSensor { - MPU9250_ACCEL = 0, - MPU9250_GYRO = 1, - MPU9250_COMPASS = 2, - MPU9250_TEMP = 3, - - INEMO_ACCEL = 4, - INEMO_GYRO = 5, - INEMO_COMPASS = 6, - INEMO_TEMP = 7, - - FXAS21002_GYRO = 8, - - LPS331AP_PRESS = 9, - LPS331AP_TEMP = 10, - - MAX21105_ACCEL = 11, - MAX21105_GYRO = 12, - MAX21105_TEMP = 13, - - MS580_PRESSURE = 14, - MS580_TEMP = 15, + ACCEL_MPU9250 = 0, + ACCEL_INEMO = 1, + ACCEL_MAX21105 = 2, + + GYRO_MPU9250 = 3, + GYRO_INEMO = 4, + GYRO_FXAS21002 = 5, + GYRO_MAX21105 = 6, + + COMPASS_MPU9250 = 7, + COMPASS_INEMO = 8, + + TEMP_MPU9250 = 9, + TEMP_INEMO = 10, + TEMP_LPS331AP = 11, + TEMP_MAX21105 = 12, + TEMP_MS580 = 13, + + PRESS_LPS331AP = 14, + PRESS_MS580 = 15, + + UNUSED_16 = 16, + RESERVED_17 = 17, + RESERVED_18 = 18, }; class AnakinBoard : public Singleton<AnakinBoard>, public Board diff --git a/src/shared/events/Scheduler.cpp b/src/shared/events/Scheduler.cpp index 634bbe76fae90f1e65c347ad0b6ba8fbc36c6132..350f8a8de2f0191142bb74b3dff190617ffa3ac2 100644 --- a/src/shared/events/Scheduler.cpp +++ b/src/shared/events/Scheduler.cpp @@ -102,9 +102,7 @@ void EventScheduler::run() { } else tasks.erase(e.task); } else { Unlock<FastMutex> u(l); - leds::led9::high(); Thread::sleepUntil(nextTick); - leds::led9::low(); } } } diff --git a/src/shared/log/Log.h b/src/shared/log/Log.h index e16f217a52c27c3a47a53e237746ba86de8f1b3b..6e691edf4c30814b28adff5fd2e728c757e6dbf3 100644 --- a/src/shared/log/Log.h +++ b/src/shared/log/Log.h @@ -21,6 +21,7 @@ class Log : public Singleton<Log>, ActiveObject DATA_INT = 3, DATA_STRING = 4, DATA_LIMITED_INT = 5, + DATA_UINT32 = 6, }; friend class Singleton<Log>; @@ -50,6 +51,16 @@ public: queue(std::move(buf)); } + void logUInt32(uint8_t id, uint32_t data) + { + std::vector<uint8_t> buf(2 + sizeof(uint32_t)); + buf[0] = DATA_UINT32; + buf[1] = id; + memcpy(&buf[2], &data, sizeof(uint32_t)); + + queue(std::move(buf)); + } + void logLimitedInt(uint8_t id, int min, int max, int data) { assert(max > min);