Я намагаюся отримати розумні біти з шини-пірата, підключеної до плати запуску (за допомогою кабелю Sparkfun: помаранчевий переходить до P1.6, жовтий - до P1.5. Це має бути правильним, якщо я не плутаю MOSI і MISO ...). У мене немає підключеної CS, оскільки я просто використовую піратський автобус для будь-якого моніторингу.
Пірат шини встановлений для SPI, 125 кГц, полярність тактової частоти в режимі холостого ходу, вихідний край тактової частоти активний до холостого ходу, фаза середини вхідного зразка / CS, вихід нормальний.
На пусковій панелі у мене є 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 встановлений на 125 КГц (SMCLK 1 МГц, розділений на 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)]
Що все ще не схоже на те, що я очікую.
Я провів більшу частину вечора, переглядаючи посібник користувача для чіпа, і я все ще спотикаюся.
Пишучи це, я виявив, що можу використовувати шину піратів як логічний аналізатор (використовуючи LogicSniffer), і налаштував це на це. І змінив програму, щоб записати 0x55 на USISRL
та змінити на, USIDIV
щоб USIDIV_4
трохи пригальмувати, і ось результати:
Тактовий сигнал виглядає добре, LogicSniffer повідомляє, що це близько 285 КГц ... а MOSI - це ... особливий. Я б очікував приємного чергування візерунка, оскільки я виписую 0x55, і це все, але тільки.
У когось є думки щодо того, що я можу зробити неправильно? Дефектний чіп? Щось ще?
EDIT: Гаразд, незначна кількість ідіотизму з мого боку. Я не змінив значення, яке записується в SPI під час переривання. Виконання цього результату за очікуваною схемою:
Однак, повертаючись до спроби виписати байт, що збільшується, отримує мені сміття:
Отже, у мене все ще є проблема, не така вже велика, як я думав ...
EDIT 2: Завдяки коментарям нижче, я зв'язав провід заземлення від кабелю Bus Pirate, який раніше не був підключений, до заземлення від мого джерела живлення (блок живлення Sparkfun). Раніше найближчий майданчик, який вони поділилися, повернувся в USB-концентратор, на якому я вішаю все це обладнання.
Це усунуло збої в MOSI під час запуску лічильної програми, і LogicSniffer тепер може самостійно розшифрувати байти:
Пірат шини в режимі монітора все ще повідомляє про незвичайні результати:
[0x00(0x00)][0x04(0x00)][0x06(0x00)][0x10(0x00)][0x10(0x00)][0x10(0x00)][0x12(0x00)][0x18(0x00)]
Здається, краще виявити кінці запису (я припускаю, що це обмеження квадратних дужок), але дані декодування все ще вимкнено. Мені зараз не зовсім так стурбовано, що форма хвилі виглядає краще, але все одно було б добре знати, чому автобусний пірат заплутався.
while(1);
ані еквівалентного в кінці main (), щоб зупинити його вихід і робити випадкові речі.