SPI Tampaknya rusak pada MSP430

9

Saya mencoba untuk mendapatkan bit yang masuk akal dari Bajak Laut Bus yang dihubungkan ke papan Launchpad (Menggunakan kabel Sparkfun: Oranye pergi ke P1.6, Kuning ke P1.5. Ini harus benar, kecuali jika saya memiliki MOSI dan MISO bingung ...). Saya tidak punya CS yang terhubung, karena saya hanya menggunakan bajak laut bus untuk memantau apa pun.

Bajak laut bus diatur untuk SPI, 125KHz, Clock polaritas Idle rendah, output clock edge Aktif ke idle, input sampel fase tengah, / CS, output normal.

Di Launchpad, saya memiliki MSP430G2231 tanpa kristal eksternal. Menggunakan Code Composer Studio, saya memiliki yang berikut ini:

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

Sebagian besar dirakit dari berbagai sampel. Setelah banyak membaca lembar data, sepertinya jam USI diatur untuk berjalan pada 125KHz (SMCLK 1MHz, dibagi 8), meskipun saya tidak memiliki ruang untuk mengukur ini.

Saat berlari, saya mendapatkan apa yang pada dasarnya sampah dari bajak laut bus. P meletakkan breakpoint pada baris pertama dari vektor interupsi USI, dan harus melewati tiga kali, jadi saya seharusnya mendapatkan 0, 1, 2 dari bajak laut bus

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

Dan membiarkannya berjalan gratis, saya hanya mendapatkan hal-hal seperti ini:

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

Yang masih terlihat tidak seperti yang kuharapkan.

Saya telah menghabiskan sebagian besar malam itu melalui panduan pengguna untuk chip, dan saya masih bingung.

Saat menulis ini, saya menemukan bahwa saya dapat menggunakan Bajak Laut Bus sebagai penganalisa logika (menggunakan LogicSniffer), dan mengaturnya untuk melakukannya. Dan dimodifikasi program untuk menulis 0x55 untuk USISRL, dan mengubah USIDIVuntuk USIDIV_4hal-hal memperlambat sedikit lebih, dan inilah hasilnya: masukkan deskripsi gambar di sini

Sinyal clock terlihat bagus, LogicSniffer melaporkan bahwa ini sekitar 285KHz ... dan MOSI adalah ... khusus. Saya berharap pola bolak-balik yang bagus, karena saya sedang menulis 0x55, dan itu sama sekali tidak.

Adakah yang berpikir salah tentang kesalahan saya? Chip yang rusak? Sesuatu yang lain

EDIT: Oke, sedikit kebodohan di pihak saya. Saya tidak mengubah nilai yang ditulis ke SPI di interupsi. Melakukan ini menghasilkan pola yang diharapkan:

masukkan deskripsi gambar di sini

Namun, kembali ke mencoba untuk menulis byte yang bertambah membuat saya sampah: masukkan deskripsi gambar di sini

Jadi, saya masih punya masalah, hanya saja tidak sebesar yang saya kira ...

EDIT 2: Berkat komentar di bawah ini, saya ikat kabel ground dari kabel Bus Pirate, yang sebelumnya tidak terhubung, ke ground dari catu daya saya (catu daya papan tempat memotong roti Sparkfun). Sebelumnya, tempat terdekat yang mereka bagikan adalah kembali ke hub USB tempat saya menggantung semua peralatan ini.

Ini menghapus kesalahan pada MOSI saat menjalankan program penghitung, dan LogicSniffer sekarang dapat mendekode byte dengan benar: masukkan deskripsi gambar di sini

Bajak laut bus dalam mode monitor masih melaporkan hasil yang aneh:

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

Tampaknya memang lebih mampu mendeteksi ujung-ujung tulisan (saya berasumsi itulah yang dibatasi kurung siku), tetapi data yang diterjemahkan masih mati. Saya tidak begitu khawatir sekarang bahwa bentuk gelombang terlihat lebih baik, tetapi akan tetap menyenangkan untuk mengetahui mengapa Bajak Laut Bus semakin bingung.

Matt Sieker
sumber
3
Diagram terakhir itu terlihat seperti memiliki gangguan pada garis MOSI, bisa menjadi crosstalk dari clk. Apakah Anda seorang osiloskop? Seperti apa kabel Anda - apakah Anda memiliki tanah pendek yang kokoh antara BusPirate dan MSP430?
Martin Thompson
2
Saya setuju dengan @MartinThompson. Jalur MOSI sedang bermasalah dan Bajak Laut Bus semakin bingung. Jika Anda sedikit menyipit pada gambar kedua dan mengabaikan apa yang dilihat Bus Pirate (saya baru saja mengetik biner yang saya lihat di kalkulator Windows dan dikonversi ke hex) Anda mendapatkan 6B-6C-6D, incrementing seperti yang Anda inginkan. Anda perlu membersihkan kabel antara Bajak Laut Bus dan MSP.
embedded.kyle
Saya tidak melihat while(1);atau setara di akhir main () untuk menghentikannya keluar dan melakukan hal-hal acak.
Oli Glaser
2
@ OliGlaser, jika saya membaca sheet dengan benar, masuk ke LPM0 sebenarnya menghentikan eksekusi CPU sampai terjadi interupsi. Sebagian besar, jika tidak semua sampel TI menggunakan ini. Masuk akal, karena mereka menggembar-gemborkan MSP430s sebagai bagian daya rendah, dan loop sibuk tidak sangat ramah daya.
Matt Sieker
1
Ya ampun, saya baru tahu ini berumur> 1 tahun.
apalopohapa

Jawaban:

3

MSP430 adalah contoh MCU yang membalikkan konvensi penamaan CPHA, sehingga menyimpang dari deskripsi SPI standar: TI MSP430 menggunakan nama UCCKPL bukan CPOL, dan UCCKPH-nya adalah kebalikan dari CPHA. Saat menghubungkan dua chip bersama-sama, hati-hati memeriksa nilai inisialisasi fase jam untuk memastikan menggunakan pengaturan yang tepat.

Dirceu Rodrigues Jr
sumber