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.
Dependents: NeoPixel-DemoBuffer Final_project Final_project
Fork of PixelArray by
Diff: neopixel-spi.cpp
- Revision:
- 0:38eeab21a162
- Child:
- 1:adbbe3e9f2c5
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/neopixel-spi.cpp Thu Jul 24 12:19:20 2014 +0000
@@ -0,0 +1,59 @@
+#include <stdint.h>
+#include "mbed.h"
+#include "neopixel-spi.h"
+
+namespace neopixel {
+
+Array::Array(PinName out) : spi_(out, NC, NC) {
+ // TODO: WS2811 has a different timing specification.
+
+ // WS2812 bit timings:
+ // '0': ----________ mark: 0.40us, space: 0.85us
+ // '1': --------____ mark: 0.80us, space: 0.45us
+ // The period is 1.25us, giving a basic frequency of 800kHz.
+ // Using three SPI bits per NeoPixel bit, we need an API frequency of 2.4MHz.
+ // '0': 100 mark: 0.42us, space: 0.83us
+ // '1': 110 mark: 0.83us, space: 0.42us
+ // These timings are well within the +/-150ns tolerance specified by WS2812.
+
+ spi_.frequency(2400000);
+ spi_.format(12); // Send four NeoPixel bits in each packet.
+}
+
+static void SendFourBits(BurstSPI& spi, uint32_t bits) {
+ static int const pattern_width = 3;
+ uint32_t word = 04444; // 0b100100100100
+
+ for (int i = 0; i < 4; i++) {
+ word |= ((bits >> 3) & 1) << (pattern_width * i + 1);
+ }
+
+ spi.fastWrite(word);
+}
+
+void Array::Update(Pixel buffer[], size_t length) {
+ // Pixels are sent as follows:
+ // - The first transmitted pixel is the pixel closest to the transmitter.
+ // - The most significant bit is always sent first.
+ // - Green is sent first, then red, then blue.
+ //
+ // g7,g6,g5,g4,g3,g2,g1,g0,r7,r6,r5,r4,r3,r2,r1,r0,b7,b6,b5,b4,b3,b2,b1,b0
+ // \ /
+ // \___________________________________________________________________/
+ // |
+ // GRB,GRB,GRB,GRB,...
+
+ for (size_t i = 0; i < length; i++) {
+ SendFourBits(spi_, (buffer[i].green >> 4) & 0xf);
+ SendFourBits(spi_, (buffer[i].green >> 0) & 0xf);
+ SendFourBits(spi_, (buffer[i].red >> 4) & 0xf);
+ SendFourBits(spi_, (buffer[i].red >> 0) & 0xf);
+ SendFourBits(spi_, (buffer[i].blue >> 4) & 0xf);
+ SendFourBits(spi_, (buffer[i].blue >> 0) & 0xf);
+ }
+ spi_.clearRX();
+
+ wait_us(50);
+}
+
+}
\ No newline at end of file
