SPI dường như bị cắt xén trên MSP430


9

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_4cho mọi thứ chậm hơn một chút, và đây là kết quả: nhập mô tả hình ảnh ở đây

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:

nhập mô tả hình ảnh ở đây

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: nhập mô tả hình ảnh ở đây

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: nhập mô tả hình ảnh ở đây

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.


3
Sơ đồ cuối cùng đó trông giống như nó có trục trặc trên dòng MOSI, có thể là nhiễu xuyên âm từ clk. Bạn có một máy hiện sóng? Bạn thích hệ thống dây điện như thế nào - bạn có điểm nối ngắn tốt giữa BusPirate và MSP430 không?
Martin Thompson

2
Tôi đồng ý với @MartinThndry. Dòng MOSI bị trục trặc và Bus Pirate đang bị lẫn lộn. Nếu bạn nheo mắt một chút ở bức ảnh thứ hai và bỏ qua những gì Bus Pirate nghĩ nó nhìn thấy (tôi vừa gõ nhị phân tôi thấy vào máy tính Windows và chuyển đổi thành hex), bạn nhận được 6B-6C-6D, tăng dần như bạn muốn. Bạn cần dọn sạch hệ thống dây điện giữa Bus Pirate và MSP.
embedded.kyle

Tôi không thấy một 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.
Oli Glaser

2
@OliGlaser, nếu tôi đọc đúng trang tính, đi vào LPM0 thực sự tạm dừng thực thi CPU cho đến khi xảy ra gián đoạn. Hầu hết, nếu không phải tất cả các mẫu của TI đều sử dụng điều này. Điều này có ý nghĩa, vì họ gọi MSP430 là bộ phận năng lượng thấp và vòng lặp bận rộn không thân thiện với sức mạnh.
Matt Sieker

1
Ôi trời, tôi mới nhận ra đây là> 1 tuổi.
apalopohapa

Câu trả lời:


3

MSP430 là một ví dụ MCU tha đảo ngược quy ước đặt tên CPHA, do đó chuyển hướng từ mô tả SPI tiêu chuẩn: TI MSP430 sử dụng tên UCCKPL thay vì CPOL và UCCKPH của nó là nghịch đảo của CPHA. Khi kết nối hai chip với nhau, hãy kiểm tra cẩn thận các giá trị khởi tạo pha đồng hồ để chắc chắn sử dụng đúng cài đặt.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.