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 USIDIV
untuk USIDIV_4
hal-hal memperlambat sedikit lebih, dan inilah hasilnya:
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:
Namun, kembali ke mencoba untuk menulis byte yang bertambah membuat saya sampah:
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:
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.
while(1);
atau setara di akhir main () untuk menghentikannya keluar dan melakukan hal-hal acak.