Pues utilizo el SPI en modo enhanced a 12.5MHz en modo de 16 bits. Escribo los siguientes valores para denotar un 1 o un 0 lógicos...
/**
* Logical 0 and logical 1 for the WS2812B LEDs with a 12.5MHz SPI
*/
#define SPI_BIT_0 (0xF800)
#define SPI_BIT_1 (0xFFC0)
El ancho de pulso se modula automáticamente con el SPI.
El modo enhanced te da oportunidad de guardar 8 palabras de 16 bits... lo que equivale a 8 bits en modo WS2812B... lo que equivale a mandar un byte WS2812B por cada enhanced buffer.
Trabajando con tal SPI y a tal velocidad, el ancho de cada bit en total mide 1.28us, que entran en los tiempos permitidos del WS2812B.
El truco está en no perder interrupciones y siempre tener los datos a la mano. Esto es posible con los 200MHz del PIC32MZ y con su fantástica memoria de 512kB en la que puedo almacenar buffers a modo ping-pong.
Actualmente nos faltan pruebas finales. La conversión de videos, GIFs e imágenes de cualquier tipo fue un dolor de cabeza... sobre todo por el que hay pixeles "muertos" en la matriz y por estar ordenando el dibujado de todos los pixeles en modo serpiente.
Toda la conversión la hago en C# y genero una imagen raw para la SD card, sin file system, para agilizar el despacho de pixeles muy rápidamente.
Cuando quede listo espero que Akenafab pueda compartirlo. Es para un cliente y debemos mantener la confidencialidad hasta cierto punto.