Embedded 如何使用SPI解决从机到主机的数据传输问题?

Embedded 如何使用SPI解决从机到主机的数据传输问题?,embedded,atmega,Embedded,Atmega,我尝试使用SPI在两个AVR(ATmega128)之间进行通信 从主设备到从设备的数据传输正确,但从设备到主设备的数据传输错误,第一个采样位总是错误的 从设备向主设备发送(0X7E),但接收的数据为(0X3F) 错在哪里 船长代码 #包括 #定义F_CPU 1600000UL #包括 #定义ACK 0x7E 无效spi_初始主机(无效) { DDRB=(1可能问题在于重新加载数据寄存器@SLAVE。在您的代码中,这是通过轮询完成的。因此,如果您的时钟速度很高,那么SLAVE没有足够的时间正确重新

我尝试使用SPI在两个AVR(ATmega128)之间进行通信

从主设备到从设备的数据传输正确,但从设备到主设备的数据传输错误,第一个采样位总是错误的

从设备向主设备发送(0X7E),但接收的数据为(0X3F)

错在哪里

船长代码
#包括
#定义F_CPU 1600000UL
#包括
#定义ACK 0x7E
无效spi_初始主机(无效)
{

DDRB=(1可能问题在于重新加载数据寄存器@SLAVE。在您的代码中,这是通过轮询完成的。因此,如果您的时钟速度很高,那么SLAVE没有足够的时间正确重新加载寄存器

重要提示:

SPI的时钟速度必须为从机上的F_CPU/4(参见第168页的)

尝试在主机上设置延迟。因此,从机有时间重新加载寄存器:

#定义F#U CPU?UL//系统的时钟速度,单位为Hz
无符号字符spi_段接收器(无符号字符数据);
#包括
内部主(空)
{
// ...
而(1)
{
ret=spi_档接收器(数据);
}
}
无符号字符spi_段接收器(无符号字符数据)
{
_延迟时间(10);

PORTB&=~(1)我不知道这些部分,但它们可能需要更多的时间让SS降低。在
PORTB&=~(1)之间,您是否使用了正确的CPOL和CPHA?@Lundin谢谢您的回复,我在这行后面加了一个条件(PORTB&=~(1@thebusybee感谢您的回复,我使用了零模式,数据在上升沿采样,在下降沿更改。主机使用未初始化的变量发送其字节。可能是您编辑了源代码,不是吗?
#include <avr/io.h>
#define F_CPU 16000000UL
#include <util/delay.h>
#define ACK 0x7E

void spi_init_master(void)
{
    DDRB = (1<<0)|(1<<1)|(1<<2);              //Set MOSI, SCK, SS as Output
    PORTB |= 1; 
    SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0); //Enable SPI, Set as Master, Prescaler: Fosc/16
}

//Function to send and receive data
unsigned char spi_tranceiver(unsigned char data)
{
    PORTB &= ~(1<<0);
    SPDR = data;                       //Load data into the buffer
    while (!(SPSR & (1<<SPIF) ));       //Wait until transmission complete
    PORTB |= (1<<0);
    return (SPDR);                      //Return received data
}

int main(void)
{
    spi_init_master();                  //Initialize SPI Master
    
    unsigned char data;
    unsigned char ret;
    
    while (1) 
    {
        ret = spi_tranceiver(data);
    }
}
#include <avr/io.h>
#define F_CPU 16000000UL
#include <util/delay.h>
#define ACK 0x7E

void spi_init_slave(void)
{
    DDRB = (1<<3);                                  //MISO as OUTPUT
    SPCR = (1<<SPE);                                //Enable SPI
}

//Function to send and receive data
unsigned char spi_tranceiver(unsigned char data)
{
    SPDR = data;                                  //Load data into buffer
    while (!(SPSR & (1<<SPIF) ));                  //Wait until transmission complete
    return (SPDR);                                 //Return received data
}


int main(void)
{
    spi_init_slave();                             //Initialize slave SPI
    unsigned char data;
    
    while (1) 
    {
        data = spi_tranceiver(ACK);
    }
}