Bonjour à tous !
Je viens demander de l'aide sur ce forum car je me trouve dans une impasse !
J'ai pour projet de recevoir une donnée par communication série et de l'envoyer en SPI grâce à un µp msp430g2553. L'objectif étant d'allumer des LED WS2811.
J'ai d'abord créer la partie réception d'un coté et la partie transmission de l'autre(2 programmes).
J'ai donc réussi à faire la partie transmission de données en SPI (je rentrais les octets définissant les couleurs directement dans le programme) les leds s'allument bien selon les couleurs souhaitées. Et j'ai testé la partie réception série en créant une boucle comme quoi les données reçues doivent être directement transmises par le port série. Cela fonctionne également.
Mais lorsque j'assemble les 2 parties dans 1 seul programme (donc pour recevoir en série et transmettre en SPI), les données sont bien envoyées vers les leds mais les couleurs ne correspondent pas du tout, les leds s'allument même lorsque je ne rentre que des 0, je ne comprend pas du tout pourquoi les données sont modifiées. Je reçois les données par le port P1.1 et les envois par le port P1.7.
Si quelqu'un pourrait m'aider ce serait super !
Voila mon code :
Code:
void main(void) {

	WDTCTL = WDTPW + WDTHOLD;

	BCSCTL1 = CALBC1_8MHZ;
	DCOCTL = CALDCO_8MHZ;

	// setup USIB, needed for the driver
	P1SEL |= DATA_OUT_PIN + BIT1 + BIT6 + BIT2; // P1.1 et P1.6 UCB0RXD input
	P1SEL2 |= DATA_OUT_PIN + BIT1 + BIT6 + BIT2; // P1.2 et P1.7 UCB0TXD output
        UCA0CTL1 |= UCSSEL_3;                     // SMCLK
        UCA0BR0 = 52;                              // 8MHz 9600bauds
        UCA0BR1 = 0;                              // 8MHz 9600bauds
        UCA0MCTL = 0x10|UCOS16;             
        UCA0CTL1 &= ~UCSWRST;                     // **Initialize USCI state machine**
	UCB0CTL0 |= UCCKPH + UCMSB + UCMST + UCSYNC; // 3-pin, 8-bit SPI master
	UCB0CTL1 |= UCSSEL_2; // SMCLK
	UCB0BR0 |= 0x02; // 8MHz/2 = 0.25us
	UCB0BR1 = 0;
	UCB0CTL1 &= ~UCSWRST;
       
IE2 |= UCA0RXIE;                          // Enable USCI_A0 RX interrupt

  __bis_SR_register(LPM0_bits + GIE);       // Enter LPM0, interrupts enabled
  
  }

  #pragma vector = USCIAB0RX_VECTOR
  __interrupt void ReceiveInterrupt(void)
{
tab[i]=UCA0RXBUF;             //je crée un tableau pour stocker les données et tout envoyer ensuite ce qui fait ma trame
i++;
if(i==12){                     //i=12 car je commande 4led, 3octets pour chaque
	for(b=0;b<12;b++) {
                   for(c=0;c<8;c++){          //chaque bit de l'octet est comparé avec un 1
                         while (!(IFG2 & UCB0TXIFG));
                         (tab[b] & 0x80) ? (UCB0TXBUF = 0xF0) : (UCB0TXBUF = 0xC0);
                          tab[b]<<=1;
			}     
       }
   __delay_cycles(200);    // a la fin de la trame il doit y avoir un delai de 50us pour que les leds sachent que c'est la fin
   i=0;
}
}