This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TM4C123GH6PM:SPI FIFO 仅从较长的消息接收一个字节

Guru**** 2445440 points
Other Parts Discussed in Thread: TM4C123GH6PM

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1549604/tm4c123gh6pm-spi-fifo-receives-only-single-byte-from-longer-message

器件型号:TM4C123GH6PM


工具/软件:

我正在尝试解决 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);
}

我的设置是否有问题?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    确定发现了这个。 设置  SSI_FRF_MOTO_MODE_0 时出现问题、该错误已被缓冲。 我通过 在两端(主器件和从器件 CPO=1、CPHA=1)设置 SSI_FRF_MOTO_MODE_3 来解决这一问题。