不韋 呂 / UIT_WS2812B

Dependents:   Demo_WS2812B_SPI

Committer:
MikamiUitOpen
Date:
Sat Sep 24 06:24:10 2016 +0000
Revision:
1:2d0f84d78ca2
Parent:
0:160ed7a225a4
Child:
2:2d4f2cc38f87
2

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