Part Number: TM4C123GH6PM
Tool/software:
I am trying to solve communication between spi master(RPI) and TM4C123GH6PM(slave). Master sends 4 bytes in total and i am able to check it via logic analyzer. The slave always gets just the first byte and then nothing. I tried DMA with same result. I am using c++ and constructor and interrupt handler are like this:
Spi::Spi(void) {
// konfigurace příslušných pinů rpo SPI
ROM_GPIOPinConfigure(GPIO_PA2_SSI0CLK);
ROM_GPIOPinConfigure(GPIO_PA3_SSI0FSS);
ROM_GPIOPinConfigure(GPIO_PA4_SSI0RX);
ROM_GPIOPinConfigure(GPIO_PA5_SSI0TX);
ROM_GPIOPinTypeSSI(PEG_PLATFORM_SPI_PORT_BASE,
PEG_PLATFORM_SPI_SCLK_PIN_MSK |
PEG_PLATFORM_SPI_FSS_PIN_MSK |
PEG_PLATFORM_SPI_MISO_PIN_MSK |
PEG_PLATFORM_SPI_MOSI_PIN_MSK);
// konfigurace rychlosti SPI
// - POL = 0, PHA = 0 : SSI_FRF_MOTO_MODE_0
// - slave
// - 100000 kHz
// - 8 bit
ROM_SSIConfigSetExpClk(SSI0_BASE,
Clk::GetInstance().GetSysFreq(),
SSI_FRF_MOTO_MODE_0,
SSI_MODE_SLAVE,
4000000,
8);
// registrace funkce přerušení
SSIIntRegister(SSI0_BASE, Spi::InterruptHandler);
// volba typu přerušení
ROM_SSIIntEnable(SSI0_BASE,SSI_RXFF|SSI_RXTO);
// smazani vlajek přerušení
ROM_SSIIntClear(SSI0_BASE,SSI_RXFF|SSI_RXTO);
// povolení SPI
ROM_SSIEnable(SSI0_BASE);
// globální povolení přerušení - o preruseni se stara DMA
ROM_IntEnable(INT_SSI0);
ROM_IntMasterEnable();
}
void Spi::InterruptHandler(void){
// stav povolení přenosu
uint32_t state;
// reference na Spi modul
Spi& spi = Spi::GetInstance();
// čtení stavu přerušení SSI.
state = ROM_SSIIntStatus(SSI0_BASE, 1);
// vyčtení dat
for(int idx = 0;
idx < PEG_REQ_STA_END_OF_SEQUENCE && ROM_SSIDataGetNonBlocking(SSI0_BASE, &(spi.request[idx]));
idx++);
// smazání vlajky přerušení
ROM_SSIIntClear(SSI0_BASE, state);
}
Is there something wrong with my settings?