O SPI parece distorcido no MSP430

9

Estou tentando extrair bits sensíveis de um Bus Pirate conectado a uma placa do Launchpad (usando o cabo Sparkfun: laranja passa para P1.6, amarelo para P1.5. Isso deve estar correto, a menos que eu tenha MOSI e MISO confusos ...) Não tenho CS conectado, já que estou usando o pirata de ônibus para monitorar qualquer coisa.

O pirata do barramento está configurado para SPI, 125KHz, polaridade do relógio ocioso baixo, borda do relógio de saída Ativo para ocioso, fase de amostra de entrada média, / CS, saída normal.

No Launchpad, tenho um MSP430G2231 sem cristal externo. Usando o Code Composer Studio, tenho o seguinte:

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

A maior parte disso é feita a partir de várias amostras. Após muita leitura da folha de dados, parece que o relógio USI está configurado para funcionar em 125KHz (SMCLK de 1MHz, dividido por 8), embora eu não tenha um escopo para medir isso.

Ao correr, recebo o que é essencialmente lixo do pirata de ônibus. P colocou um ponto de interrupção na primeira linha do vetor de interrupção USI e passou por três vezes, então eu deveria ter obtido 0, 1, 2 do pirata de ônibus

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

E, deixando-o correr livremente, recebo coisas assim:

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

O que ainda não se parece em nada com o que estou esperando.

Passei a maior parte da noite examinando o guia do usuário do chip e ainda estou perplexo.

Ao escrever isso, descobri que posso usar o Bus Pirate como um analisador lógico (usando o LogicSniffer) e o configurei para fazê-lo. E modificou o programa para escrever 0x55 USISRLe altere USIDIVpara USIDIV_4para tornar as coisas mais lentas, e aqui estão os resultados: insira a descrição da imagem aqui

O sinal do relógio parece bom, o LogicSniffer relata que é de cerca de 285KHz ... e o MOSI é ... especial. Eu esperaria um bom padrão alternado, já que estou escrevendo 0x55, e isso é tudo.

Alguém tem alguma opinião sobre o que eu posso estar fazendo de errado? Chip defeituoso? Algo mais?

EDIT: Ok, menor quantidade de idiotice da minha parte. Não alterei o valor que é gravado no SPI na interrupção. Isso resulta no padrão esperado:

insira a descrição da imagem aqui

No entanto, voltar à tentativa de escrever um byte de incremento me deixa com lixo: insira a descrição da imagem aqui

Então, eu ainda tenho um problema, apenas não tão grande quanto eu pensava ...

EDIÇÃO 2: Graças aos comentários abaixo, amarrei o fio terra do cabo Bus Pirate, que antes estava desconectado, ao terra da minha fonte de alimentação (fonte de alimentação da placa de ensaio da Sparkfun). Anteriormente, o terreno mais próximo que eles compartilhavam estava de volta no hub USB em que estou pendurando todo esse equipamento.

Isso removeu a falha no MOSI ao executar o programa do contador, e o LogicSniffer agora pode decodificar os bytes corretamente por conta própria: insira a descrição da imagem aqui

O pirata de barramento no modo monitor ainda informa resultados estranhos:

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

Parece mais capaz de detectar o final das gravações (suponho que seja o que os colchetes delimitam), mas os dados decodificados ainda estão desativados. Não estou tão preocupado agora que a forma de onda parece melhor, mas ainda assim seria bom saber por que o Bus Pirate está ficando confuso.

Matt Sieker
fonte
3
Esse último diagrama parece ter falhas na linha MOSI, poderia estar na crosstalk do clk. Você é um osciloscópio? Como é sua fiação - você tem um bom terreno curto e sólido entre o BusPirate e o MSP430?
Martin Thompson
2
Eu concordo com @MartinThompson. A linha MOSI está com falhas e o Bus Pirate está ficando confuso. Se você olhar um pouco para a segunda foto e ignorar o que o Bus Pirate acha que vê (eu apenas digitei o binário que vejo na calculadora do Windows e converti em hex), você obtém 6B-6C-6D, incrementando como quiser. Você precisa limpar a fiação entre o Bus Pirate e o MSP.
embedded.kyle
Não vejo um while(1);equivalente no final de main () para impedi-lo de sair e fazer coisas aleatórias.
11288 Oli Glaser
2
@OliGlaser, se estou lendo a planilha corretamente, entrar no LPM0 na verdade interrompe a execução da CPU até que ocorra uma interrupção. A maioria, se não todas as amostras da TI, usam isso. Faz sentido, uma vez que consideram os MSP430s peças de baixa potência, e um ciclo ocupado não é muito favorável em termos de energia.
228128 Matt Sieker
11
Oh meu Deus, eu acabei de notar que tem mais de 1 ano de idade.
Apalopohapa

Respostas:

3

MSP430 é um exemplo de MCU que inverte a convenção de nomenclatura CPHA, divergindo da descrição padrão do SPI: TI MSP430 usa o nome UCCKPL em vez de CPOL, e seu UCCKPH é o inverso de CPHA. Ao conectar dois chips, examine cuidadosamente os valores de inicialização da fase de clock para garantir o uso das configurações corretas.

Dirceu Rodrigues Jr
fonte