реклама на сайте
подробности

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> Управление мегой от ПК (через SPI)
zi4rox
сообщение Apr 20 2009, 14:39
Сообщение #16


Участник
*

Группа: Участник
Сообщений: 50
Регистрация: 4-04-08
Пользователь №: 36 480



Всё вроде делаю правильно, а нужного результата не получаю. Попробую собрать всё в кучу, и описать что получается.

Итак на данный момент код прошивки такой:

Код
#include <mega16.h>
#include <io.h>

#define DDR_SPI DDRB
#define DD_MISO PORTB.6

void SPI_SlaveInit(void)
{
/* Set MISO output, all others input */
DDR_SPI = (1 << 6);
/* Enable SPI */
SPCR = 0x40;
}

unsigned char SPI_SlaveReceive(void)
{
/* Wait for reception complete */
while(!(SPSR & (1 << 7)));
/* Return data register */
return SPDR;
}

void main (void){

SPI_SlaveInit();
DDRA = 0xFF;

while (1){
//SPI_SlaveReceive();
PORTA = SPDR;
}

}


Как в реальности работает этот код:
1. МК запускается (светодиоды выключены)
2. Я посылаю байт на МК (светодиоды выключены)
// Т.е - по сути ничего не происходит
3. Если я делаю RESET то на светодиодах появляется переданный в пункте 2 байт (PORTA = SPDR;)
// Значит всё таки хоть и как-то криво, но байт передается
4. Если после пункта 3 (когда горят светодиоды), я посылаю ещё раз байт на МК - то всё снова гаснет, и отобразится лишь при следующем перезапуске

Ещё стоит заметить, что в коде я закомментировал и не использую процедуру ожидания завершения передачи байта (из даташита):
Код
unsigned char SPI_SlaveReceive(void)
{
/* Wait for reception complete */
while(!(SPSR & (1 << 7)));
/* Return data register */
return SPDR;
}


Путем отладки - выяснил, что условие while(!(SPSR & (1 << 7))) - никогда не будет пройдено => ничего не произойдет

Вот такая вот загогулина
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Apr 20 2009, 16:30
Сообщение #17


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Тем не менее у вас всё абсолютно правильно. Инициализация верна и приём символа абсолютно верен.

Согласно схемы приведенной в посте 1 у вас SS вывод в обрыве. SS - слэйв селект. При 1 обязательно, и при обрыве с высокой степенью вероятности у вас SPI в режиме слэйв не будет работать. Реально этот вывод у вас заземлён?
Go to the top of the page
 
+Quote Post
zi4rox
сообщение Apr 20 2009, 17:12
Сообщение #18


Участник
*

Группа: Участник
Сообщений: 50
Регистрация: 4-04-08
Пользователь №: 36 480



Да, я SS посадил на землю - без этого даже кривая передача байта была невозможной
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Apr 20 2009, 17:55
Сообщение #19


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Блин просмотрел. У вас ошибка в голове.
Надо так

void main (void){

SPI_SlaveInit();
DDRA = 0xFF;

while (1){
PORTA = SPI_SlaveReceive();
}

}
Go to the top of the page
 
+Quote Post
SysRq
сообщение Apr 20 2009, 17:57
Сообщение #20


Чайник, 1 литр
****

Группа: Свой
Сообщений: 655
Регистрация: 17-05-06
Из: Moscow
Пользователь №: 17 168



Питается от чего оно у вас? Фильтры по питанию стоят?
Go to the top of the page
 
+Quote Post
zi4rox
сообщение Apr 20 2009, 18:32
Сообщение #21


Участник
*

Группа: Участник
Сообщений: 50
Регистрация: 4-04-08
Пользователь №: 36 480



Цитата(SasaVitebsk @ Apr 20 2009, 21:55) *
Блин просмотрел. У вас ошибка в голове.
Надо так

void main (void){

SPI_SlaveInit();
DDRA = 0xFF;

while (1){
PORTA = SPI_SlaveReceive();
}

}


Так я уже пробывал =( Попробывал ещё раз - результат тотже плачевный. Никакой реакции. Мне кажется что загвоздка в самой функции ожидания окончания приёма - SPI_SlaveReceive() - на ней программа стопориться и не выполняется

Цитата(SysRq @ Apr 20 2009, 21:55) *
Питается от чего оно у вас? Фильтры по питанию стоят?


От блока питания, что сам собирал там фильтрация есть - всё нормально, думаю затык не в этом.

Что самое интересное, как всегда вылезет, что причина в чем то очень простом и возможно банальном =)
Go to the top of the page
 
+Quote Post
andrikk
сообщение Apr 20 2009, 19:03
Сообщение #22


Участник
*

Группа: Участник
Сообщений: 36
Регистрация: 23-07-08
Пользователь №: 39 167



попробуйте использовать 4094 (8–STAGE SHIFT-AND-STORE BUS REGISTER).
для Ваших задач, как нарисовано на схеме, самое оно.
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Apr 20 2009, 19:31
Сообщение #23


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Да не может быть никаких затыков. Это не медицина. Здесь всё чётко до безобразия. Включил - хомуты устранил - работает.

Итак если у вас так как вы писали, а именно:
Код
#include <mega16.h>
#include <io.h>

#define DDR_SPI DDRB
#define DD_MISO PORTB.6

void SPI_SlaveInit(void)
{
/* Set MISO output, all others input */
DDR_SPI = (1 << 6);
/* Enable SPI */
SPCR = 0x40;
}

unsigned char SPI_SlaveReceive(void)
{
/* Wait for reception complete */
while(!(SPSR & (1 << 7)));
/* Return data register */
return SPDR;
}

void main (void){

SPI_SlaveInit();
DDRA = 0xFF;

while (1){
PORTA = SPI_SlaveReceive();
}

}


То всё будет работать.

Для того, чтобы исключить ошибки связи предлагаю подать на MOSI единицу (если светодиоды зажигаются единицей или 0 - если нулём) и "поискрить" SCK. Предварительно подперев её 0 (поискрить на 1).

Я уверен, что ваши светодиоды - загорятся.


PS: Кстати о порте А. Надеюсь питание на AVCC вы подали?
Go to the top of the page
 
+Quote Post

2 страниц V  < 1 2
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 23:06
Рейтинг@Mail.ru


Страница сгенерированна за 0.22221 секунд с 7
ELECTRONIX ©2004-2016