数据就绪引脚

时间:2015-06-23 11:01:49

标签: c embedded interrupt

我有一个来自设备(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  
}

非常感谢任何帮助。

0 个答案:

没有答案