MSP430 SPI no funciona a velocidades más altas (4+ MHz)

0

Estoy intentando generar una forma de onda de un byte usando SPI en modo maestro. Esto funciona como se esperaba cuando se usa el REFOCLK a 32 KHz. Sin embargo, cuando se usa XT2 a 4 MHz o el DCOCLK (a 20 MHz), las formas de onda se ven completamente mal, como se muestra en la imagen adjunta. ¿Por qué está pasando esto? ¿Necesito su configuración especial o el MSP430F5529 simplemente no es capaz de SPI a estas velocidades?

Primera imagen: Salida a 4+ MHz (50 ns intervalos horizontales), Segunda imagen: Salida a 32 KHz

(Medidoconel Hantek HT6022BE , que tiene un ancho de banda de 20 MHz.)

Claramente, los 4+ MHz no están emitiendo la forma de onda correcta, mientras que los 32 KHz sí lo están.

WDTCTL = WDTPW | WDTHOLD;                           // Stop watchdog timer

SetVcoreUp(0x01);                                   //Bring up power, taken directly from datasheet
SetVcoreUp(0x02);
SetVcoreUp(0x03);
__bis_SR_register(SCG0);                            //Disable FLL
P5SEL |= (BIT2 + BIT3);                             //Set crystal ports
UCSCTL6 &= ~XT2OFF;                                 //Enable XT2
UCSCTL3 |= SELREF_2;                                //Set FLL
UCSCTL4 |= SELA_2;                                  //Set ACLK also
UCSCTL6 |= XT2DRIVE_0;                              //Select power needed for XT2
do
{
    UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + DCOFFG);     //Clear fault flags
    SFRIFG1 &= ~OFIFG;                              //Clear general oscillator fault flag
}
while (SFRIFG1 & OFIFG);                            //If fault, OFIFG&SFRIFG1 will be non zero (true)

UCSCTL4 |= SELS__XT2CLK;

P1DIR |= (BIT0 + BIT2);
P2DIR |= BIT2;                                      //Set P2.2 as out direction to monitor clock
P2SEL |= BIT2;                                      //Select P2.2 as SMCLK output

__bic_SR_register(SCG0);                            //Enable FLL

UCB0CTL1 = UCSWRST;                                 //Put UCSI in reset state for configuration
UCB0CTL0 |= (UCSYNC + UCMST + UCMSB + UCCKPH);      //Enable settings: SPI mode (insetad of UART) + Master + Most sig byte
P3SEL |= BIT0;                                      //Port select
P3DIR |= BIT0;
UCB0CTL1 |= UCSSEL1;                                //Disable UCSI reset state and select SMCLK src
UCB0CTL1 &= ~UCSWRST;                               //Enable UCSI

while (1)
{
    while (!(UCB0IFG & UCTXIFG));                   //Delay until UCB0TXBUF is empty

    UCB0TXBUF = 0xEE;                               //transmit 11101110
    __delay_cycles(10000);
}

p.s., sé que el SPI es síncrono, pero necesito estas altas velocidades porque en realidad lo estoy usando para la forma de onda, no para comunicarme con un esclavo SPI

    
pregunta Ashwin Gupta

0 respuestas

Lea otras preguntas en las etiquetas