SPI ดูเหมือนอ่านไม่ออกบน MSP430


9

ฉันกำลังพยายามดึงบิตที่เหมาะสมออกจาก Bus Pirate ติดกับบอร์ด Launchpad (การใช้สาย Sparkfun: สีส้มไปที่ P1.6, สีเหลืองถึง P1.5 สิ่งนี้ควรถูกต้องเว้นแต่ฉันจะสับสนกับ MOSI และ MISO ... ) ฉันไม่มี CS ติดยาเสพติดเนื่องจากฉันเพิ่งใช้โจรสลัดรถบัสเพื่อตรวจสอบอะไร

โจรสลัดบัสถูกตั้งค่าไว้สำหรับ SPI, 125KHz, ขั้วสัญญาณนาฬิกาไม่ได้ใช้งานต่ำ, ขอบนาฬิกาเอาต์พุตใช้งานไม่ได้ทำงาน, เฟสอินพุตตัวอย่างตรงกลาง, / CS, เอาต์พุตปกติ

บน Launchpad ฉันมี MSP430G2231 ที่ไม่มีคริสตัลภายนอก การใช้ Code Composer Studio ฉันมีดังต่อไปนี้:

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

สิ่งเหล่านี้ส่วนใหญ่ถูกปูด้วยกันจากตัวอย่างที่หลากหลาย หลังจากอ่านเอกสารข้อมูลจำนวนมากดูเหมือนว่านาฬิกา USI ถูกตั้งค่าให้ทำงานที่ 125KHz (SMCLK 1MHz หารด้วย 8) แม้ว่าฉันจะไม่มีขอบเขตในการวัดสิ่งนี้

เมื่อทำงานฉันจะได้รับสิ่งที่เป็นหลักขยะออกจากโจรสลัดรถบัส P ใส่เบรกพอยต์บนบรรทัดแรกของเวกเตอร์ขัดจังหวะ USI และให้ผ่านสามครั้งดังนั้นฉันควรได้ 0, 1, 2 จากโจรสลัดรถบัส

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

และเพื่อให้มันทำงานฟรีฉันเพิ่งได้รับสิ่งนี้:

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

ซึ่งยังคงดูเหมือนอะไรที่ฉันคาดหวัง

ฉันใช้เวลาส่วนใหญ่ไปกับคู่มือผู้ใช้สำหรับชิปและฉันก็ยังนิ่งงัน

ขณะที่เขียนสิ่งนี้ฉันค้นพบว่าฉันสามารถใช้ Bus Pirate เป็นเครื่องมือวิเคราะห์ตรรกะ (โดยใช้ LogicSniffer) และตั้งค่าให้ทำเช่นนั้น และปรับเปลี่ยนโปรแกรมให้เขียน 0x55 USISRLและเปลี่ยนUSIDIVไปUSIDIV_4เป็นชะลอสิ่งต่าง ๆ อีกเล็กน้อยและนี่คือผลลัพธ์: ป้อนคำอธิบายรูปภาพที่นี่

สัญญาณนาฬิกาดูดี LogicSniffer รายงานว่าประมาณ 285KHz ... และ MOSI นั้นพิเศษ ... ฉันคาดหวังรูปแบบการสลับที่ดีเนื่องจากฉันเขียน 0x55 และนั่นคืออะไร แต่

มีใครมีความคิดเกี่ยวกับสิ่งที่ฉันอาจทำผิด? ชิปที่ชำรุด อื่น ๆ อีก?

แก้ไข: ตกลงจำนวนเล็กน้อยของความโง่ในส่วนของฉัน ฉันไม่ได้เปลี่ยนค่าที่ถูกเขียนไปยัง SPI ในการขัดจังหวะ การทำสิ่งนี้ให้ผลลัพธ์ในรูปแบบที่คาดไว้:

ป้อนคำอธิบายรูปภาพที่นี่

อย่างไรก็ตามการกลับไปที่การพยายามเขียนไบต์ที่เพิ่มขึ้นทำให้ฉันขยะ: ป้อนคำอธิบายรูปภาพที่นี่

ดังนั้นฉันยังคงมีปัญหาไม่ใหญ่เท่าที่ฉันคิด ...

แก้ไข 2: จากความคิดเห็นด้านล่างฉันผูกสายกราวนด์ออกจากสายเคเบิล Bus Pirate ซึ่งไม่ได้เชื่อมต่อไว้ก่อนหน้านี้กับสายดินจากแหล่งจ่ายไฟของฉัน (แหล่งจ่ายไฟเขียงหั่นขนมของ Sparkfun) ก่อนหน้านี้สิ่งที่ใกล้เคียงที่สุดที่พวกเขาแบ่งปันกลับไปอยู่ในฮับ USB ฉันกำลังห้อยอุปกรณ์ทั้งหมดนี้ออก

สิ่งนี้จะลบความผิดพลาดบน MOSI เมื่อรันโปรแกรมตัวนับและ LogicSniffer สามารถถอดรหัสไบต์อย่างถูกต้องด้วยตัวเอง: ป้อนคำอธิบายรูปภาพที่นี่

โจรสลัดบัสในโหมดมอนิเตอร์ยังคงรายงานผลลัพธ์ที่ผิดปกติ:

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

ดูเหมือนจะสามารถตรวจจับจุดสิ้นสุดของการเขียนได้ดีกว่า (ฉันสมมติว่านั่นคือสิ่งที่วงเล็บเหลี่ยมกำหนดขอบเขต) แต่ข้อมูลถอดรหัสยังคงปิดอยู่ ตอนนี้ฉันไม่ค่อยกังวลเท่าไหร่ว่ารูปคลื่นจะดูดีขึ้น แต่ก็ยังดีที่รู้ว่าทำไม Bus Bus จึงสับสน


3
แผนภาพสุดท้ายนั้นดูเหมือนว่ามันมีความผิดพลาดในบรรทัด MOSI อาจเป็นสัญญาณไขว้จาก clk คุณเป็นออสซิลโลสโคปหรือไม่? คุณชอบการเดินสายอะไร - คุณมีพื้นสั้นที่มั่นคงระหว่าง BusPirate และ MSP430 หรือไม่?
Martin Thompson

2
ฉันเห็นด้วยกับ @MartinThompson สาย MOSI กำลังกะพริบและ Bus Pirate กำลังสับสน ถ้าคุณมองไปที่ภาพที่สองแล้วมองข้ามสิ่งที่ Bus Pirate คิดว่าเห็น (ฉันเพิ่งพิมพ์ไบนารีที่ฉันเห็นในเครื่องคิดเลข Windows และแปลงเป็นเลขฐานสิบหก) คุณจะได้ 6B-6C-6D เพิ่มขึ้นตามที่คุณต้องการ คุณต้องทำความสะอาดสายไฟระหว่าง Bus Pirate และ MSP
embedded.kyle

ฉันไม่เห็นwhile(1);หรือเทียบเท่าในตอนท้ายของ main () เพื่อหยุดการออกและทำสิ่งที่สุ่ม
Oli Glaser

2
@OliGlaser ถ้าฉันอ่านแผ่นงานที่ถูกต้องไปที่ LPM0 จะหยุดการทำงานของ CPU จนกว่าจะเกิดการขัดจังหวะ ส่วนใหญ่หากไม่ใช่ตัวอย่างทั้งหมดของ TI ก็ใช้สิ่งนี้ มันสมเหตุสมผลแล้วเนื่องจากพวกเขาขนานนาม MSP430s เป็นชิ้นส่วนที่ใช้พลังงานต่ำและการวนรอบที่ยุ่งไม่เป็นมิตรกับพลังงาน
Matt Sieker

1
โอ้ฉันเพิ่งสังเกตเห็นว่า> 1 ปี
apalopohapa

คำตอบ:


3

MSP430 เป็นตัวอย่างของ MCU ที่คว่ำรูปแบบการตั้งชื่อ CPHA ดังนั้นจึงแยกจากคำอธิบาย SPI มาตรฐาน: TI MSP430 ใช้ชื่อ UCCKPL แทน CPOL และ UCCKPH เป็นค่าผกผันของ CPHA เมื่อเชื่อมต่อชิปทั้งสองเข้าด้วยกันให้ตรวจสอบค่าเริ่มต้นเฟสของนาฬิกาอย่างละเอียดเพื่อให้แน่ใจว่าใช้การตั้งค่าที่ถูกต้อง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.