不韋 呂 / UIT_WS2812B

Dependents:   Demo_WS2812B_SPI

Committer:
MikamiUitOpen
Date:
Sat Sep 24 05:52:29 2016 +0000
Revision:
0:160ed7a225a4
Child:
1:2d0f84d78ca2
1

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 0:160ed7a225a4 4 // 2016/09/24, 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 0:160ed7a225a4 12 : mySpi_(NULL)
MikamiUitOpen 0:160ed7a225a4 13 {
MikamiUitOpen 0:160ed7a225a4 14 SPI mbedSpi_(pin, NC, NC); // MOSI, MISO, SCK
MikamiUitOpen 0:160ed7a225a4 15
MikamiUitOpen 0:160ed7a225a4 16 #ifdef STM32F401xE
MikamiUitOpen 0:160ed7a225a4 17 spi123 const *f4xx = f401;
MikamiUitOpen 0:160ed7a225a4 18 #else
MikamiUitOpen 0:160ed7a225a4 19 spi123 const *f4xx = f446;
MikamiUitOpen 0:160ed7a225a4 20 #endif
MikamiUitOpen 0:160ed7a225a4 21 for (int n=0; n<8; n++)
MikamiUitOpen 0:160ed7a225a4 22 {
MikamiUitOpen 0:160ed7a225a4 23 if (f4xx[n].pin == D4)
MikamiUitOpen 0:160ed7a225a4 24 {
MikamiUitOpen 0:160ed7a225a4 25 mySpi_ = f4xx[n].spi;
MikamiUitOpen 0:160ed7a225a4 26 break;
MikamiUitOpen 0:160ed7a225a4 27 }
MikamiUitOpen 0:160ed7a225a4 28 if (f4xx[n].pin == NC) break;
MikamiUitOpen 0:160ed7a225a4 29 }
MikamiUitOpen 0:160ed7a225a4 30
MikamiUitOpen 0:160ed7a225a4 31 mbedSpi_.format(8, 0);
MikamiUitOpen 0:160ed7a225a4 32 // クロックを 23 MHz 以下で最大の値に設定
MikamiUitOpen 0:160ed7a225a4 33 // F401RE: 21.0 MHz
MikamiUitOpen 0:160ed7a225a4 34 // F446RE: 22.5 MHz
MikamiUitOpen 0:160ed7a225a4 35 mbedSpi_.frequency(23000000);
MikamiUitOpen 0:160ed7a225a4 36
MikamiUitOpen 0:160ed7a225a4 37 if (!inv) fp = &WS2812B::SendByteNrm;
MikamiUitOpen 0:160ed7a225a4 38 else fp = &WS2812B::SendByteInv;
MikamiUitOpen 0:160ed7a225a4 39 }
MikamiUitOpen 0:160ed7a225a4 40
MikamiUitOpen 0:160ed7a225a4 41 void WS2812B::Write(uint32_t x)
MikamiUitOpen 0:160ed7a225a4 42 {
MikamiUitOpen 0:160ed7a225a4 43 static const uint32_t bit23 = 0x800000;
MikamiUitOpen 0:160ed7a225a4 44 for (int n=0; n<24; n++)
MikamiUitOpen 0:160ed7a225a4 45 {
MikamiUitOpen 0:160ed7a225a4 46 if ((x & bit23) == bit23) T1HL();
MikamiUitOpen 0:160ed7a225a4 47 else T0HL();
MikamiUitOpen 0:160ed7a225a4 48 x <<= 1;
MikamiUitOpen 0:160ed7a225a4 49 }
MikamiUitOpen 0:160ed7a225a4 50 }
MikamiUitOpen 0:160ed7a225a4 51
MikamiUitOpen 0:160ed7a225a4 52 void WS2812B::Reset()
MikamiUitOpen 0:160ed7a225a4 53 {
MikamiUitOpen 0:160ed7a225a4 54 Dummy();
MikamiUitOpen 0:160ed7a225a4 55 wait_us(50);
MikamiUitOpen 0:160ed7a225a4 56 }
MikamiUitOpen 0:160ed7a225a4 57
MikamiUitOpen 0:160ed7a225a4 58 void WS2812B::Clear(int k)
MikamiUitOpen 0:160ed7a225a4 59 {
MikamiUitOpen 0:160ed7a225a4 60 Reset();
MikamiUitOpen 0:160ed7a225a4 61 for (int n=0; n<k; n++) Write(0x000000);
MikamiUitOpen 0:160ed7a225a4 62 Reset();
MikamiUitOpen 0:160ed7a225a4 63 }
MikamiUitOpen 0:160ed7a225a4 64
MikamiUitOpen 0:160ed7a225a4 65 void WS2812B::Send3Bytes(uint8_t x0, uint8_t x1, uint8_t x2)
MikamiUitOpen 0:160ed7a225a4 66 {
MikamiUitOpen 0:160ed7a225a4 67 SendByte(x0);
MikamiUitOpen 0:160ed7a225a4 68 SendByte(x1);
MikamiUitOpen 0:160ed7a225a4 69 SendByte(x2);
MikamiUitOpen 0:160ed7a225a4 70 }
MikamiUitOpen 0:160ed7a225a4 71
MikamiUitOpen 0:160ed7a225a4 72 void WS2812B::SendByteNrm(uint8_t x)
MikamiUitOpen 0:160ed7a225a4 73 {
MikamiUitOpen 0:160ed7a225a4 74 while ((mySpi_->SR & SPI_SR_TXE) != SPI_SR_TXE) {}
MikamiUitOpen 0:160ed7a225a4 75 mySpi_->DR = x;
MikamiUitOpen 0:160ed7a225a4 76 }
MikamiUitOpen 0:160ed7a225a4 77
MikamiUitOpen 0:160ed7a225a4 78 void WS2812B::SendByteInv(uint8_t x)
MikamiUitOpen 0:160ed7a225a4 79 {
MikamiUitOpen 0:160ed7a225a4 80 while ((mySpi_->SR & SPI_SR_TXE) != SPI_SR_TXE) {}
MikamiUitOpen 0:160ed7a225a4 81 mySpi_->DR = ~x;
MikamiUitOpen 0:160ed7a225a4 82 }
MikamiUitOpen 0:160ed7a225a4 83
MikamiUitOpen 0:160ed7a225a4 84 // ピンと SPI 番号の関係
MikamiUitOpen 0:160ed7a225a4 85 #ifdef STM32F401xE
MikamiUitOpen 0:160ed7a225a4 86 const WS2812B::spi123 WS2812B::f401[] =
MikamiUitOpen 0:160ed7a225a4 87 {{ D4, SPI1}, { D11, SPI1}, {PB_15, SPI2},
MikamiUitOpen 0:160ed7a225a4 88 { PC_3, SPI2}, {PC_12, SPI3}, { NC, NULL}};
MikamiUitOpen 0:160ed7a225a4 89 #else
MikamiUitOpen 0:160ed7a225a4 90 const WS2812B::spi123 WS2812B::f446[] =
MikamiUitOpen 0:160ed7a225a4 91 {{ D11, SPI1}, { A4, SPI2}, {PB_15, SPI2},
MikamiUitOpen 0:160ed7a225a4 92 { PC_3, SPI2}, { A3, SPI3}, { D4, SPI3},
MikamiUitOpen 0:160ed7a225a4 93 {PC_12, SPI3}, { NC, NULL}};
MikamiUitOpen 0:160ed7a225a4 94 #endif // STM32F401xE
MikamiUitOpen 0:160ed7a225a4 95 }