SPI sembra confuso su MSP430


9

Sto cercando di ottenere bit sensibili da un pirata del bus collegato a una scheda Launchpad (usando il cavo Sparkfun: l'arancione passa a P1.6, il giallo a P1.5. Questo dovrebbe essere corretto, a meno che non abbia MOSI e MISO confusi ...). Non ho CS collegato, poiché sto solo usando il pirata del bus per monitorare qualsiasi cosa.

Il pirata del bus è impostato per SPI, 125KHz, Polarità dell'orologio Inattivo basso, bordo dell'orologio in uscita Attivo inattivo, ingresso fase campione centrale, / CS, uscita normale.

Sul Launchpad ho un MSP430G2231 senza cristalli esterni. Usando Code Composer Studio, ho il seguente:

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

Gran parte di questo è messo insieme dai vari campioni. Dopo molte letture della scheda tecnica, sembra che l'orologio USI sia impostato per funzionare a 125KHz (SMCLK di 1MHz, diviso per 8), anche se non ho uno scopo per misurarlo.

Quando corro, ricavo ciò che è essenzialmente spazzatura dal pirata dell'autobus. P mise un breakpoint sulla prima riga del vettore di interrupt USI e lo fece passare tre volte, quindi avrei dovuto ottenere 0, 1, 2 dal pirata del bus

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

E lasciandolo libero, ottengo solo cose del genere:

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

Che non assomiglia ancora a quello che mi aspetto.

Ho trascorso gran parte della serata a consultare la guida per l'utente del chip e sono ancora perplesso.

Mentre scrivevo, ho scoperto che posso usare Bus Pirate come analizzatore di logica (usando LogicSniffer) e impostarlo per farlo. E modificato il programma in cui scrivere 0x55 USISRL, e cambia USIDIVin USIDIV_4per rallentare un po 'di più le cose, ed ecco i risultati: inserisci qui la descrizione dell'immagine

Il segnale dell'orologio sembra buono, LogicSniffer riporta che è di circa 285 KHz ... e MOSI è ... speciale. Mi aspetterei un bel modello alternato, dato che sto scrivendo 0x55, e questo è tutt'altro.

Qualcuno ha qualche idea su cosa potrei fare di sbagliato? Chip difettoso? Qualcos'altro?

EDIT: Ok, una piccola quantità di idiozia da parte mia. Non ho modificato il valore che viene scritto su SPI nell'interrupt. In questo modo si ottiene il modello previsto:

inserisci qui la descrizione dell'immagine

Tuttavia, tornare al tentativo di scrivere un byte incrementale mi fa immondizia: inserisci qui la descrizione dell'immagine

Quindi, ho ancora un problema, ma non così grande come pensavo ...

EDIT 2: Grazie ai commenti qui sotto, ho legato il filo di terra al cavo Bus Pirate, che era precedentemente scollegato, a terra dal mio alimentatore (alimentatore della breadboard di Sparkfun). In precedenza, il terreno più vicino che condividevano era di nuovo nell'hub USB da cui ho appeso tutta questa attrezzatura.

Ciò ha rimosso il problema tecnico su MOSI durante l'esecuzione del programma contatore e LogicSniffer ora può decodificare i byte correttamente da solo: inserisci qui la descrizione dell'immagine

Il pirata del bus in modalità monitor riporta ancora risultati strani:

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

Sembra meglio in grado di rilevare le estremità delle scritture (suppongo che sia quello che delimitano le parentesi quadre), ma i dati sono decodificati è ancora spento. Non sono così preoccupato ora che la forma d'onda sembra migliore, ma sarebbe comunque bello sapere perché Bus Pirate si sta confondendo.


3
Quell'ultimo diagramma sembra avere dei difetti sulla linea MOSI, potrebbe essere crosstalk dal clk. Sei un oscilloscopio? Com'è il cablaggio: hai una buona terra corta solida tra BusPirate e MSP430?
Martin Thompson,

2
Sono d'accordo con @MartinThompson. La linea MOSI è glitch e Bus Pirate si sta confondendo. Se socchiudi un po 'gli occhi alla seconda immagine e ignori ciò che pensa Bus Pirate (ho appena digitato il binario che vedo nel calcolatore di Windows e convertito in esadecimale) otterrai 6B-6C-6D, incrementando come vuoi. È necessario ripulire il cablaggio tra Bus Pirate e MSP.
embedded.kyle,

Non vedo un while(1);o equivalente alla fine di main () per impedirne l'uscita e fare cose casuali.
Oli Glaser,

2
@OliGlaser, se sto leggendo il foglio a destra, entrare in LPM0 interrompe effettivamente l'esecuzione della CPU fino a quando si verifica un interrupt. La maggior parte, se non tutti i campioni di TI, usano questo. Ha senso, dal momento che propongono gli MSP430 come parti a bassa potenza e un circuito occupato non è molto rispettoso della potenza.
Matt Sieker,

1
Oh mio Dio, ho appena notato che ha> 1 anno.
apalopohapa,

Risposte:


3

MSP430 è un esempio MCU che inverte la convenzione di denominazione CPHA, divergendo quindi dalla descrizione SPI standard: TI MSP430 utilizza il nome UCCKPL anziché CPOL e il suo UCCKPH è l' inverso di CPHA. Quando si collegano due chip insieme, esaminare attentamente i valori di inizializzazione della fase di clock per accertarsi di utilizzare le impostazioni corrette.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.