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
}
'