不韋 呂 / UIT_WS2812B

Dependents:   Demo_WS2812B_SPI

Committer:
MikamiUitOpen
Date:
Mon Nov 21 09:28:49 2016 +0000
Revision:
4:874beb47b375
Parent:
3:e09aafc9cabe
5

Who changed what in which revision?

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