OpenCores
URL https://opencores.org/ocsvn/neopixel_fpga/neopixel_fpga/trunk

Subversion Repositories neopixel_fpga

[/] [neopixel_fpga/] [trunk/] [src/] [FPGA_NeoPixel/] [FPGA_NeoPixel.h] - Blame information for rev 3

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 3 splinedriv
/*
2
 *  FpgaNeoPixel - A spi to ws2812 machine
3
 *
4
 *  Copyright (C) 2020  Hirosh Dabui <hirosh@dabui.de>
5
 *
6
 *  Permission to use, copy, modify, and/or distribute this software for any
7
 *  purpose with or without fee is hereby granted, provided that the above
8
 *  copyright notice and this permission notice appear in all copies.
9
 *
10
 *  THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11
 *  WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12
 *  MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13
 *  ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14
 *  WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15
 *  ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16
 *  OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17
 *
18
 */
19
#ifndef FPGA_NEOPIXEL_H
20
#define FPGA_NEOPIXEL_H
21
#include <SPI.h>
22
#include <Adafruit_NeoPixel.h>
23
class FPGA_NeoPixel : public Adafruit_NeoPixel {
24
 
25
  public:
26
    explicit FPGA_NeoPixel(uint16_t n, uint16_t pin = 6 /* is not needed */,
27
        neoPixelType type = NEO_GRB + NEO_KHZ800) : Adafruit_NeoPixel(n, pin, type) {};
28
 
29
    void begin() {
30
      pinMode(READY_PIN, INPUT_PULLUP);
31
      pinMode(RESETN_PIN, OUTPUT);
32
      digitalWrite(SS, HIGH);
33
 
34
      delay(1);
35
 
36
      SPI.begin();
37
      SPI.beginTransaction(SPISettings(16000000, MSBFIRST, SPI_MODE0));
38
 
39
      digitalWrite(RESETN_PIN, 0);
40
      delay(200);
41
      digitalWrite(RESETN_PIN, 1);
42
      delay(1000);
43
 
44
      Adafruit_NeoPixel::begin();
45
    }
46
 
47
    void show() {
48
      if (!pixels) return;
49
 
50
      wait_asic();
51
 
52
      uint16_t i = numBytes; // Loop counter
53
      uint8_t *p = pixels; // pointer to next byte
54
 
55
      for (uint16_t n = 0; n < numBytes / 3; n++) {
56
        grb(*p++, *p++, *p++);// brg
57
      }
58
      sync();
59
    }
60
 
61
  private:
62
    void wait_asic() {
63
      for (;;) {
64
        int val = digitalRead(READY_PIN);
65
        if (val == 0) break;
66
      }
67
    }
68
 
69
    inline void grb(uint8_t b, uint8_t r, uint8_t g) {
70
      digitalWrite(SS, LOW);
71
      SPI.transfer(0);
72
      SPI.transfer(g);
73
      SPI.transfer(r);
74
      SPI.transfer(b);
75
      digitalWrite(SS, HIGH);
76
    }
77
 
78
    /* asic show leds and empty your fifo*/
79
    inline void sync() {
80
      digitalWrite(SS, LOW);
81
      SPI.transfer(0xde);
82
      SPI.transfer(0xad);
83
      SPI.transfer(0xbe);
84
      SPI.transfer(0xaf);
85
      digitalWrite(SS, HIGH);
86
    }
87
};
88
#endif // FPGA_NEOPIXEL_H
89
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.