I am using the following simple code to test master slave mode on SSI0 and SSI1 on TM4C123GH6PM. When I debug, I see that the SSIDataPut function does not modify the SSI_DR register for the SSI0 module, until the 8th call where it sets it to 1111111111111111. I don't understand why this is happening. I'm new to TIVA and I got this code from sample code snippets on the web, the workbook and the TIVAWARE documentation. Thank you in advance for the technical support.
#include <stdint.h> #include <stdbool.h> #include "inc/hw_memmap.h" #include "inc/hw_ssi.h" #include "inc/hw_types.h" #include "driverlib/ssi.h" #include "driverlib/gpio.h" #include "driverlib/pin_map.h" #include "driverlib/sysctl.h" int main(void) { //set the system clock from the main oscillator which drives the 400MHz PLL, //there is a default divide by 2 in the clock path //System clock is set to 40 MHz SysCtlClockSet(SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN | SYSCTL_XTAL_16MHZ); //Enable the SSI0 module, connect to power and system clock SysCtlPeripheralEnable(SYSCTL_PERIPH_SSI0); SysCtlPeripheralEnable(SYSCTL_PERIPH_SSI1); //Enable the GPIO A ports for SSI0 SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA); //Enable the GPIO D ports for SSI1 SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD); //Configure GPIO pin A2 to be the SSI0 clock port //Write the requested pin muxing value GPIOPinConfigure(GPIO_PA2_SSI0CLK); GPIOPinConfigure(GPIO_PD0_SSI1CLK); //Configure the GPIO pin A3 to be the SSI0 FSS port (acts as slave select) //Write the requested pin muxing value GPIOPinConfigure(GPIO_PA3_SSI0FSS); GPIOPinConfigure(GPIO_PD1_SSI1FSS); //Configure the GPIO pin A5 to be the SSI0 TX pin //Write the requested pin muxing value GPIOPinConfigure(GPIO_PA5_SSI0TX); GPIOPinConfigure(GPIO_PD2_SSI1RX); //configure the GPIO port A as SSI ports //first checks if base port is valid for SSI //then sets them to be peripheral driven //sets the push pull properties GPIOPinTypeSSI(GPIO_PORTA_BASE, GPIO_PIN_5|GPIO_PIN_3|GPIO_PIN_2); GPIOPinTypeSSI(GPIO_PORTD_BASE, GPIO_PIN_2|GPIO_PIN_1|GPIO_PIN_0); //Configures the synchronous serial interface. //SSI module base address, system clock driving SSI module, protocol, master or slave mode, bit rate, frame width(4-16) //Protocol in this case is Motorala frame with polarity 0 and phase 0, //this is an SPI configuration, refer to software documentation and datasheet //Rules to set bit rate: //FSSI >= 2 ∗ bit rate (master mode) //FSSI >= 12 ∗ bit rate (slave modes) SSIConfigSetExpClk(SSI0_BASE, SysCtlClockGet(), SSI_FRF_MOTO_MODE_1, SSI_MODE_MASTER, 8000, 16); SSIConfigSetExpClk(SSI1_BASE, SysCtlClockGet(), SSI_FRF_MOTO_MODE_1, SSI_MODE_SLAVE, 8000, 16); //Start the SSI interface SSIEnable(SSI1_BASE); SSIEnable(SSI0_BASE); //enable interrupts SSIIntEnable(SSI0_BASE, SSI_RXFF | SSI_RXTO | SSI_RXOR ); SSIIntEnable(SSI1_BASE, SSI_RXFF | SSI_RXTO | SSI_RXOR ); unsigned long number = 40000000; uint32_t data_var; while(1){ //places data on transmit FIFO, if FIFO is full, waits until empty space available before returning SSIDataPut(SSI0_BASE, number); while(SSIBusy(SSI0_BASE)) { } //provides a delay by executing a 3-instruction cycle repeatedly //input is the number of delay loops to perform //not a real time delay //SysCtlDelay(2000000); //waits until data is received before returning! //SSIDataGet(SSI1_BASE, &data_var); SSIDataGetNonBlocking(SSI1_BASE, &data_var); //SysCtlDelay(2000000); number++; } }