Tôi đang cố gắng lấy các bit hợp lý từ Bus Pirate được nối với bảng Launchpad (Sử dụng cáp Sparkfun: Orange chuyển sang P1.6, Vàng đến P1.5. Điều này là chính xác, trừ khi tôi nhầm lẫn MOSI và MISO ...). Tôi không bị CS móc nối, vì tôi chỉ sử dụng cướp biển xe buýt để giám sát mọi thứ.
Cướp biển xe buýt được thiết lập cho SPI, 125KHz, Độ phân cực đồng hồ ở mức thấp, cạnh xung nhịp đầu ra Hoạt động ở chế độ chờ, giữa pha mẫu đầu vào, / CS, đầu ra là bình thường.
Trên Launchpad, tôi có MSP430G2231 không có tinh thể bên ngoài. Sử dụng Code Composer Studio, tôi có những điều sau đây:
#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);
}
Hầu hết điều này được ghép lại với nhau từ các mẫu khác nhau. Sau khi đọc nhiều bảng dữ liệu, có vẻ như đồng hồ USI được thiết lập để chạy ở mức 125KHz (SMCLK là 1 MHz, chia cho 8), mặc dù tôi không có phạm vi để đo lường điều này.
Khi chạy, tôi nhận được những gì cơ bản là rác từ cướp biển xe buýt. P đặt một điểm dừng trên dòng đầu tiên của vectơ ngắt USI và nó đã đi qua ba lần, vì vậy tôi đã nhận được 0, 1, 2 từ cướp biển xe buýt
0x00(0x00)0x00(0x00)][0x40(0x00)]
Và để nó tự do chạy, tôi chỉ nhận được những thứ như thế này:
[0xFF(0x00)][0x3F(0x00)][0x7F(0x00)][0xBF(0x00)][0xC0(0x00)0x00(0x00)][0x40(0x00)0x80(0x00)]
Mà trông vẫn không giống như những gì tôi mong đợi.
Tôi đã dành hầu hết các buổi tối để xem hướng dẫn sử dụng cho chip và tôi vẫn còn bối rối.
Trong khi viết bài này, tôi phát hiện ra rằng tôi có thể sử dụng Bus Pirate làm công cụ phân tích logic (sử dụng LogicSniffer) và thiết lập nó để làm như vậy. Và sửa đổi chương trình để viết 0x55 đến USISRL
, và thay đổi USIDIV
để USIDIV_4
cho mọi thứ chậm hơn một chút, và đây là kết quả:
Tín hiệu đồng hồ có vẻ tốt, LogicSniffer báo cáo rằng đó là khoảng 285KHz ... và MOSI là ... đặc biệt. Tôi sẽ mong đợi một mô hình xen kẽ đẹp, vì tôi đang viết 0x55, và đó là bất cứ điều gì nhưng.
Có ai có bất kỳ suy nghĩ về những gì tôi có thể làm sai? Con chip bị lỗi? Thứ gì khác?
EDIT: Ok, số lượng nhỏ của thành ngữ về phía tôi. Tôi đã không thay đổi giá trị được ghi vào SPI trong ngắt. Làm điều này dẫn đến mô hình dự kiến:
Tuy nhiên, quay trở lại để cố gắng viết ra một byte tăng dần khiến tôi trở thành rác:
Vì vậy, tôi vẫn có một vấn đề, chỉ là không lớn như tôi nghĩ ...
EDIT 2: Nhờ những bình luận bên dưới, tôi đã buộc dây nối đất khỏi cáp Bus Pirate, trước đây chưa được kết nối, để nối đất với nguồn cung cấp năng lượng của tôi (nguồn cung cấp năng lượng cho bảng mạch của Sparkfun). Trước đây, mặt đất gần nhất mà họ chia sẻ đã trở lại trong trung tâm USB Tôi đang treo tất cả các thiết bị này.
Điều này đã loại bỏ sự trục trặc trên MOSI khi chạy chương trình bộ đếm và LogicSniffer giờ đây có thể tự giải mã các byte chính xác:
Cướp biển xe buýt trong chế độ màn hình vẫn báo cáo kết quả kỳ lạ:
[0x00(0x00)][0x04(0x00)][0x06(0x00)][0x10(0x00)][0x10(0x00)][0x10(0x00)][0x12(0x00)][0x18(0x00)]
Có vẻ như có khả năng tốt hơn để phát hiện các đầu của ghi (Tôi giả sử đó là những gì dấu ngoặc vuông phân định), nhưng dữ liệu được giải mã vẫn bị tắt. Bây giờ tôi không hoàn toàn lo ngại rằng dạng sóng có vẻ tốt hơn, nhưng vẫn rất tốt để biết lý do tại sao Bus Pirate đang bị lẫn lộn.
while(1);
hoặc tương đương ở cuối main () để ngăn nó thoát ra và làm những thứ ngẫu nhiên.