不韋 呂 / UIT_WS2812B

Dependents:   Demo_WS2812B_SPI

Committer:
MikamiUitOpen
Date:
Sun Sep 25 10:01:11 2016 +0000
Revision:
2:2d4f2cc38f87
Parent:
1:2d0f84d78ca2
Child:
3:e09aafc9cabe
3

Who changed what in which revision?

UserRevisionLine numberNew contents of line
MikamiUitOpen 0:160ed7a225a4 1 //----------------------------------------------------
MikamiUitOpen 0:160ed7a225a4 2 // SPI を使って WS2812B を点灯するためのクラス
MikamiUitOpen 0:160ed7a225a4 3 //
MikamiUitOpen 2:2d4f2cc38f87 4 // 2016/09/25, Copyright (c) 2016 MIKAMI, Naoki
MikamiUitOpen 0:160ed7a225a4 5 //----------------------------------------------------
MikamiUitOpen 0:160ed7a225a4 6
MikamiUitOpen 0:160ed7a225a4 7 #include "ws2812B.hpp"
MikamiUitOpen 0:160ed7a225a4 8
MikamiUitOpen 0:160ed7a225a4 9 namespace Mikami
MikamiUitOpen 0:160ed7a225a4 10 {
MikamiUitOpen 0:160ed7a225a4 11 WS2812B::WS2812B(PinName pin, bool inv)
MikamiUitOpen 2:2d4f2cc38f87 12 : SPI(pin, NC, NC), mySpi_((SPI_TypeDef *)_spi.spi)
MikamiUitOpen 0:160ed7a225a4 13 {
MikamiUitOpen 2:2d4f2cc38f87 14 format(8, 0);
MikamiUitOpen 0:160ed7a225a4 15 // クロックを 23 MHz 以下で最大の値に設定
MikamiUitOpen 0:160ed7a225a4 16 // F401RE: 21.0 MHz
MikamiUitOpen 0:160ed7a225a4 17 // F446RE: 22.5 MHz
MikamiUitOpen 2:2d4f2cc38f87 18 frequency(23000000);
MikamiUitOpen 0:160ed7a225a4 19
MikamiUitOpen 2:2d4f2cc38f87 20 if (!inv) fp = &WS2812B::SendByteNorm;
MikamiUitOpen 0:160ed7a225a4 21 else fp = &WS2812B::SendByteInv;
MikamiUitOpen 0:160ed7a225a4 22 }
MikamiUitOpen 0:160ed7a225a4 23
MikamiUitOpen 0:160ed7a225a4 24 void WS2812B::Write(uint32_t x)
MikamiUitOpen 0:160ed7a225a4 25 {
MikamiUitOpen 0:160ed7a225a4 26 static const uint32_t bit23 = 0x800000;
MikamiUitOpen 0:160ed7a225a4 27 for (int n=0; n<24; n++)
MikamiUitOpen 0:160ed7a225a4 28 {
MikamiUitOpen 0:160ed7a225a4 29 if ((x & bit23) == bit23) T1HL();
MikamiUitOpen 0:160ed7a225a4 30 else T0HL();
MikamiUitOpen 0:160ed7a225a4 31 x <<= 1;
MikamiUitOpen 0:160ed7a225a4 32 }
MikamiUitOpen 0:160ed7a225a4 33 }
MikamiUitOpen 0:160ed7a225a4 34
MikamiUitOpen 0:160ed7a225a4 35 void WS2812B::Clear(int k)
MikamiUitOpen 0:160ed7a225a4 36 {
MikamiUitOpen 0:160ed7a225a4 37 for (int n=0; n<k; n++) Write(0x000000);
MikamiUitOpen 0:160ed7a225a4 38 Reset();
MikamiUitOpen 0:160ed7a225a4 39 }
MikamiUitOpen 0:160ed7a225a4 40
MikamiUitOpen 0:160ed7a225a4 41 void WS2812B::Send3Bytes(uint8_t x0, uint8_t x1, uint8_t x2)
MikamiUitOpen 0:160ed7a225a4 42 {
MikamiUitOpen 0:160ed7a225a4 43 SendByte(x0);
MikamiUitOpen 0:160ed7a225a4 44 SendByte(x1);
MikamiUitOpen 0:160ed7a225a4 45 SendByte(x2);
MikamiUitOpen 0:160ed7a225a4 46 }
MikamiUitOpen 0:160ed7a225a4 47
MikamiUitOpen 2:2d4f2cc38f87 48 void WS2812B::SendByteNorm(uint8_t x)
MikamiUitOpen 0:160ed7a225a4 49 {
MikamiUitOpen 0:160ed7a225a4 50 while ((mySpi_->SR & SPI_SR_TXE) != SPI_SR_TXE) {}
MikamiUitOpen 0:160ed7a225a4 51 mySpi_->DR = x;
MikamiUitOpen 0:160ed7a225a4 52 }
MikamiUitOpen 0:160ed7a225a4 53
MikamiUitOpen 0:160ed7a225a4 54 void WS2812B::SendByteInv(uint8_t x)
MikamiUitOpen 0:160ed7a225a4 55 {
MikamiUitOpen 0:160ed7a225a4 56 while ((mySpi_->SR & SPI_SR_TXE) != SPI_SR_TXE) {}
MikamiUitOpen 0:160ed7a225a4 57 mySpi_->DR = ~x;
MikamiUitOpen 0:160ed7a225a4 58 }
MikamiUitOpen 0:160ed7a225a4 59 }