我正在尝试为 AD7768-4 ADC 创建一个合适的 SPI 从接口。ADC 有一个 SPI 接口,但它不通过 SPI 输出转换。取而代之的是,数据输出在各个 GPIO 引脚上同步输出。所以我基本上需要bit-bang数据,并输出到SPI以获得正确的从属SPI接口。请不要问我为什么要这样做,它是分配给我的。
我遇到的问题是中断。我使用的是 STM32F767ZI 处理器——它以 216 MHz 运行,我的 ADC 数据必须以 20MHz 时钟输出。我已经设置了我的 NMI,但我没有看到系统调用或指向中断处理程序的位置。
我使用 STMCubeMX 软件分配引脚并生成设置代码,并在stm32F7xx.c
文件中显示了该NMI_Handler()
功能,但我在系统文件的任何地方都没有看到指向它的指针。我还在 中找到了 voidHAL_GPIO_EXTI_IRQHandler()
函数STM32F7xx_hal_gpio.c
,它似乎检查引脚是否已被断言,并清除任何未决位,但它没有重置中断标志,也没有检查它,我再次看到没有指向该函数的指针。
为了使事情更复杂,我有 10 个时钟周期来确定设置了哪个标志(一次两个标志中的一个),重置它,增加一个变量,并从 GPIO 寄存器移动数据。我相信这是可能的,但同样,一旦中断被触发,我就不确定系统在做什么。
有没有人有在这个处理器上处理外部中断的经验,可以阐明这个特定系统如何处理事情?再一次 - 10 个时钟周期来做我需要做的事情......移动数据应该只需要我 1-2 个时钟周期,让我 8 来处理中断......
编辑:
我们将 DCLK 速度更改为 5.12 MHz(20.48 MHz MCLK/4),因为在 2.56 MHz 时,我们正好有 12.5 微秒的时间来输出数据并为下一个 DRDY 脉冲进行设置,而 80 kHz 的速度正好为我们提供了零余量。在 5.12 MHz 时,我有 41 个时钟周期来运行中断例程,如果我跳过检查第二个标志而只处理传入数据,我可以稍微减少它。但我觉得我至少必须使用 DRDY 标志检查,并使用例程启用第二个中断,否则我将不断中断,因为 ADC 上的 DCLK 一直在运行。这让我有 6.12 微秒的时间来读取数据,并在下一个 DRDY 脉冲之前有 6.25 微秒的时间将其洗牌。我应该能够在 32 MHz SPI 时钟(从属)下做到这一点,但很可能会在 50 MHz 下做到这一点。这是我当前的中断代码:
void NMI_Handler(void)
{
if(__HAL_GPIO_EXTI_GET_IT(GPIO_PIN_0) != RESET)
{
count = 0;
__HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_0);
HAL_GPIO_EXTI_Callback(GPIO_PIN_0);
// __HAL_GPIO_EXTI_CLEAR_FLAG(GPIO_PIN_0);
HAL_NVIC_EnableIRQ(GPIO_PIN_1);
}
else
{
if(__HAL_GPIO_EXTI_GET_IT(GPIO_PIN_1) != RESET)
{
data_pad[count] = GPIOF->IDR;
count++;
if (count == 31)
{
data_send = !data_send;
HAL_NVIC_DisableIRQ(GPIO_PIN_1);
}
__ HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_1);
HAL_GPIO_EXTI_Callback(GPIO_PIN_1);
// __HAL_GPIO_EXTI_CLEAR_FLAG(GPIO_PIN_0);
}
}
}
我仍然担心时钟周期,如果我假设唯一会触发的其他 EXTI 标志是时钟引脚,我相信我可以只检查 DRDY 标志。虽然我质疑如果 SYS_TICK 在后台运行这将如何工作......我必须找出答案。
我们正在研究一种更快的处理器来处理位碰撞,但现在,如果 PI3 运行 Linux,它看起来将无法处理它,而且我不知道有太多更快的处理器运行非常小的可靠 RTOS,或者可以在紧要关头进行裸机编程......