SPI, MSP430'da bozuk görünüyor


9

Bir Launchpad kartına bağlanmış bir Otobüs Korsanından mantıklı bitler almaya çalışıyorum (Sparkfun kablosunu kullanarak: Turuncu P1.6'ya, Sarı'dan P1.5'e gidiyor. MOSI ve MISO'nun kafası karışmadıkça bu doğru olmalı ...). CS'yi bağladım, çünkü sadece bir şey izlemek için otobüs korsanını kullanıyorum.

Veriyolu korsanı SPI, 125KHz, Saat polaritesi Boşta, çıkış saat kenarı Aktif ila boşta, giriş örneği faz orta, / CS, çıkış normal için ayarlanmıştır.

Launchpad'de harici kristal içermeyen bir MSP430G2231 var. Code Composer Studio'yu kullanarak aşağıdakilere sahibim:

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

Bunların çoğu çeşitli örneklerden birlikte taşlanır. Veri sayfasını çok okuduktan sonra, USI saatinin 125KHz'de (1MHz'lik SMCLK, 8'e bölünmüş) çalışacak şekilde ayarlanmış olduğu görülüyor, ancak bunu ölçmek için bir kapsamım yok.

Koşarken, otobüs korsanından aslında çöp olanı alıyorum. P, USI kesinti vektörünün ilk satırına bir kesme noktası koydu ve üç kez geçti, bu yüzden otobüs korsanından 0, 1, 2 almalıydım

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

Ve serbest çalışmasına izin vermek, sadece böyle şeyler alıyorum:

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

Bu hala beklediğim gibi görünmüyor.

Akşamın çoğunu çip için kullanıcı kılavuzundan geçerek geçirdim ve hala güdüküm.

Bunu yazarken, Bus Pirate'ı bir mantık analizörü olarak (LogicSniffer kullanarak) kullanabileceğimi keşfettim ve bunu ayarladım. Ve programı 0x55 yazacak USISRLve biraz daha yavaşlatmak USIDIViçin değiştirilecek.USIDIV_4resim açıklamasını buraya girin

Saat sinyali iyi görünüyor, LogicSniffer yaklaşık 285KHz ... ve MOSI'nin ... özel olduğunu bildiriyor. 0x55 yazdığım için güzel bir alternatif desen beklerdim ve bu başka bir şey değil.

Herhangi birinin yanlış yaptığım hakkında bir fikri var mı? Arızalı çip mi? Başka bir şey?

EDIT: Tamam, benim açımdan az miktarda aptallık. Kesmede SPI'ye yazılan değeri değiştirmedim. Bunu yapmak beklenen kalıpta sonuçlanır:

resim açıklamasını buraya girin

Ancak, artan bir bayt yazmaya çalıştığım zaman bana çöp getirir: resim açıklamasını buraya girin

Yani, hala bir sorunum var, düşündüğüm kadar büyük değil ...

DÜZENLEME 2: Aşağıdaki yorumlar sayesinde, daha önce bağlı olmayan Bus Pirate kablosunun toprak kablosunu güç kaynağımdan (Sparkfun'un breadboard güç kaynağı) yere bağladım. Daha önce, paylaştıkları en yakın zemin, tüm bu ekipmanı taktığım USB hub'daydı.

Bu, sayaç programını çalıştırırken MOSI'deki aksaklığı giderdi ve LogicSniffer artık baytları kendi başına doğru şekilde çözebilir: resim açıklamasını buraya girin

Monitör modundaki otobüs korsanı hala garip sonuçlar veriyor:

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

Yazmaların uçlarını daha iyi tespit edebiliyor gibi görünüyor (köşeli parantezlerin ne olduğunu varsayıyorum), ancak veri kod çözme hala kapalı. Dalga formunun daha iyi göründüğü kadar endişelenmiyorum, ama Otobüs Korsanının neden karıştığını bilmek güzel olurdu.


3
Bu son diyagram, MOSI hattında aksaklıklara sahip gibi görünüyor, clk'den çapraz konuşma olabilir. Osiloskop musunuz? Kablolama neye benziyor - BusPirate ile MSP430 arasında sağlam bir sağlam zemine sahip misiniz?
Martin Thompson

2
@MartinThompson'a katılıyorum. MOSI hattı parlıyor ve Bus Pirate karışıyor. İkinci fotoğrafta biraz şaşıyorsanız ve Bus Pirate'nin gördüklerini düşündüğünü görmezden gelirseniz (sadece Windows hesap makinesine gördüğüm ikiliyi yazdım ve hex'e dönüştürdüm), istediğiniz gibi artan 6B-6C-6D elde edersiniz. Bus Pirate ve MSP arasındaki kabloları temizlemeniz gerekir.
embedded.kyle

while(1);Main () sonunda çıkmasını ve rastgele şeyler yapmasını durdurmak için bir veya eşdeğerini görmüyorum .
Oli Glaser

2
@OliGlaser, sayfayı doğru okuyorsam, LPM0'a girmek bir kesinti gerçekleşene kadar CPU yürütmesini durdurur. Çoğu TI numunesi olmasa bile bunu kullanır. MSP430'ları düşük güç parçaları olarak kullandıklarından ve meşgul bir döngü çok güç dostu olmadığından mantıklıdır.
Matt Sieker

1
Aman tanrım, bunun 1 yaşından büyük olduğunu fark ettim.
apalopohapa

Yanıtlar:


3

MSP430, CPHA adlandırma kuralını tersine çeviren ve böylece standart SPI açıklamasından sapan bir MCU örneğidir: TI MSP430, CPOL yerine UCCKPL adını kullanır ve UCCKPH, CPHA'nın tersidir . İki yongayı birbirine bağlarken, doğru ayarları kullandığınızdan emin olmak için saat fazı başlatma değerlerini dikkatle inceleyin.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.