我正在尝试实现 SSI EOT 中断、但我没有取得太大的成功。 我从一些没有启用中断的示例代码开始,并且在写入之后有一个 SysCtlDelay(),以将*CS GPIO 线路保持为低电平,直到最后一位被计时结束。 这可以正常工作、但现在我要尝试使代码更高效、更快。 因此、我想等待中断进入、然后放弃芯片选择。 确实会发生中断、但我只需要 SSI_TXFF 中断、我得到的只是那个中断之外的所有中断。 根据数据表、我设置 SSI1_CR1R 寄存器中的 EOT 位。 我不确定该呼叫的正确位置是什么? 是否应在启用中断之前进行? (我现在执行的操作。)
下面是我的 SSI 初始化代码:
void SpiInit_SSI1 (void){
//必须启用 SSI1外设才能使用。
ROM_SysCtlPeripheralEnable (SYSCTL_Periph_SSI1);
//对于 TM4C123G、SSI0与 Porta[5:2]一起使用。
ROM_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOD);
//为端口 A2、A3、A4和 A5上的 SSI0功能配置引脚复用。
ROM_GPIOPinConfigure (GPIO_PD0_SSI1CLK);//为时钟配置 PA2
ROM_GPIOPinConfigure (GPIO_PD2_SSI1RX);
ROM_GPIOPinConfigure (GPIO_PD3_SSI1TX);//为主机发送配置 PA5
//配置 SSI 引脚的 GPIO 设置。 该函数也会提供
将这些引脚的//控制到 SSI 硬件。 请参阅中的数据表
//查看每个引脚分配的函数。
//引脚分配如下:
// PA5 - SSI0Tx
// PA4 - SSI0Rx
// PA3 - SSI0Fss -未使用
// PA2 - SSI0CLK
ROM_GPIOPinTypeSSI (GPIO_PORTD_base、GPIO_PIN_0 | GPIO_PIN_2 | GPIO_PIN_3);
//为 SPI 主控模式配置和启用 SSI 端口。 使用 SSI1、
//系统时钟电源,空闲时钟低电平和低电平有效时钟输入
//飞思卡尔 SPI 模式、主控模式、1MHz SSI 频率和8位数据。
//对于 SPI 模式,可以设置 SSI 时钟的极性
//单元空闲。 您还可以配置所需的时钟边沿
//在上捕获数据。 有关的更多信息、请参阅数据表
//不同的 SPI 模式。
ROM_SSIConfigSetExpClk (SSI1_base、8000000、SSI_FRF_MOTO_MODE_0、
SSI_MODE_MASTER、2000000、16);
SSIIntDisable (SSI1_base、0x0F);
SSI1_CR1_R |= 0x00000010;
SSIIntEnable (SSI1_BASE、SSI_TXFF);
SSIIntRegister (SSI1_base、&S Ssi1IntHandler);
//启用 SSI0模块。
ROM_SSIEnable (SSI1_base);
uint32_t pui32DataRx[2];
//从 SSI 端口读取任何残留数据。 这将确保接收
// FIFO 为空,因此我们不会读取任何不需要的垃圾。 这在这里完成
//因为 SPI SSI 模式为全双工模式,允许您发送和
//同时接收。 SSIDataGetNonBlocking 函数返回
//返回数据时为"true",未返回数据时为"false"。
//“非阻塞”函数检查接收中是否有数据
// FIFO、如果没有、则不会"挂起"。
while (ROM_SSIDataGetNonBlocking (SSI1_base、&pui32DataRx[0])){}
}