SPI Wygląda na zniekształcony na MSP430

9

Próbuję wydobyć sensowne fragmenty z Bus Pirate podłączonego do tablicy Launchpad (za pomocą kabla Sparkfun: pomarańczowy przechodzi do P1.6, żółty do P1.5. To powinno być poprawne, chyba że mam pomieszane MOSI i MISO ...) Nie mam podłączonego CS, ponieważ po prostu używam pirata autobusowego do monitorowania czegokolwiek.

Pirat magistrali jest ustawiony na SPI, 125 kHz, Biegunowość zegara Bezczynność niska, zbocze zegara wyjściowego Aktywne do bezczynności, wejściowa faza próbki środkowa, / CS, wyjście jest normalne.

Na Launchpad mam MSP430G2231 bez zewnętrznego kryształu. Korzystając z Code Composer Studio, mam następujące funkcje:

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

Większość z nich jest poskładana razem z różnych próbek. Po długim czytaniu arkusza danych wydaje się, że zegar USI działa na częstotliwości 125 KHz (SMCLK 1 MHz, podzielony przez 8), chociaż nie mam zakresu, aby to zmierzyć.

Kiedy biegam, wyciągam z piratów autobusowych to, co w gruncie rzeczy jest śmieciami. P umieścił punkt przerwania na pierwszej linii wektora przerwań USI i kazał przejść trzy razy, więc powinienem dostać 0, 1, 2 od pirata autobusu

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

I pozwalając mu na swobodny bieg, dostaję takie rzeczy:

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

Co nadal nie wygląda tak, jak się spodziewam.

Spędziłem większość wieczoru, przeglądając przewodnik użytkownika po chipie i nadal jestem zakłopotany.

Pisząc to, odkryłem, że mogę używać Bus Pirate jako analizatora logiki (używając LogicSniffer) i skonfigurowałem go, aby to zrobić. I zmodyfikowany program do pisania 0x55 do USISRLi zmienić USIDIVsię USIDIV_4, aby spowolnić nieco więcej, a oto wyniki: wprowadź opis zdjęcia tutaj

Sygnał zegara wygląda dobrze, LogicSniffer donosi, że ma około 285 kHz ... a MOSI jest ... wyjątkowy. Spodziewałbym się ładnego naprzemiennego wzorca, ponieważ piszę 0x55 i to wszystko.

Czy ktoś ma jakieś przemyślenia na temat tego, co robię źle? Wadliwy chip? Coś innego?

EDYCJA: Ok, niewielka ilość idiotyzmu z mojej strony. Nie zmieniłem wartości zapisywanej do SPI w przerwie. Wykonanie tego powoduje oczekiwany wzorzec:

wprowadź opis zdjęcia tutaj

Jednak wracając do próby zapisania bajtu inkrementującego, dostaję śmieci: wprowadź opis zdjęcia tutaj

Nadal mam problem, ale nie tak duży, jak myślałem ...

EDYCJA 2: Dzięki poniższym komentarzom przywiązałem przewód uziemiający do kabla Bus Pirate, który wcześniej nie był podłączony, do uziemienia mojego zasilacza (zasilacza płyty głównej Sparkfun). Wcześniej najbliższy wspólny grunt był z powrotem w koncentratorze USB, na którym zawiesiłem cały ten sprzęt.

To usunęło usterki w MOSI podczas uruchamiania programu licznika, a LogicSniffer może teraz samodzielnie samodzielnie poprawnie dekodować bajty: wprowadź opis zdjęcia tutaj

Pirat autobusowy w trybie monitorowania nadal zgłasza dziwne wyniki:

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

Wydaje się, że lepiej wykrywa końce zapisów (zakładam, że to, co ograniczają nawiasy kwadratowe), ale dane dekodowania są nadal wyłączone. Nie jestem już tak zaniepokojony faktem, że kształt fali wygląda lepiej, ale byłoby miło wiedzieć, dlaczego Bus Pirate się myli.

Matt Sieker
źródło
3
Ten ostatni schemat wygląda, jakby miał usterki na linii MOSI, może to być przesłuch z clk. Czy jesteś oscyloskopem? Jak wyglądają okablowanie - czy masz dobre solidne krótkie uziemienie między BusPirate a MSP430?
Martin Thompson,
2
Zgadzam się z @MartinThompson. Linia MOSI się psuje, a Bus Pirate jest zdezorientowany. Jeśli spojrzysz trochę na drugie zdjęcie i zignorujesz to, co według niego widzi Bus Pirate (właśnie wpisałem plik binarny, który widzę w kalkulatorze Windows i przekonwertowałem na hex), otrzymasz 6B-6C-6D, zwiększając dowolnie. Musisz wyczyścić okablowanie między Bus Pirate a MSP.
embedded.kyle
Nie widzę while(1);ani odpowiednika na końcu main (), aby zatrzymać wyjście i robienie losowych rzeczy.
Oli Glaser,
2
@OliGlaser, jeśli dobrze czytam arkusz, przejście do LPM0 faktycznie zatrzymuje wykonywanie procesora, dopóki nie nastąpi przerwanie. Wykorzystuje to większość, jeśli nie wszystkie próbki TI. Ma to sens, ponieważ reklamują MSP430 jako części o niskiej mocy, a zajęta pętla nie jest zbyt przyjazna dla zasilania.
Matt Sieker,
1
O rany, właśnie zauważyłem, że ma> 1 rok.
apalopohapa

Odpowiedzi:

3

MSP430 jest przykładem MCU, który odwraca konwencję nazewnictwa CPHA, tym samym odbiegając od standardowego opisu SPI: TI MSP430 używa nazwy UCCKPL zamiast CPOL, a jego UCCKPH jest odwrotnością CPHA. Podczas łączenia dwóch układów razem dokładnie sprawdź wartości inicjalizacji fazy zegara, aby upewnić się, że używasz odpowiednich ustawień.

Dirceu Rodrigues Jr
źródło