2016-01-11 3 views
-1

Это моя первая попытка настроить связь SPI на ATmega32 и MAX31855. Я должен прочитать 32 бита от MAX31855 datasheet. Я написал собственную функцию, но, кажется, все время читает 0 (я проверил ее на дисплее). Вот мои определения из * .h файла:Как читать 32-битную переменную из Software SPI в ATmega32?

#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 becouse я не нужна дробная часть):

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

Где это моя проблема?

+0

Какой тип 'temp' объявлен как? – duskwuff

+0

'temp' также uint32_t. После его переключения ему присваивается глобальная переменная типа int. Но это проблема с temp - она ​​всегда читает ноль ... – Nichten

+0

Вы уверены, что контакт MISO сконфигурирован как вход? – JimmyB

ответ

0

Время синхронизации выглядит нормально, но обратите внимание, что вам нужно всего лишь синхронизировать 14 циклов (или только 12 для меньшей точности), чтобы получить результат. Вы можете прекратить читать остальные результаты, когда захотите. (Вам не нужно читать все 32 бита, если вы их не используете). Если вы прочитаете все биты, вы можете обнаружить все коды неисправностей, которые указывают на то, что термопары подключены неправильно.

Вы даете достаточно времени для перехода? Для чтения требуется 100 мс.

+0

Между следующим чтением есть 2 секунды, так что все должно быть в порядке. Я уже видел, что havent'g управлял высоким CS1 после установки его в качестве вывода. Но после добавления этого кода он не помог ... – Nichten