I wanted to use two SSI modules on my DK-TM4C129X board. The first SSI would act as a master and the second one as a slave.
First I've decided to init all of SSI modules to chek: which of them have all the outputs on BoosterPack pin headers for interconnection one module to another.
I setup all SSI with such code:
//SSI0 - TX
SysCtlPeripheralEnable(SYSCTL_PERIPH_SSI0);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
GPIOPinConfigure(GPIO_PA2_SSI0CLK);
GPIOPinConfigure(GPIO_PA3_SSI0FSS);
GPIOPinConfigure(GPIO_PA4_SSI0XDAT0);//GPIO_PA4_SSI0RX);
GPIOPinConfigure(GPIO_PA5_SSI0XDAT1);//GPIO_PA5_SSI0TX);
GPIOPinTypeSSI(GPIO_PORTA_BASE, GPIO_PIN_5 | GPIO_PIN_4 | GPIO_PIN_3 |
GPIO_PIN_2);
#if defined(TARGET_IS_TM4C129_RA0) || \
defined(TARGET_IS_TM4C129_RA1) || \
defined(TARGET_IS_TM4C129_RA2)
SSIConfigSetExpClk(SSI0_BASE, ui32SysClock, SSI_FRF_MOTO_MODE_0,
SSI_MODE_MASTER, 1000000, 8);
#else
SSIConfigSetExpClk(SSI0_BASE, SysCtlClockGet(), SSI_FRF_MOTO_MODE_0,
SSI_MODE_MASTER, 1000000, 8);
#endif
//
// Enable the SSI0 module.
//
SSIEnable(SSI0_BASE);
// SSI1 - TX
SysCtlPeripheralEnable(SYSCTL_PERIPH_SSI1);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOE);
GPIOPinConfigure(GPIO_PB5_SSI1CLK);
GPIOPinConfigure(GPIO_PB4_SSI1FSS);
GPIOPinConfigure(GPIO_PE4_SSI1XDAT0);//TX);
GPIOPinConfigure(GPIO_PE5_SSI1XDAT1);//RX);
GPIOPinTypeSSI(GPIO_PORTB_BASE, GPIO_PIN_4 | GPIO_PIN_5);
GPIOPinTypeSSI(GPIO_PORTE_BASE, GPIO_PIN_4 | GPIO_PIN_5);
#if defined(TARGET_IS_TM4C129_RA0) || \
defined(TARGET_IS_TM4C129_RA1) || \
defined(TARGET_IS_TM4C129_RA2)
SSIConfigSetExpClk(SSI1_BASE, ui32SysClock, SSI_FRF_MOTO_MODE_0,
SSI_MODE_MASTER, 1000000, 8);
#else
SSIConfigSetExpClk(SSI1_BASE, SysCtlClockGet(), SSI_FRF_MOTO_MODE_0,
SSI_MODE_SLAVE, 1000000, 8);
#endif
SSIEnable(SSI1_BASE);
// SSI2 - TX
SysCtlPeripheralEnable(SYSCTL_PERIPH_SSI2);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOG);
GPIOPinConfigure(GPIO_PD3_SSI2CLK);
GPIOPinConfigure(GPIO_PD2_SSI2FSS);
GPIOPinConfigure(GPIO_PD1_SSI2XDAT0); // RX
GPIOPinConfigure(GPIO_PD0_SSI2XDAT1); // RX
GPIOPinConfigure(GPIO_PG4_SSI2XDAT1); // TX
GPIOPinTypeSSI(GPIO_PORTD_BASE, GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3);
GPIOPinTypeSSI(GPIO_PORTG_BASE, GPIO_PIN_4);
#if defined(TARGET_IS_TM4C129_RA0) || \
defined(TARGET_IS_TM4C129_RA1) || \
defined(TARGET_IS_TM4C129_RA2)
SSIConfigSetExpClk(SSI2_BASE, ui32SysClock, SSI_FRF_MOTO_MODE_0,
SSI_MODE_MASTER, 1000000, 8);
#else
SSIConfigSetExpClk(SSI0_BASE, SysCtlClockGet(), SSI_FRF_MOTO_MODE_0,
SSI_MODE_MASTER, 1000000, 8);
#endif
SSIEnable(SSI2_BASE);
//SSI3 - TX
SysCtlPeripheralEnable(SYSCTL_PERIPH_SSI3);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOQ);
GPIOPinConfigure(GPIO_PF3_SSI3CLK);
GPIOPinConfigure(GPIO_PF2_SSI3FSS);
GPIOPinConfigure(GPIO_PF0_SSI3XDAT1);//TX);
GPIOPinConfigure(GPIO_PQ3_SSI3XDAT1);//TX);
GPIOPinConfigure(GPIO_PF1_SSI3XDAT0);//RX);
GPIOPinTypeSSI(GPIO_PORTF_BASE, GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3 );
GPIOPinTypeSSI(GPIO_PORTQ_BASE, GPIO_PIN_3 );
#if defined(TARGET_IS_TM4C129_RA0) || \
defined(TARGET_IS_TM4C129_RA1) || \
defined(TARGET_IS_TM4C129_RA2)
SSIConfigSetExpClk(SSI3_BASE, ui32SysClock, SSI_FRF_MOTO_MODE_0,
SSI_MODE_MASTER, 1000000, 8);
#else
SSIConfigSetExpClk(SSI1_BASE, SysCtlClockGet(), SSI_FRF_MOTO_MODE_0,
SSI_MODE_SLAVE, 1000000, 8);
#endif
SSIEnable(SSI3_BASE);
Further I just send some symbols thru each SSI in endless loop:
while(1){
// SSI0 - PA5. Send 3 bytes of data.
for(ui32Index = 0; ui32Index < NUM_SSI_DATA; ui32Index++)
{
SSIDataPut(SSI0_BASE, pui32DataTx[ui32Index]);
}
while(SSIBusy(SSI0_BASE)){}
// SSI1 - PE4. Send 3 bytes of data.
for(ui32Index = 0; ui32Index < NUM_SSI_DATA; ui32Index++)
{
SSIDataPut(SSI1_BASE, pui32DataTx[ui32Index]);
}
while(SSIBusy(SSI1_BASE)){}
// SSI2 - PD0/PG4. Send 3 bytes of data.
for(ui32Index = 0; ui32Index < NUM_SSI_DATA; ui32Index++)
{
SSIDataPut(SSI2_BASE, pui32DataTx[ui32Index]);
}
while(SSIBusy(SSI2_BASE)){}
// SSI3 - PF0/PQ3. Send 3 bytes of data.
for(ui32Index = 0; ui32Index < NUM_SSI_DATA; ui32Index++)
{
SSIDataPut(SSI3_BASE, pui32DataTx[ui32Index]);
}
while(SSIBusy(SSI3_BASE)){}
}
When I check SSI outputs with scope, I see the next activity:
SSI0 - PA5 - Activity is present
SSI1 - PE4 - Activity is present
SSI2 - PD0/PG4 - No activity
SSI3 - PF0/PQ3 - No activity
So the question is: How can I use SSI2 and SSI3 on my DK-TM4C129X board? What I've missed?