我在主从双方都使用atmega16。 我想将通过键盘输入的 100-999 之间的数字发送给从机。 数字是 16 位,但 spdr 寄存器是 8 位,所以我先发送 lsb,然后发送 msb 位。这很有效,我正确地发送了我的号码。
但我的问题出在从属端: 我在从机端启用了中断 spie,因此从主机接收到的每个 spdr 都被视为中断并进入 ISR 功能。但由于我的数字是16位,所以我想将每个16位或两个字节作为中断。我该怎么办?
最佳答案
您知道消息长度(16 位或 2 字节)。只需创建一个环形缓冲区来存储两个字节并填充环形缓冲区即可。也许您可以添加第三个字节作为开始或结束字节或其他字节,但这取决于您。另外,如果传输结束,您可以设置一个标志。
所以你的代码可以看起来像这样。请注意,此代码只是 ISR,适用于 XMega 作为 SPI 从机,但它应该有助于理解该过程。
#define SPI_BUFFER_SIZE 2
uint8_t SPI_RxSlaveBuffer[SPI_BUFFER_SIZE];
typedef struct
{
uint8_t* RxBuffer;
uint8_t BytesProcessed;
uint8_t Status;
} SPI_Buffer_t;
static SPI_Buffer_t SlaveBuffer;
int main()
{
// Some code
SlaveBuffer.RxBuffer = SPI_RxSlaveBuffer;
// Some other code
}
ISR(SPIC_INT_vect)
{
SlaveBuffer.RxBuffer[SlaveBuffer.BytesProcessed++] = SPIC.DATA;
if(SlaveBuffer.BytesProcessed >= SPI_BUFFER_SIZE - 1)
{
SlaveBuffer.BytesProcessed = 0x00;
SlaveBuffer.Status = 0x01;
}
}
您还可以检查 SS
引脚的状态,并在该引脚由主机断言时重置计数器(以防主机中止传输或其他情况) - 例如轮询 SS
引脚或将 SS
引脚的信号连接到中断引脚以生成额外的 I/O 中断。
关于c - Avr问题: in spi, spdr寄存器是8位但我的号码是16位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57506720/