모토로라가 정의한 SPI는 아니지만 직렬 통신을 이용. ====== WS2801 ====== LED 드라이버 회로도 {{http://i.imgur.com/v1Tol.png?300}} Time {{http://i.imgur.com/zG6jm.png?400}} {{{ int SDI = 11; // PIN 11 int CKI = 12; // PIN 12 int ledPin = 13; // LED void setup() { pinMode(SDI, OUTPUT); pinMode(CKI, OUTPUT); pinMode(ledPin, OUTPUT); //Serial.begin(9600); //Serial.println("Hello!"); } void loop() { delay(2000); while(1){ post_frame(0xFF0000); //현재 칼라를 WS2801에 적용한다. // CLK pin keeps low more than 500uS will make the WS2801 internal status register reset digitalWrite(CKI, LOW); delayMicroseconds(500); digitalWrite(ledPin, HIGH); delay(250); digitalWrite(ledPin, LOW); delay(250); } } // this_led_color값의 비트를 ws2801에 CKI에 맞추어 SDI를 밀어 넣는다. void post_frame (long this_led_color) { for(byte color_bit = 23 ; color_bit != 255 ; color_bit--) { //23비트가 처음! 빨간색 (red data MSB) digitalWrite(CKI, LOW); //클럭이 LOW일때 데이터를 받아 들인다. long mask = 1L << color_bit; //The 1'L' forces the 1 to start as a 32 bit number, otherwise it defaults to 16-bit. if(this_led_color & mask) digitalWrite(SDI, HIGH); else digitalWrite(SDI, LOW); digitalWrite(CKI, HIGH); //클럭이 HIGH일때 데이터를 적용(latch) 한다. } } }}} 여러개 보낼경우. 이어서 보낸다. {{{ post_frame(0xFF0000); //첫번째 프레임 post_frame(0x00FF00); //두번째 프레임 // CLK pin keeps low more than 500uS will make the WS2801 internal status register reset digitalWrite(CKI, LOW); delayMicroseconds(500); }}}