不韋 呂 / UIT_WS2812B

Dependents:   Demo_WS2812B_SPI

Committer:
MikamiUitOpen
Date:
Mon Sep 26 02:05:50 2016 +0000
Revision:
3:e09aafc9cabe
Parent:
2:2d4f2cc38f87
Child:
4:874beb47b375
4

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