<?xml version="1.0" encoding="UTF-8"?>
<!-- generator="bbPress/1.0.2" -->
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title>LeafLabs Garden &#187; Topic: Data from one SPI port bleeding into other</title>
		<link>http://forums.leaflabs.com/topic.php?id=2267</link>
		<description>A place to share, learn, and grow...</description>
		<language>en-US</language>
		<pubDate>Fri, 22 Jan 2016 00:27:08 +0000</pubDate>
		<generator>http://bbpress.org/?v=1.0.2</generator>
		<textInput>
			<title><![CDATA[Search]]></title>
			<description><![CDATA[Search all topics from these forums.]]></description>
			<name>q</name>
			<link>http://forums.leaflabs.com/search.php</link>
		</textInput>
		<atom:link href="http://forums.leaflabs.com/rss.php?topic=2267" rel="self" type="application/rss+xml" />

		<item>
			<title>gbulmer on "Data from one SPI port bleeding into other"</title>
			<link>http://forums.leaflabs.com/topic.php?id=2267#post-11973</link>
			<pubDate>Tue, 24 Jul 2012 17:31:51 +0000</pubDate>
			<dc:creator>gbulmer</dc:creator>
			<guid isPermaLink="false">11973@http://forums.leaflabs.com/</guid>
			<description>&#60;p&#62;jfenwick - please try to reduce the program to a much smaller example.&#60;br /&#62;
Also what are the symptoms of &#34;data from one is bleeding into the other&#34;?
&#60;/p&#62;</description>
		</item>
		<item>
			<title>jfenwick on "Data from one SPI port bleeding into other"</title>
			<link>http://forums.leaflabs.com/topic.php?id=2267#post-11972</link>
			<pubDate>Tue, 24 Jul 2012 16:34:58 +0000</pubDate>
			<dc:creator>jfenwick</dc:creator>
			<guid isPermaLink="false">11972@http://forums.leaflabs.com/</guid>
			<description>&#60;p&#62;I'm using both SPI1 and SPI2 on a Maple r5 to control some WS2801 LED strips.&#60;/p&#62;
&#60;p&#62;I'm able to update both strips, but data from one is bleeding into the other.&#60;/p&#62;
&#60;p&#62;What could be causing this?&#60;/p&#62;
&#60;p&#62;Here is the code:&#60;/p&#62;
&#60;pre&#62;&#60;code&#62;#include &#38;lt;stdlib.h&#38;gt;
#include &#38;lt;string.h&#38;gt;

struct CRGB {
  uint8 b;
  uint8 g;
  uint8 r;
};
struct CRGB *leds;
struct CRGB *leds_2;

float Rval,Gval,Bval;

int inByte = 0;         // incoming serial byte

// Use SPI port number 1
HardwareSPI spi_1(1);
HardwareSPI spi_2(2);

//const int numLEDs_1 = 50;
const int numLEDs_1 = 248;
//const int numLEDs_1 = 518;
//const int numLEDs_1 = 270;
const int numLEDs_2 = 270;
int time_since_last = 0;
//uint8 * pixels_1;

void setup() {
  leds = (struct CRGB*)malloc(numLEDs_1);
  leds_2 = (struct CRGB*)malloc(numLEDs_2);

  //spi_1.begin(SPI_562_500KHZ, MSBFIRST, SPI_MODE_0);
  //spi_1.begin(SPI_1_125MHZ, MSBFIRST, SPI_MODE_0);
  spi_1.begin(SPI_2_25MHZ, MSBFIRST, SPI_MODE_0);
  spi_2.begin(SPI_2_25MHZ, MSBFIRST, SPI_MODE_0);
  memset(leds, 0, numLEDs_1 * 3);
  memset(leds_2, 0, numLEDs_2 * 3);
  show_leds();

  //establishContact();       // Send a byte to establish contact until receiver responds
}

void loop() {
  /*
  if (SerialUSB.available() &#38;gt; 0) {
    // get incoming byte:
    inByte = SerialUSB.read();
    if (inByte == &#38;#39;A&#38;#39;) {
      blue_strip();
      time_since_last = 0;
    }
    else if (inByte == &#38;#39;B&#38;#39;) {
      rainbow_hsl();
      time_since_last = 0;
    }
  }
  else {
    if (time_since_last &#38;gt; 10000000) {
      rainbow_hsl();
    }
    time_since_last++;
  }
  */

  /*
  for (int i=0; i&#38;lt;3; i++) {
    memset(leds, 0, numLEDs_1 * 3);
    switch(i % 3) {
      case 0:
        leds[0].r = 255;
        break;
      case 1:
        leds[0].g = 255;
        break;
      case 2:
        leds[0].b = 255;
        break;
    }
    delay(500);
  }
  */

  rainbow_hsl();
  //rainbow_hsl2();
  //blue_strip2();

  //delay(10);
}

void audio_response(int amp) {
  int scaled = map(amp, 0, 127, 0, numLEDs_1);
  memset(leds, 0, numLEDs_1 * 3);
  leds[scaled].b = 255;
  show_leds();
  delay(10);
}

void blue_strip() {
  // blue one at a time down the strand
  for (int i=0; i&#38;lt;numLEDs_1; i++) {
    memset(leds, 0, numLEDs_1 * 3);
    leds[i].b = 255;
    show_leds();
    delay(100);
  }
}

void blue_strip2() {
  // blue one at a time down the strand
  for (int i=0; i&#38;lt;numLEDs_2; i++) {
    memset(leds, 0, numLEDs_1 * 3);
    memset(leds_2, 0, numLEDs_2 * 3);
    leds_2[i].b = 255;
    show_leds();
    delay(10);
  }
}

/*
void two_strip_test() {
  // blue one at a time down the strand
  for (int i=0; i&#38;lt;numLEDs_2; i++) {
    memset(leds_2, 0, numLEDs_2 * 3);
    leds_2[i].b = 255;
    show_leds();
    delay(100);
  }
}
*/

void rainbow_hsl() {
  // fade red in
  memset(leds, 0, numLEDs_1 * 3);
  for(int k = 0; k &#38;lt; 256; k++) {
    for(int i = 0; i &#38;lt; numLEDs_1; i++ ) {
      leds[i].r = k;
    }
    show_leds();
    //show_leds_2();
    delay(10);
  }

  // cycle through colors
  float hue = 0.0;
  for (int i=0; i&#38;lt;100; i++) {
    memset(leds, 0, numLEDs_1 * 3);
    hue = i / 100.0;
    hslToRgb(hue, 1.0, 0.5);
    for (int j=0; j&#38;lt;numLEDs_1; j++) {
      leds[j].r = Rval;
      leds[j].g = Gval;
      leds[j].b = Bval;
    }
    show_leds();
    //show_leds_2();
    delay(50);
  }

  // fade red out
  memset(leds, 0, numLEDs_1 * 3);
  for(int k = 255; k &#38;gt;= 0; k--) {
    for(int i = 0; i &#38;lt; numLEDs_1; i++ ) {
      leds[i].r = k;
    }
    show_leds();
    //show_leds_2();
    delay(10);
  }
}

void rainbow_hsl2() {
  // fade red in
  memset(leds, 0, numLEDs_1 * 3);
  memset(leds_2, 0, numLEDs_2 * 3);
  for(int k = 0; k &#38;lt; 256; k++) {
    for(int i = 0; i &#38;lt; numLEDs_2; i++ ) {
      leds_2[i].r = k;
    }
    show_leds();
    delay(10);
  }

  // cycle through colors
  float hue = 0.0;
  for (int i=0; i&#38;lt;100; i++) {
    memset(leds_2, 0, numLEDs_2 * 3);
    hue = i / 100.0;
    hslToRgb(hue, 1.0, 0.5);
    for (int j=0; j&#38;lt;numLEDs_2; j++) {
      leds_2[j].r = Rval;
      leds_2[j].g = Gval;
      leds_2[j].b = Bval;
    }
    show_leds();
    delay(50);
  }

  // fade red out
  memset(leds_2, 0, numLEDs_2 * 3);
  for(int k = 255; k &#38;gt;= 0; k--) {
    for(int i = 0; i &#38;lt; numLEDs_2; i++ ) {
      leds_2[i].r = k;
    }
    show_leds();
    delay(10);
  }
}

void show_leds() {
  for (int j=0; j&#38;lt;numLEDs_1; j++) {
    spi_1.write(leds[j].b);
    spi_1.write(leds[j].g);
    spi_1.write(leds[j].r);
  }

  /*
  for (int j=0; j&#38;lt;numLEDs_2; j++) {
    spi_2.write(leds_2[j].b);
    spi_2.write(leds_2[j].g);
    spi_2.write(leds_2[j].r);
  }
  */
}

void show_leds_2() {
  for (int j=0; j&#38;lt;numLEDs_2; j++) {
    spi_2.write(leds_2[j].b);
    spi_2.write(leds_2[j].g);
    spi_2.write(leds_2[j].r);
  }
}

void hslToRgb(float h, float s, float l){
  float r, g, b;

  if(s == 0){
    r = g = b = l; // achromatic
  }
  else{
    float q = l &#38;lt; 0.5 ? l * (1.0 + s) : l + s - l * s;
    float p = 2.0 * l - q;
    r = hue2rgb(p, q, h + 1.0/3.0);
    g = hue2rgb(p, q, h);
    b = hue2rgb(p, q, h - 1.0/3.0);
  }

  Rval = r * 255.0;
  Gval = g * 255.0;
  Bval = b * 255.0;
}

float hue2rgb(float p, float q, float t){
  if(t &#38;lt; 0) t += 1;
  if(t &#38;gt; 1) t -= 1;
  if(t &#38;lt; 1.0/6.0) return p + (q - p) * 6.0 * t;
  if(t &#38;lt; 1.0/2.0) return q;
  if(t &#38;lt; 2.0/3.0) return p + (q - p) * (2.0/3.0 - t) * 6.0;
  return p;
}

void establishContact() {
    while (SerialUSB.available() &#38;lt;= 0) {
        SerialUSB.print(&#38;#39;A&#38;#39;, BYTE);   // send a capital A
        delay(300);
    }
}&#60;/code&#62;&#60;/pre&#62;</description>
		</item>

	</channel>
</rss>
