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; } }
-----