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:SSI 中断

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/605742/tm4c123gh6pm-ssi-interrupts

器件型号:TM4C123GH6PM

我正在尝试实现 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])){}

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我刚才找到了勘误表 spmz849f.pdf、指示 TX EOT 中断未被锁存。 我不确定这是我遇到的吗? 中断使能后、我将 CR1寄存器中的 EOT 位置位、现在我为 SSI_TXFF 获得了多个中断、但我在 o 示波器上看不到任何数据。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Brian、

    是的、这将是您遇到的情况。 如果您收到 SSI_TXFF 的多个中断、那么我认为您实际上不再正确设置 EOT 位、因为这听起来像是条件1 -但在本例中这是可以的、因为最后这实际上是您最终要做的事情。

    如勘误表中所述、变通办法实际上是始终将 EOT 位清零、这将激活此行为:"TXRIS 中断表示发送 FIFO 为半空或少于半空"。

    那么、您应该在每次接收到 TXRIS 中断检查时让中断处理程序检查是否已将数据传输到 SSIDR、 如果是、则清除 SSIIM TXIM 位以停止始终发出中断的情况(如勘误表项 SS#07的"条件1"所述)。

    在逻辑电路就位的情况下、当需要接收下一个发送缓冲区中断时、如下一次发送时、可以重新启用 SSIIM TXIM 位。

    也就是说、在释放 CS 线路之前、您仍需要某种形式的延迟才能传输 FIFO 中的剩余数据...