Other Parts Discussed in Thread: EK-TM4C1294XL, TM4C1294NCPDT
Hi !
I am developing a SPI communication between two peripherals in the same Launchpad (EK-TM4C1294XL).
The idea is that both the Master and the Slave can send and receive information. My code is quite simple until now with only one sending and the other one receiving.
#include <stdbool.h>
#include <stdint.h>
#include "inc/hw_memmap.h"
#include "driverlib/gpio.h"
#include "driverlib/pin_map.h"
#include "driverlib/ssi.h"
#include "driverlib/sysctl.h"
#include "driverlib/uart.h"
#include "utils/uartstdio.h"
#include "inc/hw_ints.h"
#include "driverlib/interrupt.h"
#define NUM_SSI_DATA 8
uint32_t ui32SysClkFreq;
uint32_t pui32DataTx[NUM_SSI_DATA];
uint32_t pui32DataRx[NUM_SSI_DATA];
uint32_t ui32Index = 0;
void SSI1IntHandler(void){
SSIIntClear(SSI1_BASE, SSI_RXFF);
SSIDataGet(SSI1_BASE, &pui32DataRx[ui32Index]);
UARTprintf("Recebendo: '%c' \n", pui32DataRx[ui32Index]);
SSIDataGet(SSI1_BASE, &pui32DataRx[ui32Index+1]);
UARTprintf("Recebendo: '%c' \n", pui32DataRx[ui32Index+1]);
SSIDataGet(SSI1_BASE, &pui32DataRx[ui32Index+2]);
UARTprintf("Recebendo: '%c' \n", pui32DataRx[ui32Index+2]);
SSIDataGet(SSI1_BASE, &pui32DataRx[ui32Index+3]);
UARTprintf("Recebendo: '%c' \n", pui32DataRx[ui32Index+3]);
}
int main(void) {
/****************UART Configuration*****************/
ui32SysClkFreq = SysCtlClockFreqSet((SYSCTL_XTAL_25MHZ | SYSCTL_OSC_MAIN | SYSCTL_USE_PLL | SYSCTL_CFG_VCO_480), 120000000);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0);
GPIOPinTypeGPIOOutput(GPIO_PORTA_BASE, GPIO_PIN_1);
GPIOPinConfigure(GPIO_PA0_U0RX);
GPIOPinConfigure(GPIO_PA1_U0TX);
GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1);
UARTStdioConfig(0, 115200, ui32SysClkFreq);
/**********************SSI**********************/
// SSI1 -> MASTER ; SSI0 -> SLAVE
SysCtlPeripheralEnable(SYSCTL_PERIPH_SSI0);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
SysCtlPeripheralEnable(SYSCTL_PERIPH_SSI1);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOE);
GPIOPinConfigure(GPIO_PA2_SSI0CLK);
GPIOPinConfigure(GPIO_PA3_SSI0FSS);
GPIOPinConfigure(GPIO_PA4_SSI0XDAT0);
GPIOPinConfigure(GPIO_PA5_SSI0XDAT1);
GPIOPinConfigure(GPIO_PB5_SSI1CLK);
GPIOPinConfigure(GPIO_PB4_SSI1FSS);
GPIOPinConfigure(GPIO_PE4_SSI1XDAT0);
GPIOPinConfigure(GPIO_PE5_SSI1XDAT1);
GPIOPinTypeSSI(GPIO_PORTA_BASE, GPIO_PIN_5 | GPIO_PIN_4 | GPIO_PIN_3 |
GPIO_PIN_2);
GPIOPinTypeSSI(GPIO_PORTB_BASE, GPIO_PIN_5 | GPIO_PIN_4);
GPIOPinTypeSSI(GPIO_PORTE_BASE, GPIO_PIN_4 | GPIO_PIN_5);
SSIConfigSetExpClk(SSI1_BASE, ui32SysClkFreq, SSI_FRF_MOTO_MODE_0,
SSI_MODE_MASTER, 2000000, 8);
SSIConfigSetExpClk(SSI0_BASE, ui32SysClkFreq, SSI_FRF_MOTO_MODE_0,
SSI_MODE_SLAVE, 2000000, 8);
SSIEnable(SSI0_BASE);
SSIEnable(SSI1_BASE);
pui32DataTx[0] = 'a';
pui32DataTx[1] = 'b';
pui32DataTx[2] = 'c';
pui32DataTx[3] = 'd';
pui32DataTx[4] = 'e';
pui32DataTx[5] = 'f';
pui32DataTx[6] = 'g';
pui32DataTx[7] = 'h';
IntMasterEnable();
SSIIntEnable(SSI1_BASE, SSI_RXFF);
IntEnable(INT_SSI1);
while(ui32Index<8){
UARTprintf("Enviando: '%c' \n", pui32DataTx[ui32Index]);
SSIDataPut(SSI0_BASE, pui32DataTx[ui32Index]);
ui32Index++;
}
return 0;
}
This way, the interrupt never happens as if there is nothing to receive in the FIFO. When I change the MASTER and the SLAVE (lines below) making the MASTER send and the SLAVE receive, it works perfectly.
SSIConfigSetExpClk(SSI1_BASE, ui32SysClkFreq, SSI_FRF_MOTO_MODE_0,
SSI_MODE_SLAVE, 2000000, 8);
SSIConfigSetExpClk(SSI0_BASE, ui32SysClkFreq, SSI_FRF_MOTO_MODE_0,
SSI_MODE_MASTER, 2000000, 8);
Is there any other configuration that I have to do to make SLAVE send some data ?