2013-10-17 55 views
1

我正在使用一个硬件设计组来处理中断处理程序,并且我们试图找出错误在哪里。我正在以5khz读SPI总线上的芯片。芯片加载4个字节并触发数据准备好引脚。在Linux中断处理程序中创建一个小延迟

我的中断处理程序唤醒并从SPI总线读取4个字节并将数据存储在缓冲区中。奇怪的是,每第17次读取都会给出所有0的4个字节,这是不对的。我们正在探索的其中一个选择是芯片在发送数据就绪信号时并不总是准备好。所以,我知道我不能睡在中断处理程序中,但我想尝试引入10或20微秒的延迟。现在我有一个for循环计数到100,000然后处理中断。我还没有看到任何变化,所以我想我可能会看到是否有人有更好的技术来忙等待。或者至少有一个更好的方法来计算我应该经历多少循环迭代,因为我不知道这需要多长时间,或者编译器是否只是优化整个事情。

+1

将数字分析仪连接到SPI线。查看数据准备好后是否真的返回了错误的数据。除非你更好地找出问题的根本原因,否则你可能会因为延迟等原因而喋喋不休。 –

回答

1

我不知道你是否可以访问嵌入式设备上的任何伪随机数生成库,但是在mod之后进行大数乘法运算肯定需要一些周期。而不是简单地添加1(在硬件级别上速度非常快,编译器可以优化它以便移动,因为您正在静态执行该操作),请使用随机数字种子(系统是否可以访问时钟? )如果可用并且执行大数乘法,模数或阶乘运算,则负数分配也需要永久。请记住,分区在硬件级别上最长。使用它你的优势。

0

我假设你的编译器会去掉一个简单的循环。

你应该使用volatile。

volatile unsigned long i; 
for (i=0;i< 1000000; i++) 
    continue; 

我还假设这不会消除问题或帮助你。

我不敢相信,一个SPI外设有这样一个错误

但是您可能会阅读以减慢SPI-Fifo中的数据。
所以一些收到的数据将被丢弃。

您应该检查SPI模块的错误标志并检查SPI的RX空RX-fullflags。