error de 1 bit en SPI

3

Estoy intentando implementar la comunicación SPI en TM4C123. Tengo 1 placa e intento enviar datos desde SSI1 (maestro) a SSI0 (esclavo), pero observo que el valor recibido siempre se desplaza hacia la izquierda en 1 bit. por ejemplo, envío 0x01 en el maestro y recibo 0x02 en el esclavo ... y así sucesivamente. La configuración SPI que utilicé es:

  • sincronización de 8 MHz
  • CPOL y CPH son ceros en ambos módulos SPI
  • 8 bits para el campo de datos

¿Alguien puede sugerir una solución?

EDITAR: Aquí está el código '

void SSI0_Init (void);

void SSI1_Init (void);

int main () {     SSI1_Init ();     SSI0_Init ();     InitConsole ();

while(1){
// set ss low
GPIO_PORTD_DATA_R &= ~0x40 ;            // ss low
while ((SSI1_SR_R & 0x02) == 0 ){}      //wait till fifo not full
SSI1_DR_R = 0x01 ;                      // send char a
while (SSI1_SR_R & 0x10){}              // wait for TX complete
GPIO_PORTD_DATA_R |= 0x40 ;             // ss high

uint8_t data ;
while ((SSI0_SR_R & 0x04) == 0){}       // wait for not empty fifo flag
data = SSI0_DR_R ;                      // data reading


// set ss low
GPIO_PORTD_DATA_R &= ~0x40 ;            // ss low
while ((SSI1_SR_R & 0x02) == 0 ){}      //wait till fifo not full
SSI1_DR_R = 0x02 ;                      // send char a
while (SSI1_SR_R & 0x10){}              // wait for TX complete
GPIO_PORTD_DATA_R |= 0x40 ;             // ss high

while ((SSI0_SR_R & 0x04) == 0){}       // wait for not empty fifo flag
data = SSI0_DR_R ;                      // data reading


// set ss low
GPIO_PORTD_DATA_R &= ~0x40 ;            // ss low
while ((SSI1_SR_R & 0x02) == 0 ){}      //wait till fifo not full
SSI1_DR_R = 0x04 ;                      // send char a
while (SSI1_SR_R & 0x10){}              // wait for TX complete
GPIO_PORTD_DATA_R |= 0x40 ;             // ss high

while ((SSI0_SR_R & 0x04) == 0){}       // wait for not empty fifo flag
data = SSI0_DR_R ;                      // data reading

int dummy = data ;

}

}

void SSI0_Init (void) {

// settings for TX, RX, SS, CLK in GPIO PORTA
SYSCTL_RCGCGPIO_R |= 0x01 ;     // clock on PORTA
SYSCTL_RCGCSSI_R |= 0x01 ;      // clock on SSI0 module
GPIO_PORTA_AFSEL_R |= 0x1c ;    // alt. function for PORTA 2, 3, 4, 5
GPIO_PORTA_PCTL_R &= ~0x000fff00 ;
GPIO_PORTA_PCTL_R |= 0x00022200;
GPIO_PORTA_DEN_R |= 0x1c ;      // digital enable

// settings of SSI0 module
SSI0_CR1_R = 0 ;                // disable during configuration
SSI0_CC_R = 0 ;                 // system clock
//SSI0_CPSR_R = 2 ;               // prescaler div by 2
SSI0_CR0_R = 0x07 ;             // 8MHZ, SPI mode, 8 bit frame, 2nd edge capture
SSI0_CR1_R |= 0x04 ;            // set as a slave
SSI0_CR1_R |= 0x02 ;            // enable

}

void SSI1_Init (void) {

// settings for TX, RX, SS, CLK in GPIO PORTA

SYSCTL_RCGCGPIO_R |= 0x08 ;     // clock on PORTD
SYSCTL_RCGCSSI_R |= 0x02 ;      // clock on SSI1 module
GPIO_PORTD_AFSEL_R |= 0x09 ;    // alt. function for PORTD 0,3
GPIO_PORTD_PCTL_R &= ~0x0f00f ;
GPIO_PORTD_PCTL_R |= 0x02002;
GPIO_PORTD_DEN_R |= 0x09 ;      // digital enable

// settings for PD6 as SS signal
GPIO_PORTD_DIR_R |= 0x40 ;      // PD6 output
GPIO_PORTD_DEN_R |= 0x40 ;      // digital enable PD6
GPIO_PORTD_DATA_R |= 0x40 ;     // keep SS idle high

// settings of SSI1 module
SSI1_CR1_R = 0 ;                // disable during configuration
SSI1_CC_R = 0 ;                 // system clock
SSI1_CPSR_R = 2 ;               // prescaler div by 2
SSI1_CR0_R |= 0x07 ;            // 8MHZ, SPI mode, 8 bit frame
SSI1_CR1_R = 0x00 ;             // set as a master
SSI1_CR1_R |= 0x02 ;            // enable

}

'

    
pregunta Sarea Hariri

2 respuestas

3

"Desplazado en un bit" es el síntoma común de SPI cuando se utiliza la configuración incorrecta del reloj. O bien el maestro y el esclavo no están de acuerdo sobre qué datos de borde de reloj se transfieren, o está comenzando con la polaridad incorrecta desde inactivo.

Lo primero y obvio es transferir un byte de prueba conocido y observar la selección de chips, el reloj y las líneas de datos resultantes con un alcance. Ahora compare eso con lo que el dispositivo esclavo dice que necesita, y probablemente encontrará una discrepancia.

Desafortunadamente, las cuatro combinaciones posibles de SPI clock polarity inactivo y polaridad de borde activa están ahí fuera. Debe leer cuidadosamente lo que necesita su esclavo, luego leer cuidadosamente la hoja de datos del maestro para ver cómo lograrlo.

    
respondido por el Olin Lathrop
0

No ha proporcionado suficiente información para estar seguro, pero sospecho que ha leído mal la hoja de datos de su pieza. Según su descripción, el esclavo está escuchando datos "un bit retrasados" del maestro (no estoy seguro de cómo decir eso). Lo más probable es que su código sea de bits de tiempo para que el esclavo comience a escuchar cuando el maestro envía el bit segundo (suponiendo que el orden es el bit más significativo primero).

Qué hacer a continuación:

Publica tu código.

Ejecutar más pruebas. Vea qué sucede si envía 0b10000000: ¿obtiene 0?

Bajar la velocidad del autobús es tan fácil de hacer que probablemente vale la pena intentarlo, pero sinceramente dudo que haga algo.

    
respondido por el dpdt

Lea otras preguntas en las etiquetas