Estoy tratando de conseguir sensible bits de un Bus Pirata conectado a un Launchpad de la junta (el Uso de la Sparkfun cable: Orange va a P1.6, de color Amarillo a P1.5. Esta debe ser la correcta, a menos que yo haya MOSI y MISO confundido...). No tengo CS conectado, ya que estoy usando el bus pirate para controlar nada.
El bus pirate está configurado para SPI, 125KHz, Reloj polaridad de Ralentí baja, salida de reloj de borde de Activo a inactivo, muestra de entrada en la fase intermedia, a /c, la salida es normal.
En el Launchpad, tengo un MSP430G2231 con ningún externa del cristal. El uso de Código Composer Studio, tengo lo siguiente:
#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);
}
La mayoría de esto es que improvisaba a partir de las diferentes muestras. Después de mucha lectura de la hoja de datos, parece que la USI reloj está configurado para ejecutarse en 125KHz (SMCLK de 1MHz, dividido por 8), aunque no tengo un ámbito para medir esto.
Cuando se ejecuta, me pongo lo que es esencialmente la basura fuera del bus pirata. P poner un breakpoint en la primera línea de la USI vector de interrupción, y había que ir a través de tres veces, por lo que debería haber recibido 0, 1, 2 en el bus pirate
0x00(0x00)0x00(0x00)][0x40(0x00)]
Y dejarla libre, acabo de conseguir cosas como esta:
[0xFF(0x00)][0x3F(0x00)][0x7F(0x00)][0xBF(0x00)][0xC0(0x00)0x00(0x00)][0x40(0x00)0x80(0x00)]
Que todavía se parece en nada a lo que estoy esperando.
He pasado la mayor parte de la noche va a través de la guía de usuarios para el chip, y todavía estoy perplejo.
Mientras escribía esto, he descubierto que puedo usar el Bus Pirata, como un analizador lógico (utilizando LogicSniffer), y configurarlo para hacerlo. Y modificado el programa para escribir 0x55 a USISRL
, y cambiar el USIDIV
a USIDIV_4
a ralentizar las cosas un poco más, y he aquí los resultados:
La señal de reloj se ve bien, LogicSniffer informes de que se trata de 285KHz... y MOSI es... especial. Yo esperaría un buen modelo de alternancia, ya que estoy escribiendo 0x55, y eso, pero nada.
Alguno tiene alguna idea sobre lo que podría estar haciendo mal? Defectuoso chip? Algo más?
EDITAR: Ok, menor cantidad de idiotez de mi parte. Yo no cambio el valor que se escriben en el SPI en la interrupción. Haciendo esto se traduce en el patrón esperado:
Sin embargo, volviendo a intentar escribir un incremento de byte me pone la basura:
Así, todavía tengo un problema, solo que no tan grande como pensé...
EDIT 2: Gracias a los comentarios de abajo, me até el cable de tierra fuera del Bus Pirate cable, el cual fue previamente desconectados, a la tierra fuera de mi fuente de alimentación (Sparkfun de tablero de la fuente de alimentación). Previamente, el más cercano a la tierra ellos compartidos estaba de vuelta en el concentrador USB voy a colgar todo este equipo.
Esto eliminó las fallas en MOSI cuando se ejecuta el contador de programa, y LogicSniffer ahora puede decodificar los bytes correctamente en su propio:
El bus pirate en el modo de monitor de informes todavía extraño resultados:
[0x00(0x00)][0x04(0x00)][0x06(0x00)][0x10(0x00)][0x10(0x00)][0x10(0x00)][0x12(0x00)][0x18(0x00)]
Parece más capaz de detectar los extremos de las escrituras (estoy asumiendo que es lo de los corchetes delimitar), pero los datos se decodifica sigue apagado. No estoy tan preocupado ahora que la forma de onda se ve mejor, pero también sería interesante saber por qué el Bus Pirate es caer en la confusión.