C语言 Avr 问题:在 spi 中,spdr 寄存器是 8 位,但我的数字是 16 位



我在主站和从站两侧都使用 atmega16。 我想向从站发送一个通过键盘输入的 100-999 之间的数字。 数字是 16 位,但 spdr 寄存器是 8 位,所以我先发送 lsb,然后发送 msb 位。这很好用,我正确地发送了我的号码。

但我的问题出在奴隶方面: 我在从站启用了中断间谍,因此从主站收到的每个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中断。

最新更新