TG-LPC11U35-501に対応
こちらのページのプログラムを、TG-LPC11U35-501に対応させました。
https://developer.mbed.org/users/tkasa/code/LEDTape_WS2812/wiki/Homepage
動作に疑問があるため、教えを請うための公開です。
疑問が解消され次第公開を終了します。
(2016/04/13 追記)
おかしな動作解消されました。
プログラム LEDstrip_WS2812.cpp を修正しました。
修正点はコメントを加えてあります。
しばらくしたら、削除する予定です。
LEDStrip_WS2812.cpp
- Committer:
- hirobe0913
- Date:
- 2016-04-13
- Revision:
- 1:4aff1ebb42c1
- Parent:
- 0:4b0686730a99
- Child:
- 2:ebd3f4b4e0a3
File content as of revision 1:4aff1ebb42c1:
/* * WS2812 tape led IC * * 0.35us 0.8us (+-150ns) * 0: |^^^^^|__________| * * 0.7us 0.6us (+-150ns) * 1: |^^^^^^^^^^|_____| * * >50us * RESET: |________________| */ #include "mbed.h" #include "LEDStrip.h" SPI tape(p11, p12, p13); #if defined(TARGET_LPC1768) || defined(TARGET_LPC2368) LPC_SSP_TypeDef *_ssp = LPC_SSP0; #elif defined(TARGET_LPC11U24) || defined(TARGET_LPC11U35_501) LPC_SSPx_Type *_ssp = LPC_SSP1; #endif int num = 100; int *data; volatile int busy = 0, wakeup = 0; extern "C" #if defined(TARGET_LPC1768) || defined(TARGET_LPC2368) void SSP0_IRQHandler() { #elif defined(TARGET_LPC11U24) || defined(TARGET_LPC11U35_501) void SSP1_IRQHandler() { #endif static int addr = 0, bit = 0x800000; repeat: if (busy) { // led data while (_ssp->SR & (1<<1)) { // TNF if (data[addr] & bit) { // 1 //_ssp->DR = 0x01f; _ssp->DR = 0x01f; } else { // 0 //_ssp->DR = 0x007; _ssp->DR = 0x007; } bit = bit >> 1; if (bit == 0) { bit = 0x800000; addr ++; if (addr >= num) { addr = 0; busy = 0; goto repeat; } } } } else { // blank while (_ssp->SR & (1<<1)) { // TNF _ssp->DR = 0x000; //_ssp->DR = 0xfff; // if (addr < 50) { if (addr < 51) { addr ++; } else { addr = 0; if (wakeup) { busy = 1; wakeup = 0; goto repeat; } } } } } void tapeInit (int freq, int n) { num = n; // data = new int(num); data = (int*)malloc(sizeof(int) * num); for (int i = 0; i < num; i ++) { data[i] = 0; } tape.format(10, 1); if (freq) { tape.frequency(freq * 1000); } else { tape.frequency(8000000); } #if defined(TARGET_LPC1768) || defined(TARGET_LPC2368) NVIC_SetVector(SSP0_IRQn, (uint32_t)SSP0_IRQHandler); NVIC_SetPriority(SSP0_IRQn, 0); NVIC_EnableIRQ(SSP0_IRQn); #elif defined(TARGET_LPC11U24) || defined(TARGET_LPC11U35_501) NVIC_SetVector(SSP1_IRQn, (uint32_t)SSP1_IRQHandler); NVIC_SetPriority(SSP1_IRQn, 0); NVIC_EnableIRQ(SSP1_IRQn); #endif _ssp->IMSC |= (1<<3); // TXIM } void tapeSet (int n, int dat) { if (n >= 0 && n < num) { // RGB -> GRB data[n] = ((dat & 0xff0000) >> 8) | ((dat & 0xff00) << 8) | (dat & 0xff); } } void tapeSend () { if (busy) { while (busy); wait_us(50); } wakeup = 1; while (wakeup); } int tapeGet (int n) { return ((data[n] & 0xff0000) >> 8) | ((data[n] & 0xff00) << 8) | (data[n] & 0xff); }