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 USIDIV
in USIDIV_4
per rallentare un po 'di più le cose, ed ecco i risultati:
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:
Tuttavia, tornare al tentativo di scrivere un byte incrementale mi fa immondizia:
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:
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.
while(1);
o equivalente alla fine di main () per impedirne l'uscita e fare cose casuali.