【发布时间】:2019-08-15 08:12:58
【问题描述】:
我在主机和从机中都使用 atmega16。 我想将通过键盘输入的 100-999 之间的数字发送给从站。 数字是 16 位,但 spdr 寄存器是 8 位,所以我先发送 lsb 然后发送 msb 位。这很好用,我正确地发送了我的号码。
但我的问题是在奴隶方面: 我在从机端启用了中断间谍,因此从主机接收到的每个 spdr 都作为中断并进入 ISR 功能。但是因为我的数字是16位的,所以我想把每个16位或两个字节作为一个中断。我该怎么办?
【问题讨论】:
-
理想情况下,您应该在从设备端获得两个中断 - 每个字节一个。为什么不将它们保存到缓冲区并增加计数以查看有多少来了?
-
在从机端,我 while() 我有一个可以运行的函数,我想在收到两个字节时执行一个 ISR 函数。不是在收到一个字节时。当我在 avr spi interupt 中自动启用 spi 中的中断时,当接收到一个字节时,它会进入 ISR。我想做一些事情,当收到两个字节时它会进入 ISR。
-
根据您使用的特定微控制器,您可能可以在 SPI 外设配置中设置 16 位的传输大小,不确定您使用的是否允许这样做。另一种选择是使用 DMA(再次,如果可能的话在您的设备上)将字节从 SPI DR 复制到缓冲区,并对其进行编程以在收到两个字节后发出中断。不过,我仍然不明白是什么阻止了您分别处理两个 SPI RX 中断!
-
另外,请尝试更好地构建您的问题,并尽可能提供代码和更好的上下文,以便人们容易理解您的问题。
-
主端发送一个16位的数字。例如 999,我在 atmega32 中的 spdr 寄存器是 8 位的,所以我将我的 16 位数字分成两个 8 位包并分两步发送。在master方面没问题。在从机端,while(1) 中的 i 函数按段(数字)函数显示 7segnent 中的数字。我希望 segment() 总是这样做,但是当一个 16 位数字接收它时它会改变。所以我启用了中断并编写了一个 ISR 函数。但是每个 8 位都进入 ISR。我可以使用 for(i=0,i
标签: c avr spi atmelstudio atmega16