SPI кажется искаженным на MSP430

9

Я пытаюсь извлечь разумные куски из 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 запутывается.

Мэтт Зикер
источник
3
Последняя диаграмма выглядит так, как будто на линии MOSI есть глюки, это может быть перекрестная помеха от clk. У тебя есть осциллограф? Какая у вас проводка - есть ли у вас хорошее прочное заземление между BusPirate и MSP430?
Мартин Томпсон
2
Я согласен с @MartinThompson. Линия MOSI дает сбой, и Bus Pirate запутывается. Если вы немного покоситесь на второе изображение и проигнорируете то, что, по его мнению, Bus Pirate видит (я просто набрал двоичный код, который я вижу в калькуляторе Windows, и преобразовал в шестнадцатеричный формат), вы получите 6B-6C-6D, увеличиваясь, как вы хотите. Вам нужно почистить проводку между Bus Pirate и MSP.
embedded.kyle
Я не вижу while(1);или эквивалент в конце main (), чтобы остановить его и делать случайные вещи.
Оли Глейзер
2
@OliGlaser, если я правильно читаю лист, переход к LPM0 фактически останавливает выполнение процессора до тех пор, пока не произойдет прерывание. Большинство, если не все образцы TI используют это. Это имеет смысл, так как они рекламируют MSP430 как части с низким энергопотреблением, а занятая петля не очень энергосберегающая.
Мэтт Зикер
1
О боже, я только что заметил, что это> 1 год.
Апалопохапа

Ответы:

3

MSP430 является примером MCU, который инвертирует соглашение об именах CPHA, таким образом, отклоняясь от стандартного описания SPI: TI MSP430 использует имя UCCKPL вместо CPOL, а его UCCKPH является обратным CPHA. При соединении двух чипов внимательно изучите значения инициализации фазы синхронизации, чтобы убедиться в правильности настроек.

Дирсеу Родригес-младший
источник