工具/软件:
我正在尝试解决 SPI 主器件 (RPI) 和 TM4C123GH6PM (SLAVE) 之间的通信问题。 主器件总共发送 4 个字节、我可以通过逻辑分析仪进行检查。 从器件始终获取第一个字节、然后不获取任何字节。 我尝试了同样的结果 DMA。 我使用 C++、构造函数和中断处理程序如下所示:
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_PLATFORT_SPI_SCLK_PIN_MSK |
PEG_PLATFORT_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
//-从器件
//- 10000kHz
//- 8 位
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 状态;
//参考和 SPI 模块
SPI& SPI = SPI:: getInstance ();
//čtení stavu přerušení SSI。
状态= ROM_SSIIntStatus (SSI0_BASE、1);
// vyčtení dat
对于 (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);
}
我的设置是否有问题?