ฉันกำลังพยายามดึงบิตที่เหมาะสมออกจาก 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 จึงสับสน
while(1);
หรือเทียบเท่าในตอนท้ายของ main () เพื่อหยุดการออกและทำสิ่งที่สุ่ม