소스 검색

Wait WS2812 reset time (300us) between updates

main_ledos
PaulStoffregen 7 년 전
부모
커밋
35e211410f
2개의 변경된 파일15개의 추가작업 그리고 2개의 파일을 삭제
  1. +14
    -2
      WS2812Serial.cpp
  2. +1
    -0
      WS2812Serial.h

+ 14
- 2
WS2812Serial.cpp 파일 보기

@@ -100,8 +100,20 @@ bool WS2812Serial::begin()

void WS2812Serial::show()
{
// TODO: wait if prior DMA in progress
// TODO: wait 300us WS2812 reset time
// wait if prior DMA still in progress
while ((DMA_ERQ & (1 << dma->channel))) {
yield();
}
// wait 300us WS2812 reset time
uint32_t min_elapsed = ((numled * 34134) >> 10) + 300;
if (min_elapsed < 2500) min_elapsed = 2500;
uint32_t m;
while (1) {
m = micros();
if ((m - prior_micros) > min_elapsed) break;
yield();
}
prior_micros = m;
const uint8_t *p = drawBuffer;
const uint8_t *end = p + (numled * 3);
uint8_t *fb = frameBuffer;

+ 1
- 0
WS2812Serial.h 파일 보기

@@ -44,6 +44,7 @@ private:
uint8_t *frameBuffer;
uint8_t *drawBuffer;
DMAChannel *dma = nullptr;
uint32_t prior_micros = 0;
};

#endif

Loading…
취소
저장