SPI parece confuso en MSP430

9

Estoy tratando de obtener partes sensibles de un Bus Pirate conectado a una placa Launchpad (usando el cable Sparkfun: el naranja va a P1.6, el amarillo a P1.5. Esto debería ser correcto, a menos que tenga MOSI y MISO confundido ...). No tengo CS conectado, ya que solo estoy usando el pirata del autobús para monitorear cualquier cosa.

El pirata del bus está configurado para SPI, 125 KHz, Polaridad del reloj Inactivo bajo, borde del reloj de salida Activo a inactivo, medio de fase de muestra de entrada, / CS, la salida es normal.

En el Launchpad, tengo un MSP430G2231 sin cristal externo. Al usar Code Composer Studio, tengo lo siguiente:

#include  "msp430g2231.h"
volatile unsigned char value=0;

#pragma vector=USI_VECTOR
__interrupt void universal_serial_interface(void)
{
    value+=1;
    USISRL=value;
    USICNT=8;
}
void main(void){
    WDTCTL = WDTPW + WDTHOLD;

    BCSCTL1 = CALBC1_1MHZ;                    // Set range
    DCOCTL = CALDCO_1MHZ;
    BCSCTL2 &= ~(DIVS_3);

    USICTL0 |= USIPE7 +  USIPE6 + USIPE5 + USIMST + USIOE;
    USICTL1 |= USIIE;
    USICKCTL = USIDIV_3 + USISSEL_2;
    USICTL0 &= ~USISWRST;
    USISRL=value;
    USICNT = 8;

    __bis_SR_register(LPM0_bits+ GIE);  
}

La mayor parte de esto se improvisa a partir de varias muestras. Después de leer mucho la hoja de datos, parece que el reloj USI está configurado para funcionar a 125KHz (SMCLK de 1MHz, dividido por 8), aunque no tengo un alcance para medir esto.

Cuando corro, obtengo lo que es esencialmente basura del pirata del autobús. P puso un punto de interrupción en la primera línea del vector de interrupción de la USI, y lo hizo pasar tres veces, por lo que debería haber obtenido 0, 1, 2 del pirata del autobús

0x00(0x00)0x00(0x00)][0x40(0x00)]

Y dejándolo en ejecución libre, solo consigo cosas como esta:

[0xFF(0x00)][0x3F(0x00)][0x7F(0x00)][0xBF(0x00)][0xC0(0x00)0x00(0x00)][0x40(0x00)0x80(0x00)]

Que todavía no se parece en nada a lo que estoy esperando.

He pasado la mayor parte de la tarde revisando la guía del usuario para el chip, y todavía estoy perplejo.

Mientras escribía esto, descubrí que podía usar el Bus Pirate como un analizador lógico (usando LogicSniffer), y configurarlo para hacerlo. Y modificó el programa para escribir 0x55 a USISRL , y cambiar el USIDIV a USIDIV_4 para ralentizar un poco más las cosas, y aquí están los resultados:

Laseñaldelrelojsevebien,LogicSnifferinformaquesetratade285KHz...yMOSIes...especial.Esperaríaunbuenpatrónalterno,yaqueestoyescribiendo0x55,yesoestodomenos.

¿Alguientienealgunaideasobreloquepodríaestarhaciendomal?Chipdefectuoso?¿Algomás?

EDITAR:Ok,menorcantidaddeidiotezdemiparte.NocambiéelvalorqueseescribeaSPIenlainterrupción.Haciendoestoresultaenelpatrónesperado:

Sin embargo, volver a intentar escribir un byte incremental me da basura:

Porlotanto,todavíatengounproblema,peronotangrandecomopensé...

EDIT2:Graciasaloscomentariosacontinuación,atéelcabledetierradelcableBusPirate,queantesestabadesconectado,alatierrademifuentedealimentación(fuentedealimentacióndelaplacadepruebasdeSparkfun).Anteriormente,elterrenomáscercanoquecompartíanestabaenelconcentradorUSBdelqueestabacolgandotodoesteequipo.

EstoeliminólafallaenMOSIalejecutarelprogramacontador,yLogicSnifferahorapuededecodificarlosbytescorrectamenteporsucuenta:

El pirata de bus en modo monitor aún informa resultados impares:

[0x00(0x00)][0x04(0x00)][0x06(0x00)][0x10(0x00)][0x10(0x00)][0x10(0x00)][0x12(0x00)][0x18(0x00)]

Parece que es más capaz de detectar el final de las escrituras (supongo que eso es lo que delimitan los corchetes), pero los datos están descodificados todavía están desactivados. No estoy tan preocupado ahora que la forma de onda se ve mejor, pero aún así sería bueno saber por qué el Pirata de Bus se está confundiendo.

    
pregunta Matt Sieker

1 respuesta

3

MSP430 es un ejemplo de MCU que invierte la convención de nomenclatura de CPHA, por lo que se desvía de la descripción estándar de SPI: TI MSP430 usa el nombre UCCKPL en lugar de CPOL, y su UCCKPH es el inverso de CPHA. Cuando conecte dos chips juntos, examine cuidadosamente los valores de inicialización de la fase de reloj para asegurarse de usar la configuración correcta.

    
respondido por el Dirceu Rodrigues Jr

Lea otras preguntas en las etiquetas