Я пытаюсь извлечь разумные куски из Bus Pirate, подключенного к плате Launchpad (с помощью кабеля Sparkfun: оранжевый переходит на P1.6, желтый на P1.5. Это должно быть правильно, если только не перепутаны MOSI и MISO ...). Я не подключил CS, так как просто использую пиратский автобус, чтобы что-то контролировать.
Пиратский сигнал шины настроен на SPI, 125 кГц, низкая полярность тактового сигнала, низкое значение тактового сигнала на выходе.
На панели запуска у меня 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), хотя у меня нет возможности это измерить.
При запуске я получаю то, что по сути является мусором из автобуса пирата. Р поставил точку останова в первой строке вектора прерывания 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 сообщает, что он составляет около 285 кГц ... и 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 Pirate запутывается.
while(1);
или эквивалент в конце main (), чтобы остановить его и делать случайные вещи.Ответы:
MSP430 является примером MCU, который инвертирует соглашение об именах CPHA, таким образом, отклоняясь от стандартного описания SPI: TI MSP430 использует имя UCCKPL вместо CPOL, а его UCCKPH является обратным CPHA. При соединении двух чипов внимательно изучите значения инициализации фазы синхронизации, чтобы убедиться в правильности настроек.
источник