Application Note AN_371 FT90x WS2812 Example Version 1.0 Issue Date: 2015-10-06 This note describes how to use GPIO to communicate with the WS2812 “Intelligent control LED integrated light source” on the MM900 EV Module. Use of FTDI devices in life support and/or safety applications is entirely at the user’s risk, and the user agrees to defend, indemnify and hold FTDI harmless from any and all damages, claims, suits or expense resulting from such use. Future Technology Devices International Limited (FTDI) Unit 1, 2 Seaward Place, Glasgow G41 1HH, United Kingdom Tel.: +44 (0) 141 429 2777 Fax: + 44 (0) 141 429 2758 Web Site: http://ftdichip.com Copyright © 2015 Future Technology Devices International Limited Application Note AN_371 FT90x WS2812 Example Version 1.0 Document Reference No.: FT_001166 Clearance No.: FTDI# 446 Table of Contents 1 Introduction .............................................................. 2 1.1 Overview .............................................................................2 1.2 License ................................................................................2 2 Theory ....................................................................... 3 2.1 WS2812 LEDs ......................................................................3 3 Implementation ......................................................... 5 3.1 Bit-banging the WS2812 Protocol via GPIO .........................5 3.2 HSV to RGB Colour Space Conversion ..................................7 3.3 Main Application ..................................................................8 4 Conclusion ............................................................... 10 5 Contact Information ................................................ 11 Appendix A – References ............................................. 12 Document References ............................................................... 12 Acronyms and Abbreviations..................................................... 12 Appendix B – List of Tables & Figures .......................... 13 List of Tables............................................................................. 13 List of Figures ........................................................................... 13 Appendix C – Revision History ..................................... 14 Product Page Document Feedback 1 Copyright © 2015 Future Technology Devices International Limited Application Note AN_371 FT90x WS2812 Example Version 1.0 Document Reference No.: FT_001166 Clearance No.: FTDI# 446 1 Introduction This Application Note describes and explains the FT90x WS2812 Example. The FT90x WS2812 Example demonstrates how to interface with the World Semi WS2812 “Intelligent control LED integrated light source” with an FT90x microcontroller. 1.1 Overview This document will describe the design and implementation of the FT90x WS2812 Example. The FT90x WS2812 Example will control two WS2812 LEDs on a MM900 Evaluation Board and fade them through various hues. WS2812 LEDs use a proprietary 1-Wire-like protocol to shift in colour values and allow data to be daisy chained to other WS2812 LEDs. This document is intended to demonstrate the bridging capabilities of the FT90x family of microcontrollers. 1.2 License © Copyright 2015, Future Technology Devices International Ltd. This source code ("the Software") is provided by Future Technology Devices International Limited ("FTDI") subject to the license terms set out http://www.ftdichip.com/FTSourceCodeLicenceTerms.htm ("the License Terms"). You must read the License Terms before downloading or using the Software. By installing or using the Software you agree to the License Terms. If you do not agree to the License Terms then do not download or use the Software. Without prejudice to the License Terms, here is a summary of some of the key terms of the License Terms (and in the event of any conflict between this summary and the License Terms then the text of the License Terms will prevail). The Software is provided "as is". There are no warranties (or similar) in relation to the quality of the Software. You use it at your own risk. The Software should not be used in, or for, any medical device, system or appliance. There are exclusions of FTDI liability for certain types of loss such as: special loss or damage; incidental loss or damage; indirect or consequential loss or damage; loss of income; loss of business; loss of profits; loss of revenue; loss of contracts; business interruption; loss of the use of money or anticipated savings; loss of information; loss of opportunity; loss of goodwill or reputation; and/or loss of, damage to or corruption of data. There is a monetary cap on FTDI's liability. The Software may have subsequently been amended by another user and then distributed by that other user ("Adapted Software"). If so that user may have additional license terms that applies to those amendments. However, FTDI has no liability in relation to those amendments. Product Page Document Feedback 2 Copyright © 2015 Future Technology Devices International Limited Application Note AN_371 FT90x WS2812 Example Version 1.0 Document Reference No.: FT_001166 Clearance No.: FTDI# 446 2 Theory 2.1 WS2812 LEDs WS2812 Serial LEDs use a One Wire protocol for communication which determines a bit based upon the pulse width of the symbol. The WS2812 protocol uses three symbols: a 0 bit, a 1 bit, and a Reset symbol (used to latch in data). These three symbols are described in Figure 1: Timing Diagram for WS2812 Symbols and Table 1: Timing for WS2812 Symbols Product Page Document Feedback 3 Copyright © 2015 Future Technology Devices International Limited Application Note AN_371 FT90x WS2812 Example Version 1.0 Document Reference No.: FT_001166 Clearance No.: FTDI# 446 . ‘0’ t0L t0H ‘1’ t1H t1L Reset treset Figure 1: Timing Diagram for WS2812 Symbols Name Description Min Typ Max Unit t0H 0 code, High Voltage Time 200 350 500 nsec t0L 0 code, Low Voltage Time 550 700 850 nsec t1H 1 code, High Voltage Time 650 800 950 nsec t1L 1 code, Low Voltage Time 450 600 750 nsec treset Reset code, Low Voltage Time 50 - - µsec Table 1: Timing for WS2812 Symbols Product Page Document Feedback 4 Copyright © 2015 Future Technology Devices International Limited Application Note AN_371 FT90x WS2812 Example Version 1.0 Document Reference No.: FT_001166 Clearance No.: FTDI# 446 Colour is transferred to a WS2812 LED in 24 bit chunks (an 8-bit value of Green, an 8-bit value of Red, and an 8-bit value of Blue) Most Significant Bit first. Multiple colours can be transferred in order to update multiple LEDs. At the end of an update a Reset must be sent which will cause the LEDs to latch in the new colour. LED 1 G B LED N LED 2 R G B R G B Reset R Figure 2: Timing Diagram for WS2812 Update Product Page Document Feedback 5 Copyright © 2015 Future Technology Devices International Limited Application Note AN_371 FT90x WS2812 Example Version 1.0 Document Reference No.: FT_001166 Clearance No.: FTDI# 446 3 Implementation 3.1 Bit-banging the WS2812 Protocol via GPIO Several methods of communicating with WS2812 are available (UART, SPI, GPIO); however for the purposes of this demo, GPIO was selected. In order to simplify transferring bits to the WS2812, a common symbol time for ‘1’s and ‘0’s is derived and separated up into 8 sections to allow the use of an 8-bit long pattern. The duration of the ‘1’ and ‘0’ symbols lie within 1.25 µsec allowing for a 150 nsec bit time for the 8-bit pattern. For a ‘1’ symbol, the signal needs to be high for 650 to 950 nsec which corresponds to either 5 or 6 bit times. For a ‘0’ symbol, the signal needs to be high for 200 to 500 nsec which corresponds to either 2 or 3 bit times. Assuming that a ‘1’ symbol uses 5 bit times and a ‘0’ symbol uses 3 bit times, this means that a ‘1’ symbol will be high for 750 nsec and low for 450 nsec giving a mask of F8 h (0b 1111 1000), and a ‘0’ symbol will be high for 450 nsec and low for 750 nsec giving a mask of E0h (0b 1110 0000). The function ws2812_init in ws2812_gpio.c (shown in Table 2: Code Listing for Function ws2812_init ) sets up the GPIO pin as an output. void ws2812_init(void) { gpio_function(WS2812_GPIO, pad_func_0); gpio_dir(WS2812_GPIO, pad_dir_output); } Table 2: Code Listing for Function ws2812_init The function ws2812_shiftout in ws2812_gpio.c (shown in Table 3: Code Listing for Function ws2812_shiftout Product Page Document Feedback 6 Copyright © 2015 Future Technology Devices International Limited Application Note AN_371 FT90x WS2812 Example Version 1.0 Document Reference No.: FT_001166 Clearance No.: FTDI# 446 ) implements shifting out a byte of data to a GPIO pin using the WS2812 protocol. The corresponding GPIO register and bitmask is determined for the GPIO pin defined in WS2812_GPIO. A loop iterates over every bit in parameter b starting at Most Significant Bit and working down to the Least Significant Bit. Within the loop, the corresponding symbol mask is chosen and bit-banged out on the GPIO pin. NOOP instructions are used to generate the precise timing. void ws2812_shiftout(uint8_t b) { uint8_t i; register uint8_t sym = 0, sym0 = WS2812_GPIO_SYM0, sym1 = WS2812_GPIO_SYM1; register uint32_t mask = 0; register volatile uint32_t* gpioval; #if (WS2812_GPIO < 32) /* 0 - 31 */ gpioval = &(GPIO->GPIO00_31_VAL); mask = 1 << WS2812_GPIO; #elif (WS2812_GPIO < 64) /* 32 - 63 */ gpioval = &(GPIO->GPIO32_63_VAL); mask = 1 << (WS2812_GPIO - 32); #else /* 64 - 66 */ gpioval = &(GPIO->GPIO64_66_VAL); mask = 1 << (WS2812_GPIO - 64); #endif for(i = 0; i < 8; ++i) { if(b & 0x80) sym = sym1; else sym = sym0; if (sym & 0x80) else asm_noop(); asm_noop(); asm_noop(); asm_noop(); if (sym & 0x40) else asm_noop(); asm_noop(); asm_noop(); if (sym & 0x20) else asm_noop(); asm_noop(); asm_noop(); asm_noop(); if (sym & 0x10) else asm_noop(); asm_noop(); asm_noop(); if (sym & 0x08) else asm_noop(); asm_noop(); asm_noop(); Product Page Document Feedback *gpioval |= mask; *gpioval &= ~mask; *gpioval |= mask; *gpioval &= ~mask; *gpioval |= mask; *gpioval &= ~mask; *gpioval |= mask; *gpioval &= ~mask; *gpioval |= mask; *gpioval &= ~mask; 7 Copyright © 2015 Future Technology Devices International Limited Application Note AN_371 FT90x WS2812 Example Version 1.0 Document Reference No.: FT_001166 asm_noop(); if (sym & 0x04) else asm_noop(); asm_noop(); asm_noop(); if (sym & 0x02) else asm_noop(); asm_noop(); asm_noop(); asm_noop(); if (sym & 0x01) else Clearance No.: FTDI# 446 *gpioval |= mask; *gpioval &= ~mask; *gpioval |= mask; *gpioval &= ~mask; *gpioval |= mask; *gpioval &= ~mask; b <<= 1; } } Table 3: Code Listing for Function ws2812_shiftout Product Page Document Feedback 8 Copyright © 2015 Future Technology Devices International Limited Application Note AN_371 FT90x WS2812 Example Version 1.0 Document Reference No.: FT_001166 Clearance No.: FTDI# 446 Using this function, we can create the function ws2812_write in ws2812_gpio.c (shown in Table 4: Code Listing for Function ws2812_write ) which sends out a RGB colour value on the GPIO pin. void ws2812_write(uint8_t r, uint8_t g, uint8_t b) { ws2812_shiftout(g); ws2812_shiftout(r); ws2812_shiftout(b); } Table 4: Code Listing for Function ws2812_write 3.2 HSV to RGB Colour Space Conversion Colour can be described in many different ways. Typically, colour is given as a level of Red, Green and Blue (RGB) which is what the WS2812 LED uses to display a colour. However, in order to simplify linearly fading through colour, another colour space can be used. This application uses the Hue, Saturation and Value (HSV) colour space which allows for a more intuitive approach to colour manipulation: Hue defines what base colour to use. Saturation defines its colorfulness. A high saturation gives a bright colour, a low saturation gives grey. Value defines the level of brightness relative to full white. Therefore, by having a fixed saturation and value, and cycling through the Hue, a gradual fade of colour can be generated. A conversion function is needed to convert from a HSV to a RGB colour space in order for HSV values to be used with WS2812 LEDs. The function hsv2rgb in rgbhsv.c (shown in Table 5: Code Listing for Function hsv2rgb ) converts HSV values to RGB values. This function uses fixed point math since the FT32 core does not support floating point. void hsv2rgb(uint8_t h, uint8_t s, uint8_t v, uint8_t* r, uint8_t* g, uint8_t* b) { /* Based on http://stackoverflow.com/a/14733008 */ uint8_t region, remainder, p, q, t; if (s == 0) { *r = v; *g = v; *b = v; } else { region = h / 43; remainder = (h - (region * 43)) * 6; p = (v * (255 - s)) >> 8; q = (v * (255 - ((s * remainder) >> 8))) >> 8; t = (v * (255 - ((s * (255 - remainder)) >> 8))) >> 8; switch (region) { case 0: *r = v; *g = t; *b = p; Product Page Document Feedback 9 Copyright © 2015 Future Technology Devices International Limited Application Note AN_371 FT90x WS2812 Example Version 1.0 Document Reference No.: FT_001166 break; case 1: *r = q; break; case 2: *r = p; break; case 3: *r = p; break; case 4: *r = t; break; default: *r = v; break; } Clearance No.: FTDI# 446 *g = v; *b = p; *g = v; *b = t; *g = q; *b = v; *g = p; *b = v; *g = p; *b = q; } } Table 5: Code Listing for Function hsv2rgb 3.3 Main Application This application (shown in Table 6: Code Listing for the Main Application ) will fade the two WS2812 LEDs on the MM900 board through different hues with one LED having the opposite hue of the other LED. int main(void) { setup(); for(;;) loop(); return 0; } void setup() { uint8_t i; for (i=0; i<N_LEDS; ++i) { /* Every LED has a different Hue Offset */ ledhsv[i].hue = (255/N_LEDS)*i; ledhsv[i].val = VALUE; ledhsv[i].sat = SATURATION; } ws2812_init(); } void loop() { uint8_t i; /* Fade to a new colour */ for (i=0; i<N_LEDS; ++i) { hsv2rgb(ledhsv[i].hue, ledhsv[i].sat, ledhsv[i].val, &(ledrgb[i].r), &(ledrgb[i].g), &(ledrgb[i].b)); ledhsv[i].hue++; Product Page Document Feedback 10 Copyright © 2015 Future Technology Devices International Limited Application Note AN_371 FT90x WS2812 Example Version 1.0 Document Reference No.: FT_001166 Clearance No.: FTDI# 446 } /* Write the new values to the LEDs */ for (i=0; i<N_LEDS; ++i) { ws2812_write(ledrgb[i].r, ledrgb[i].g, ledrgb[i].b); } delayus(50); /* Have to wait this much for the WS2812 to latch their colour */ delayms(25); } Table 6: Code Listing for the Main Application Product Page Document Feedback 11 Copyright © 2015 Future Technology Devices International Limited Application Note AN_371 FT90x WS2812 Example Version 1.0 Document Reference No.: FT_001166 Clearance No.: FTDI# 446 4 Conclusion The FT90X devices make for an ideal controller in a home automation or advertising application where the control of multiple LED lighting is required. The GPIO interface allows for a relatively simple coding exercise to realize full colour, and brightness control of the LEDs. Product Page Document Feedback 12 Copyright © 2015 Future Technology Devices International Limited Application Note AN_371 FT90x WS2812 Example Version 1.0 Document Reference No.: FT_001166 Clearance No.: FTDI# 446 5 Contact Information Head Office – Glasgow, UK Branch Office – Tigard, Oregon, USA Future Technology Devices International Limited Unit 1, 2 Seaward Place, Centurion Business Park Glasgow G41 1HH United Kingdom Tel: +44 (0) 141 429 2777 Fax: +44 (0) 141 429 2758 Future Technology Devices International Limited (USA) 7130 SW Fir Loop Tigard, OR 97223-8160 USA Tel: +1 (503) 547 0988 Fax: +1 (503) 547 0987 E-mail (Sales) E-mail (Support) E-mail (General Enquiries) [email protected] [email protected] [email protected] E-Mail (Sales) E-Mail (Support) E-Mail (General Enquiries) [email protected] [email protected] [email protected] Branch Office – Taipei, Taiwan Branch Office – Shanghai, China Future Technology Devices International Limited (Taiwan) 2F, No. 516, Sec. 1, NeiHu Road Taipei 114 Taiwan , R.O.C. Tel: +886 (0) 2 8791 3570 Fax: +886 (0) 2 8791 3576 Future Technology Devices International Limited (China) Room 1103, No. 666 West Huaihai Road, Shanghai, 200052 China Tel: +86 21 62351596 Fax: +86 21 62351595 E-mail (Sales) E-mail (Support) E-mail (General Enquiries) E-mail (Sales) E-mail (Support) E-mail (General Enquiries) [email protected] [email protected] [email protected] [email protected] [email protected] [email protected] Web Site http://ftdichip.com Distributor and Sales Representatives Please visit the Sales Network page of the FTDI Web site for the contact details of our distributor(s) and sales representative(s) in your country. System and equipment manufacturers and designers are responsible to ensure that their systems, and any Future Technology Devices International Ltd (FTDI) devices incorporated in their systems, meet all applicable safety, regulatory and system-level performance requirements. All application-related information in this document (including application descriptions, suggested FTDI devices and other materials) is provided for reference only. While FTDI has taken care to assure it is accurate, this information is subject to customer confirmation, and FTDI disclaims all liability for system designs and for any applications assistance provided by FTDI. Use of FTDI devices in life support and/or safety applications is entirely at the user’s risk, and the user agrees to defend, indemnify and hold harmless FTDI from any and all damages, claims, suits or expense resulting from such use. This document is subject to change without notice. No freedom to use patents or other intellectual property rights is implied by the publication of this document. Neither the whole nor any part of the information contained in, or the product described in this document, may be adapted or reproduced in any material or electronic form without the prior written consent of the copyright holder. Future Technology Devices International Ltd, Unit 1, 2 Seaward Place, Centurion Business Park, Glasgow G41 1HH, United Kingdom. Scotland Registered Company Number: SC136640 Product Page Document Feedback 13 Copyright © 2015 Future Technology Devices International Limited Application Note AN_371 FT90x WS2812 Example Version 1.0 Document Reference No.: FT_001166 Clearance No.: FTDI# 446 Appendix A – References Document References FT900/901/902/903 Datasheet FT905/906/907/908 Datasheet FT900 User Manual World Semi WS2812 Intelligent control LED integrated light source Datasheet Acronyms and Abbreviations Terms Description GPIO General Purpose I/O HSV Hue Saturation Value LED Light Emitting Diode RGB Red Green Blue Product Page Document Feedback 14 Copyright © 2015 Future Technology Devices International Limited