c - Avr问题: in spi, spdr寄存器是8位但我的号码是16位

标签 c avr spi atmelstudio atmega16

我在主从双方都使用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/

相关文章:

c - 软件 SPI 实现

c - 在函数参数中传递的数组是否被视为按引用调用?

eclipse - Eclipse CDT无法解析uint8_t等

c - 位掩码位寄存器

avr - SPI管脚干扰

c - 使用 Atmega32 和 At42QT2100 的 SPI

c - 为 float 指定十六进制值返回错误值

c - 自由指针使用的长度值(整数)

c - 将字符串拆分为 block 。

arduino - 为 atmega328p 上的嵌入式操作系统写入闪存 ROM(h8write 相当于 avr)