Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ATmega AVR
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.87/39: Рейтинг темы: голосов - 39, средняя оценка - 4.87
1 / 1 / 0
Регистрация: 17.12.2012
Сообщений: 425
1

Сопряжение двух ATMega16 через SPI, непонятный глюк

21.12.2012, 02:49. Показов 6981. Ответов 12
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Помогите пожалуйста найти косяк!
Всё вроде работает, но периодически ведомый микроконтроллер начинает чудить. Вообще, замечены такие странные вещи:
1. Ведомый можно прошить через бутлоадер только после отключения ведущего от питания.
2. Если отключить питание от ведомого, он всё равно работает оО(к нему подключен семисегментник, поэтому я вижу). Методом вытыкания, выяснил, что питание он каким-то адским образом получает через MOSI от ведущего.
Схему не привожу, т.к. всё просто - питание, земля и ресет на каждом МК. 3 линии SPI между ними попарно, и еще одна для выбора ведомого - от пина DEV1 порта B ведущего к SS пину порта B ведомого.
Вот так у меня настроен SPI:
SPI.h
Код
#include <avr/io.h>
#include <avr/interrupt.h>

#define SPI_DDR DDRB
#define SPI_PORT PORTB

#define DEV1 3
#define SS 4
#define MOSI 5
#define MISO 6
#define SCK 7

unsykned char ValSPI;

void Init_SPIMaster();
void Init_SPISlave();
void Transmit_SPIMaster(char cData);
SPI.c
Код
#include "SPI.h"

ISR(SPI_STC_vect)
{
ValSPI = SPDR;
}

void Init_SPIMaster()
{
volatile char IOReg;

SPI_DDR = 1<<MOSI|1<<SCK|1<<SS|1<<DEV1;
SPI_PORT = 1<<SS;

SPCR = 1<<SPE|1<<MSTR;

IOReg   = SPSR;                    // clear SPIF bit in SPSR
IOReg   = SPDR;

ValSPI = 0;
}

void Init_SPISlave()
{
volatile char IOReg;

SPI_DDR = 1<<MISO;

SPCR = 1<<SPE|1<<SPIE;

IOReg   = SPSR;                    // clear SPIF bit in SPSR
IOReg   = SPDR;

ValSPI = 0;
}

void Transmit_SPIMaster(char cData)
{
SPDR = cData;//начинаем передачу
while(!(SPSR & (1<<SPIF)));//ждем пока передача завершится
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.12.2012, 02:49
Ответы с готовыми решениями:

[РЕШЕНО] SPI. 5v (Master) --> 3.3v(Slave). Сопряжение.
Приветствую. Что-то у меня не получается считатывать из SD(3.3в) карточки данные в ATmega128 (5v)....

Сопряжение с LPT четырех SPI выходов
Планирую зачать проект сопряжения четырех ИС с выходами SPI (акселерометры ADIS16003) с паралл....

Можно ли прошить ATMega16 не по SPI
Пытаюсь прошить свой первый микроконтроллер ATMiko16. можно ли прошить МК не используя интерфейс...

Управление потенциометров по SPI из AtMega16
Приветствую. Уже третий день пытаюсь разобраться с косяком.. В Proteuse создал простуйшую...

Использование интерфейса UART и SPI на ATmega16
подскажите а можно ли использовать USORT и SPI для реализации радиоуправления?

12
0 / 0 / 0
Регистрация: 13.07.2012
Сообщений: 566
21.12.2012, 03:16 2
Цитата Сообщение от tirmyk
Методом вытыкания, выяснил, что питание он каким-то адским образом получает через MOSI от ведущего.
Ничего удивительного. Вы выдаете push-pull, тобишь силовую "1" на эту линию, а контроллер с другой стороны через внутренний защитный диод пропускает это напряжение на свою шину питания и включается. Это так называемая "паразитная" запитка от порта.
0
0 / 0 / 0
Регистрация: 24.02.2010
Сообщений: 804
21.12.2012, 03:17 3
По первому вопросу - все правильно, так как ведущий занял линию MISO ведомого, по которой идет программирование, а пограмматор не может ее продавить. т.е. на одной линии два источника. На момент программирования надо либо ведущий контроллер в ресет садить, либо перемыку на эту линию ставить, чтобы отключать ведущий на время программирования.
По второму - паразитное питание через IO ноги. Обычно так вылетают микрухи, так как по даташиткам Абсолютно максимальные значения вольтажа VCC+0.5, а у вас в данном случае VCC = 0, и в данной ситуации максимально допустимое напряжение может быть 0.5 вольта, а у вас все ... 5 (или 3.3 если вы схему от 3х вольт питаете).
0
1 / 1 / 0
Регистрация: 17.12.2012
Сообщений: 425
21.12.2012, 03:34 4
По первому вопросу - все правильно, так как ведущий занял линию MISO ведомого, по которой идет программирование, а пограмматор не может ее продавить
Я программирую через boottooder(через UART т.е.). Значит причина не в том, что вы написали?
Ничего удивительного. Вы выдаете push-pull, тобишь силовую "1" на эту линию, а контроллер с другой стороны через внутренний защитный диод пропускает это напряжение на свою шину питания и включается. Это так называемая "паразитная" запитка от порта.
Про паразитную запитку погуглю щас, спасибо.
0
0 / 0 / 0
Регистрация: 24.02.2010
Сообщений: 804
21.12.2012, 03:40 5
Цитата Сообщение от tirmyk
Я программирую через boottooder(через UART т.е.). Значит причина не в том, что вы написали?
А. Проскочил слово бутлоадер.

Ну тут уже вам надо смотреть, как оно в бутлоадер попадает, по каким условиям и т.д.
По идее внешние соединения не влияют на работу бутлоадера, если он сам за внешние линии не "цепляется".
0
0 / 0 / 0
Регистрация: 24.02.2010
Сообщений: 804
21.12.2012, 03:41 6
Хотя еще надо глянуть на напряжение проца, там вроде как было что то на предмет минимального напряжения для прошивки флеша.
0
0 / 0 / 0
Регистрация: 02.10.2012
Сообщений: 1,946
21.12.2012, 04:02 7
По первому вопросу - все правильно, так как ведущий занял линию MISO ведомого, по которой идет программирование,
Это как-то в корне не правильно. Программирование Slave всегда осуществляется по линии MOSI сие расшифровывается так
MASTER OUT - SLAVE IN
MISO - MASTER IN - SLAVE OUT
Посему ПИНЫ MOSI мастера и SLAVE соеденены между собой.
ПИНЫ MISO по желанию
И , если мне не изменяет память , порты надо настраивать . Не помню точно , утром посмотрю. Но вообщем то в DS - это есть

0
1 / 1 / 0
Регистрация: 17.12.2012
Сообщений: 425
21.12.2012, 04:03 8
Бутлоадер Дихалтовский. Ни за что кроме уарта не цепляется вроде...
Питание от USB. Напряжение 4,8 В при обоих работающих контроллерах + 4 нуля на семисегментном индикаторе. При ресете ведомого(и гашении индикатора соответственно) поднимается до 5 В
Мистика какая-то =)
0
0 / 0 / 0
Регистрация: 24.02.2010
Сообщений: 804
21.12.2012, 05:02 9
Цитата Сообщение от tirmyk
Бутлоадер Дихалтовский. Ни за что кроме уарта не цепляется вроде...
Питание от USB. Напряжение 4,8 В при обоих работающих контроллерах + 4 нуля на семисегментном индикаторе. При ресете ведомого(и гашении индикатора соответственно) поднимается до 5 В
Мистика какая-то =)
Посмотрите питание осциллом в режиме канала АС, 100 mV на деление с включенным ведомым. Скорее всего там шумы хорошие, и питание проседает ниже 4.5 вольт.
Если у вас мега16 которая от 4.5 вольт работает, то, если верить даташитке, при низком питании флеш может "ломаться" при записи.

@ YTYOUT, угумс. Перепутал названия пинов. Уели таки. :)
0
1 / 1 / 0
Регистрация: 17.12.2012
Сообщений: 425
21.12.2012, 05:56 10
Осциллографа нет.
Заменил питание - сделал от внешнего БП DLink-овского. Теперь напряжение стабильно 5,12 В, судя по мультиметру за 500 рублей. =) Ничего не изменилось. Откуда там шумам взяться вообще? Как микроконтроллер, нифига не делающий тем более, может их создать?
Влепил в цепь питания конденсатор на 1000 мкф на всякий случай, тоже не помогло... Более того, отключил нафиг SPI-провода, осталось по сути просто два микроконтроллера, к которым подключено питание, земля и ресет. В схематике точно ошибок нет. И всё равно - при обоих включенных мк, не удается прошить через бутлоадер ни одну, ни другую.
0
1 / 1 / 0
Регистрация: 17.12.2012
Сообщений: 425
21.12.2012, 06:17 11
Далее - прошил оба МК голой прошивкой, только бутлоадер. Та же картина! Но стоит отключить питание от одного МК - второй грузит бутлоадер без проблем. Как такое может быть? =)
0
0 / 0 / 0
Регистрация: 02.10.2012
Сообщений: 1,946
21.12.2012, 21:06 12
А Вы представляете , что твориться на шине SPI по MISO, когда два проца пытаются ответить , что у них усё в порядке (не порядке) и делают это одновременно.
Уели таки. :)
Даже не собирался. Просто , если кто-то ещё будет читать , может не правильно поступить и так Инет полное недорозумение , что бы не плодить ещё одно.
0
0 / 0 / 1
Регистрация: 22.01.2010
Сообщений: 4,000
24.12.2012, 20:36 13
Там надо ss всегда настраивать на ваш вход или на выход. В обеих мк. Иначе спи адово глючит.
0
24.12.2012, 20:36
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.12.2012, 20:36
Помогаю со студенческими работами здесь

Непонятный глюк C#
Объясните пожалуйста, почему в результате выполнения нижеприведенного кода в комбобоксе Dlin в...

Непонятный глюк !
Доброго времени суток уважаемые форумчане! Написал панель инструментов для IE с использованием...

Непонятный глюк
Собрался реализовать простенькую програмку на qt и получил такое, хз может кто сталкивался. ...

непонятный глюк
все опять в вэб. имею на базу права манагера. через вэб авторизовам. могу создавать документы через...

Непонятный глюк.
Какой-то непонятный глюк образовался, никак побороть не могу :blink: В общем есть форма, в ней было...

PROTEUS в ATMEGA16 не видит нового значения OCR0. Глюк?
Добрый день. Ребята, никто не сталкивался с таким? Если запустить таймер 0 (или таймер 2, ведет...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru