1

我正在与一个硬件设计小组一起开发一个中断处理程序,我们正在试图找出错误在哪里。我正在通过 SPI 总线以 5khz 读取芯片。芯片加载 4 个字节并触发数据就绪引脚。

我的中断处理程序唤醒并从 SPI 总线读取 4 个字节并将数据存储在缓冲区中。奇怪的是,每 17 次读取都会给出全 0 的 4 个字节,这是不对的。我们正在探索的选项之一是芯片在发送数据就绪信号时并不总是真正准备好。

所以,我知道我不能在中断处理程序中睡觉,但我想尝试引入 10 或 20 微秒的延迟。现在我有一个计数为 100,000 的 for 循环,然后处理中断。我没有看到任何变化,所以我想我可能会看看是否有人有更好的忙等待技术。或者至少是一种更好的方法来确定我应该经历多少次循环迭代,因为我不确定这需要多长时间,或者编译器是否只是在优化整个事情。

4

2 回答 2

1

我不知道您是否可以访问嵌入式设备上的任何伪随机数生成库,但是在进行大量乘法运算后进行 mod 肯定会花费一些周期。而不是简单地添加 1 (这在硬件级别非常快,编译器可以优化它以进行移位,因为您正在执行静态次数)使用随机数种子(系统是否可以访问时钟? ) 如果可用并进行大数乘法、模数或阶乘运算,负数除法也需要永远。请记住,除法在硬件级别上花费的时间最长。利用它来发挥你的优势。

于 2013-10-17T20:29:25.773 回答
0

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

你应该使用易失性。

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

我还认为这不会消除问题或帮助您。

我不敢相信,SPI 外围设备有这样的错误

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

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

于 2013-10-18T06:47:00.780 回答