如何从ATmega32中的软件SPI读取32位变量?

时间:2016-01-11 23:06:22

标签: c avr spi

这是我第一次尝试在ATmega32和MAX31855上设置SPI通信。我从MAX31855 datasheet读取32位。我已经编写了自己的功能,但它似乎一直读取0(我已在显示屏上查看过)。以下是* .h文件中的定义:

#ifndef SPI_SOFTWARE_H_
#define SPI_SOFTWARE_H_

#define ilosc_urzadzen 1

#define SoftSPI_MOSI    PD0
#define SoftSPI_MISO    PD1
#define SoftSPI_SCK     PD2
#define SoftSPI_CS1     PD3
#define SoftSPI_CS2     PD4
#define SoftSPI_CS3     PD5
#define SoftSPI_CS4     PD6
#define SoftSPI_CS5     PD7

#define SoftSPI_DDR     DDRD
#define SoftSPI_PIN     PIND
#define SoftSPI_PORT    PORTD

void init_SoftSPI();
uint32_t odczyt32bit(int CSx);

#endif

我连接了MAX31855:SO - > PD1,SCK - > PD2,CS - > PD3。

这是我的代码来自* .c:

#include <avr/io.h>
#include "SPI_software.h"

void init_SoftSPI(){
    SoftSPI_DDR |= (1 << SoftSPI_MOSI) | (1 << SoftSPI_SCK);

    if(ilosc_urzadzen == 1)  SoftSPI_DDR |= (1 << SoftSPI_CS1);
    else if(ilosc_urzadzen == 2) SoftSPI_DDR |= (1 << SoftSPI_CS1) | (1 << SoftSPI_CS2);
    else if(ilosc_urzadzen == 3) SoftSPI_DDR |= (1 << SoftSPI_CS1) | (1 << SoftSPI_CS2) | (1 << SoftSPI_CS3);
    else if(ilosc_urzadzen == 4) SoftSPI_DDR |= (1 << SoftSPI_CS1) | (1 << SoftSPI_CS2) | (1 << SoftSPI_CS3) | (1 << SoftSPI_CS4);
    else if(ilosc_urzadzen == 5) SoftSPI_DDR |= (1 << SoftSPI_CS1) | (1 << SoftSPI_CS2) | (1 << SoftSPI_CS3) | (1 << SoftSPI_CS4) | (1 << SoftSPI_CS5);
}

uint32_t odczyt32bit(int CSx){
    uint32_t liczba = 0;

    if (CSx == 1){
        SoftSPI_PORT &= ~SoftSPI_CS1;

        for (int i = 0; i < 32; i++)
        {
            SoftSPI_PORT |= SoftSPI_SCK;
            if (SoftSPI_PIN & (1 << SoftSPI_MISO)) liczba += 1;
            liczba = liczba << 1;
            SoftSPI_PORT &= ~SoftSPI_SCK;
        }

        SoftSPI_PORT |= SoftSPI_CS1;        
    }

    return liczba;
}

从MAX31855读取值后,我移动它(20个位置没有18因为我不需要分数部分):

temp = odczyt32bit(1);
temp = temp >> 20;

我的问题在哪里?

1 个答案:

答案 0 :(得分:0)

时钟定时看起来没问题,但请注意,您只需要输出14个周期(或者只需12个以获得更低的精度)即可获得结果。您可以随时停止阅读其余结果。 (如果不使用它们,则不需要读取所有32位。)如果读取了所有位,则可以检测到任何指示热电偶未正确连接的故障代码。

您是否有足够的时间进行转换?读数之间需要100 ms。