¿Cómo calculo para obtener el tiempo correcto para SPI?

1

Tengo un problema con el envío de los registros HEX correctos a través de SPI a un dispositivo esclavo. Finalmente puedo ver mi problema al decodificar el SPI usando un alcance. Lo que veo es HEX aleatorio durante mi prueba. Sobre cada 3ra o 4ta prueba, se decodifica el HEX correcto. Estoy convencido de que este es un problema de reloj, pero no estoy seguro de cómo mirar el alcance para identificar qué baudios configuran el reloj SPI. Este es mi primer alcance y estoy aprendiendo a usarlo. ¿Hay algo que pueda ver en el alcance para resolver mi problema?

void SPI_Init(void)
{    
  SS_Slave1_High();
  SS_Slave2_HIGH();
  SS_Slave3_HIGH();

  GPIO_PinDirection(SCK_PIN,OUTPUT);
  GPIO_PinDirection(MOSI_PIN,OUTPUT);
  GPIO_PinDirection(MISO_PIN,INPUT);

  GPIO_PinDirection(SS_Slave1,OUTPUT);
  GPIO_PinDirection(SS_Slave2,OUTPUT);
  GPIO_PinDirection(SS_Slave3,OUTPUT);

  SPCR = (1<<SPE)|(1<<MSTR)|(0<<SPR1)|(0<<SPR0);
  SPSR = (0<<SPI2X);
}

///Main Routine
SS_Slave2_LOW();

SPI_Write(0xC0);  /// This is the HEX I should see on MOSI Decode

SS_Slave2_HIGH();
DELAY_ms(10);

La decodificación parece tener un patrón pero no está segura. Obtengo C1, C0, 80, C1, 80, C0. Nunca es consistente cuando ejecuto la prueba.

Mi esclavo es un controlador CAN MCP2515 pero creo que es irrelevante porque está en el MOSI. Corrígeme si estoy equivocado.

Amarillo: SCK Azul: MOSI Púrpura: SS

    
pregunta Eddie

1 respuesta

3

SPI por lo general le importa poco la velocidad del reloj (o jitter) siempre que la frecuencia del reloj no sea demasiado alta y se respete la otra temporización.

Sin embargo, necesitas obtener el modo SPI correcto. Hay cuatro modos posibles (la polaridad y la fase del reloj tienen dos opciones cada una).

    
respondido por el Spehro Pefhany

Lea otras preguntas en las etiquetas