Easyelectronics.ru

Электроника для всех
Текущее время: 21 июн 2018, 05:15

Часовой пояс: UTC + 5 часов



    • JLCPCB - Платы прототипов всего за 2$ c бесплатной доставкой (при первом заказе)
    • 10 PCBs за $2 для 2 слоев, $15 для 4 слойной, $74 для 6 слойной платы.
    • Крупнейший китайский производитель прототипных плат. 290000+ клиентов & 8000+ заказов в день!
    • LCSC - Крупнейший китайский онлайн магазин радиодеталей.

Начать новую тему Ответить на тему  [ Сообщений: 9 ] 
Автор Сообщение
 Заголовок сообщения: AVR странности с SPI
СообщениеДобавлено: 15 фев 2018, 20:20 
Только пришел

Зарегистрирован: 15 фев 2018, 20:14
Сообщения: 8
Здравствуйте.
Микроконтроллер atmega, работаю в atmel studio.
Инициализирую spi на мк и читаю/записываю байты на другом устройстве. Проблема в том, что все работает, если только все команды прописать в теле" main ()" .Или перед функциями записать "inline" — то есть тоже, по сути, встроить код в тело main.
Обычный вызов функций не работает, когда работаю с регистрами SPI. Такое впечатление, что SPI отваливается, если вызываю функцию, где есть работа с SPI.

Код:
//#define F_CPU 18000UL

#include <avr/io.h>
//#include <util/delay.h>

char trythis;

inline void SPI_init (void) {   //Инициализация SPI
   
        DDRB |=(1<<PB4)|(1<<PB5)|(1<<PB7); //Настроить выводы SS,MOSI,SCK на выход
        DDRB &=~(1<<PB6); //Настроить вывод MISO на вход ///
       
        SPCR |= (1<<MSTR)|(1<<SPR0)|(1<<SPR1); //Режим мастер, F=Fosc/128

        SPCR |=(1<<SPE); //Включить SPI
    }


inline void Write_Register (char adress_of_registr, char registr ) {
   
    adress_of_registr = adress_of_registr << 3;   //Смещаем весь регистр влево на три знака
    adress_of_registr |= 0b00000100;   //После смещения добавляем в конце "100"
   
    SPDR = adress_of_registr; //Отправить байт
    while(!(SPSR&(1<<SPIF))) ; //Дождаться окончания передачи
   
    SPDR = registr; //Отправить байт
    while(!(SPSR&(1<<SPIF))) ; //Дождаться окончания передачи
   
}

inline void Empty_message(void){
   
    SPDR=0x00;                 //Отправляем пустой байт
    while(!(SPSR&(1<<SPIF)));  //Дождаться окончания передачи
   
}

inline char Read_Register (char adress_of_registr) {
   
    adress_of_registr = adress_of_registr << 3;   //Смещаем весь регистр влево на три знака
   
    SPDR=adress_of_registr;      //Отправить байт
    while(!(SPSR&(1<<SPIF)));   //Дождаться окончания передачи
   
    Empty_message();
   
    return SPDR;
}

void LED (void) {
   
    DDRA=0xFF;
    PORTA=0xFF;
}


int main (void) {
   
    SPI_init();
   
    Write_Register(0b00100, 0b00111111);
   
    if (Read_Register(0b00100)==0b00111111) {LED();}
   
    while (1) {       
              }
}


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: AVR странности с SPI
СообщениеДобавлено: 16 фев 2018, 12:25 
Старожил
Аватара пользователя

Зарегистрирован: 17 апр 2010, 08:38
Сообщения: 4828
Откуда: Усинск, республика Коми
Убирать инлайн по одной, выявить в какой функции проблема. Дальше уже смотреть где ошибка закралась.

_________________
хаос это непознанный порядок


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: AVR странности с SPI
СообщениеДобавлено: 16 фев 2018, 13:48 
Старожил

Зарегистрирован: 04 окт 2012, 00:23
Сообщения: 2484
Откуда: Москва
Вы настроили вывод SS , но ни в одной Вашей функции нет управления этим выходом. Если его дёргать не надо , то пропишите константу на этот пин

Код:
DDRB |=(1<<SS)|(1<<MOSI)|(1<<SCK); //Настроить выводы SS,MOSI,SCK на выход
        DDRB &=~(1<<MISO); //Настроить вывод MISO на вход ///
- так смотрится лучше


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: AVR странности с SPI
СообщениеДобавлено: 16 фев 2018, 14:45 
Только пришел

Зарегистрирован: 14 май 2017, 19:45
Сообщения: 27
Если вывод SS сконфигурирован как вход, а SPI в режиме мастера, то если на SS будет 0, то модулем SPI это будет воспринято как перевод его в режим ведомого.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: AVR странности с SPI
СообщениеДобавлено: 17 фев 2018, 18:24 
Только пришел

Зарегистрирован: 15 фев 2018, 20:14
Сообщения: 8
Всем спасибо за ответы.
SS попробую перевести в константы, или отдельно объявить ее в теле main(). Может быть причина и в этом.
По поводу inline -- не работают ВСЕ функции, в которых есть работа с SPI. То есть, например, если функцию инициализации SPI записать с inline, а функцию обмена байтами без, то ничего работать не будет, как и наоборот.
Дальше. Функции работают, если записать их в static. Что очень странно, так как никакие файлы, кроме avr/io.h я не объявлял. Пробовал менять названия функций на случайные -- тоже не работало. Пробовал скомпилировать без оптимизации -- тоже не работало. Есть какие-нибудь мысли по этому поводу?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: AVR странности с SPI
СообщениеДобавлено: 18 фев 2018, 01:51 
Старожил
Аватара пользователя

Зарегистрирован: 18 апр 2017, 03:01
Сообщения: 846
kovalbski писал(а):
Микроконтроллер atmega
а такой микроконтроллер существует? Это я к тому, что поточнее надо быть - какой именно микроконтроллер.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: AVR странности с SPI
СообщениеДобавлено: 18 фев 2018, 14:05 
Только пришел

Зарегистрирован: 15 фев 2018, 20:14
Сообщения: 8
h4lf писал(а):
kovalbski писал(а):
Микроконтроллер atmega
а такой микроконтроллер существует? Это я к тому, что поточнее надо быть - какой именно микроконтроллер.

Микроконтроллер atmega162


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: AVR странности с SPI
СообщениеДобавлено: 18 фев 2018, 17:47 
Старожил
Аватара пользователя

Зарегистрирован: 18 апр 2017, 03:01
Сообщения: 846
kovalbski, когда функции static, то скорее всего компилятор решает их инлайнить, потому и работает -- посмотрите листинг, чтобы проверить.
Ваша тема напомнила о граблях в atmega128, где фьюз M103C по умолчанию запрограммирован. В итоге программа, скомпилированная для маги128, вела себя "странно" -- если я правильно помню, не происходило возврата из первой же неинлайновой функции или что-то вроде того. Возможно, помимо всего прочего, опкод RET в atmega103 и atmega128 разный, а может и не в RET было дело, а в работе с периферией...
В atmega162 есть фьюз M161C, но он по умолчанию не запрограммирован.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: AVR странности с SPI
СообщениеДобавлено: 19 фев 2018, 20:18 
Только пришел

Зарегистрирован: 15 фев 2018, 20:14
Сообщения: 8
h4lf писал(а):
kovalbski, когда функции static, то скорее всего компилятор решает их инлайнить, потому и работает -- посмотрите листинг, чтобы проверить.
Ваша тема напомнила о граблях в atmega128, где фьюз M103C по умолчанию запрограммирован. В итоге программа, скомпилированная для маги128, вела себя "странно" -- если я правильно помню, не происходило возврата из первой же неинлайновой функции или что-то вроде того. Возможно, помимо всего прочего, опкод RET в atmega103 и atmega128 разный, а может и не в RET было дело, а в работе с периферией...
В atmega162 есть фьюз M161C, но он по умолчанию не запрограммирован.

Чёрт возьми, это сработало! Большое спасибо. Дело было как раз во фьюзе m161c


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 9 ] 

Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB