Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
ws2812B.cpp@0:160ed7a225a4, 2016-09-24 (annotated)
- Committer:
- MikamiUitOpen
- Date:
- Sat Sep 24 05:52:29 2016 +0000
- Revision:
- 0:160ed7a225a4
- Child:
- 1:2d0f84d78ca2
1
Who changed what in which revision?
User | Revision | Line number | New 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 | } |