SPI没有在atmega328p上工作

时间:2018-02-08 08:46:27

标签: arduino spi atmega atmel ice

我试图编程atmega328p,但SPI总线不工作。它不通过总线发送任何数据。

我的代码如下:

#include <asf.h>
#include <stdio.h>
#include <main.h>

int main (void)
{
    board_init();
    SPI_MasterInit();

    DDRD = (1<<DDD5);

    while(1)
    {
        PORTB &= ~(1<<DDB2);
        SPI_MasterTransmit(0xAB);
        PORTB |= (1<<DDB2);

        PORTD ^= (1<<DDD5);
    }
}

void SPI_MasterInit(void)
{
    /* Set MOSI and SCK output, all others input */
    DDRB = (1<<5) || (1<<3) || (1<<2);
    /* Enable SPI, Master, set clock rate fck/16 */
    SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0);
}

void SPI_MasterTransmit(char cData)
{
    /* Start transmission */
    SPDR = cData;
    /* Wait for transmission complete */
    while(!(SPSR & (1<<SPIF)));
}

我试图通过总线(0xAB)发送一些随机数据来检查总线是否正常工作,以便我可以添加更多代码。在while循环中,我还设置了一个引脚。

在我的示波器图像上,我看到SPI引脚MOSI上没有发送数据,CLK引脚也没有发送信息。 PB5(每次我尝试发送数据时,引脚I反转)正在工作,周期约为20微秒。

我通过Atmel ICE编程Atmega328p。编程接口也通过SPI,我在某处读到这可能是一个问题。我不太确定。

有谁知道可能是什么问题?

1 个答案:

答案 0 :(得分:1)

我的第一个猜测是没有将SS引脚(PB2)设置为输出。它可能导致几乎随机切换到从模式。但它似乎被设置为输出(它没有在评论中说明)。

但仔细观察这个表达后,显然它根本没有设置:

DDRB = (1<<5) || (1<<3) || (1<<2);

逻辑或||和按位或|之间存在巨大差异。