我有一个来自设备(AFE - 模拟前端)的外部信号,我需要将其用作执行任务的中断。 信号为低电平有效,只要准备好从器件读取数据,它就会变为低电平。它会在一秒内达到高ODR时间(其中ODR是输出数据速率)。我需要将它用作逻辑0电平中断,使用飞思卡尔的K53 Kinetis微控制器从器件读取数据。我通过SPI与微控制器作为主设备进行通信,AFE作为从设备进行通信
问题是,由于SPI的双向特性,只有当我向AFE发送NOP时,才能从设备获取数据。因此,除非我发送NOP命令,否则我不会从AFE获得DRDY(数据就绪)信号,我必须将其用作中断 - 但是,DRDY信号告诉我何时从设备读取数据(给NOP =给出时钟)从AFE接收数据的周期。因此,读取数据=给出NOP命令。)
到目前为止,在配置器件输出数据并启用中断后,我已经完成了一些NOP,这样就可以进入一些数据并且可以进入eDRDY信号。没有NOP, DRDY信号始终很低,我永远陷入了ISR。在主要时间之前使用少量NOP,生成DRDY,并且在ISR内,我提供更多NOP,以便可以维持DRDY信号。
然而,使用相同的代码,它有时会起作用,但有时它仍会卡在ISR中。这是不一致的,让我觉得这里有一些严重的时间问题。
我的代码如下所示:
enable_irq(91);
//this tells the device to output frames of data at ODR
reg_read_adas1000(0x40000000);
for (i=0;i<1000;i++)
//few NOPs - the slave in line is 0
reg_read_adas1000(0x00000000);
while (j<9900){
asm("nop");
j++;
}
ISR:
void porte_isr(void) {
//giving NOP and storing data obtained from device in an array
data_adas1000[inter_iter_flag]=reg_read_adas1000(0x00000000);
//increment counter
inter_iter_flag++;
//break out of the program at a suitable length of array
if (inter_iter_flag >= 9900)
disable_irq(91);
PORTE_ISFR = 0xFFFFFFFF; //Clear Flags
}
非常感谢任何帮助。