Страница 1 из 2
глюки по SPI
Добавлено: Вт сен 11, 2012 16:10:58
kama3er
Сильно прошу не бить, связь двух МК осилил самостоятельно пересылку двух байт тоже осилил ....
Осталось подружить три контроллера один мастер два slave, и тут затык при передаче мастера все посылки проходят,
а вот ответы от slave- oв теряются предположительно из-за одновременно включенных на slave- ах выходов MISO.
Помогите , а то моя голова уже кругом и лапки кверху...
проэкт в протеусе 7,7 sp2

Re: глюки по SPI
Добавлено: Вт сен 11, 2012 16:21:14
korsaj
Воткните в шину по резистору междду каждым мк и с помошью осцилограмок посмотрите причины коллизий.
Re: глюки по SPI
Добавлено: Вт сен 11, 2012 16:35:08
Meteor
А сигналы SS у каждого помощника свои, или на одну линию повесили?
Должны быть у каждого персональный сигнал выбора, тогда никаких коллизий не будет
Re: глюки по SPI
Добавлено: Вт сен 11, 2012 16:37:56
kama3er
да ессно у каждого корпуса свой SS
Re: глюки по SPI
Добавлено: Ср сен 12, 2012 11:02:31
kama3er
Решено кому-то может пригодиться. Прерывание по SPI генериться только после получения полного байта в SPDR
Соответственно ноги у двух slave находятся в состоянии выходов и когда один из них бросает пакет то второй высаживает линию.
Решил проблему так: задействовал внешнее прерывание (у меня в проэкте оно всё-равно используется и проверяю если на ноге SS=0 то перевожу ногу на выход) соответственно конфликтов нет...
Мож у кого есть решение поэлегантнее, приму к рассмотрению, мой проект пока еще не окончательный,
планируется передача от одного мастера - произвольному slave пакет произвольной длины. Работаю над продолжением промежуточный вариант предосталяю на рассотрение
Re: глюки по SPI
Добавлено: Ср окт 31, 2012 09:26:21
kama3er
новый прикол... после отладки передачи 2-х байт... загнал этот кусок передачи в бОльший проект.И вуаля, при первой посылке по сигналам SCK, MOSI идет заполнение как при ШИМ с частотой Fcpu, плюс ко всему после первой посылки теряются 5-7 посылок. И следующие уже идут без заполнения и без потерь...Помогите.....
Re: глюки по SPI
Добавлено: Ср окт 31, 2012 09:35:11
TripleKill
Фильтры по питанию процов есть?
Напарывался уже пару раз на это. Не с SPI, но всё-таки было. Даже если сам БП помех не выдаёт.
Re: глюки по SPI
Добавлено: Ср окт 31, 2012 09:42:21
kama3er
после 7805 стоит 470uF.
Главное proteus сцуко мне показывает все ок даже на удвоенной скорости передачи, а вот в железке никак не идет..
Re: глюки по SPI
Добавлено: Ср окт 31, 2012 11:12:39
Jack_A
Вот за что я люблю Протеус ( и потому им не пользуюсь

) -- ему по фиг разводка платы, экранировка, наводки и т.д.
Ну что тут можно посоветовать, кроме банального : возьми осцилл и ...
Re: глюки по SPI
Добавлено: Ср окт 31, 2012 11:22:40
kama3er
Вот как раз осцыл и показывает смотри пост выше.....
Какая задержка должна быть/может быть от загрузки данных в регистр SPDR до выдачи их по SPI?
Нужна ли инициализация SPI каждый раз перед посылкой пачки байт?
Пишу в CVAVR инициализация SPI
// SPI initialization
// SPI Type: Master
// SPI Clock Rate: 4000,000 kHz
// SPI Clock Phase: Cycle Start
// SPI Clock Polarity: Low
// SPI Data Order: MSB First
//SPCR = 0x50;
SPCR=0xD0;
SPSR=0x00;
достаточно?
Re: глюки по SPI
Добавлено: Ср окт 31, 2012 11:27:42
kama3er
По осцылу заметил что заполнение частотой происходит только новоустановленный байт, то есть если в посылке устанавливается новый байт то он заполнен частотой Fcpu а осталые идут без заполнения и SCK тоже идут без заполнения уже со второй посылки..... Куда копать?????
Re: глюки по SPI
Добавлено: Ср окт 31, 2012 12:09:16
vitalik_1984
Чет я не понял, вы вроде пользуетесь CVAVR, и спрашиваете правильно ли регистры настроили.
В нем есть даже выбор master/slave
Сдается мне, что есть аппаратное разрешение коллизий.Ведь интерфейс аппаратный.
Re: глюки по SPI
Добавлено: Ср окт 31, 2012 12:18:04
kama3er
Ага только несколько раз я уже курил даташит, визард не правильно выставляет биты инициализации SPI.
Плюс (скорее минус) передача DWORD не реализована в визарде. WCOl молчит шоб ему.
Re: глюки по SPI
Добавлено: Ср окт 31, 2012 12:39:18
vitalik_1984
Похоже только вы разбираетесь как правильно выставить биты, а целая команда разработчиков вообще не вкуривают.
А передачу дворд можно слепить из передачи байта легко.
Re: глюки по SPI
Добавлено: Ср окт 31, 2012 13:56:56
kama3er
Я сказал только то, что я сказал не более не додумывайте лишнего...
Re: глюки по SPI
Добавлено: Ср окт 31, 2012 15:38:46
Kavka
kama3er писал(а):после 7805 стоит 470uF.
Главное proteus сцуко мне показывает все ок даже на удвоенной скорости передачи, а вот в железке никак не идет..
А керамика около МК, как можно ближе к ножкам питания имеется?
Схему обычной картинкой можете "прицепить"?
За одно и фото монтажа не плохо было бы.
Re: глюки по SPI
Добавлено: Ср окт 31, 2012 17:33:56
kama3er
Вопрос с заполнением снимается... Это сцуко говенные осциллографы AKTAKOM не успевал отрисовывать... проверил на TEKTRONIX все ок - нету там заполнения.. Извиняюсь за дезинформацию ...
Антиреклама не пользуйтесь люди осцылами фирмы AKTAKOM мало того что, подобные глюки ловить приходиться, так они еще драйвера по win7 зажимают продают как отдельное ПО, хотя эта же серия выпускаемая сейчас комплектуется по умолчанию драйвеами под win7. Вот и приходиться держать еще и win XP.... Нехорошие люди!
Re: глюки по SPI
Добавлено: Ср окт 31, 2012 17:41:01
kama3er
Kavka монтажки, нет все собрано на PINBOARD...
нашел что у меня выдает spi часть посылки в железе...
лезут только младшие байты...
Ищу дальше
Re: глюки по SPI
Добавлено: Чт ноя 01, 2012 15:11:28
kama3er
Вот мой кусочек кода передачи приема
в PROTEUS посылки летят на ура
в железе хрень какая-то
пропадают биты ....
такое впечатление что в SPDR попадает какая-то фигня вместо нужного значения
ХЕЛП МИ ПЛИЗ!!!
volatile unsigned long int add_value@0x01D5;
volatile unsigned int res_volt@0x01D9;
volatile unsigned char resive[4]@0x01DD, transfer[4]@0x01E1;
void SPI_MasterTransmit(long int cData)
{
char a,i;
#asm
clr r26
sts 0x01E1, r26
sts 0x01E2, r26 ;очищаем регистр
sts 0x01E3, r26 ;пустое значение во все байты переменной transfer
sts 0x01E4, r26 ;
sts 0x01DD, r26 ;пустое значение во все байты переменной resive
sts 0x01DE, r26 ;
sts 0x01DF, r26 ;
sts 0x01E0, r26 ;
#endasm
if (cData==add_value)
{
i=4;
#asm
lds r26,0x01D8 ; //add_value
sts 0x1E1, r26 ; //transfer
lds r26,0x01D7 ;//затасовываем перемм int Add_value в массив char transfer[]
sts 0x01E2, r26 ;
lds r26,0x01D6 ;
sts 0x01E3, r26 ;
lds r26,0x01D5 ;
sts 0x01E4, r26 ;
#endasm
PORTB &= ~(1<<1);
}
if (cData==volt_step)
{
i=2;
#asm
lds r26,0x01E6 ; //volt
sts 0x1E1, r26 ; //transfer
lds r26,0x01E5 ;// таж самое только с volt
sts 0x1E2, r26 ;
#endasm
PORTB &= ~(1<<2);
}
for (a = 0; a < i;)
{
delay_us(10);
SPDR = transfer[a]; // даные для записи
while(!(SPSR & (1<<SPIF))) // ждем подтверждения прохода байта - байт принят
;
resive[a]=SPDR;
a++;
};
if (cData==add_value)
{
PORTB |= (1<<1);
};
if (cData==volt_step)
{
PORTB |= (1<<2);
#asm
lds r24,0x01DD ;загружаем байт переменной resive в переменную res_volt
sts 0x01DA, r24
lds r24,0x01DE
sts 0x01D9, r24
#endasm
};
Re: глюки по SPI
Добавлено: Чт ноя 01, 2012 19:31:13
vitalik_1984
Кошмар, черт могу сломит.
Удивляюсь как вообще у вас этот код работает.
Может добавите алгоритм действий в виде блок схемы, чтобы было понятно чего вы добиваетесь?
И почему у вас простые массивы выглядят как адреса каждой ячейки?Разве нельзя адресу задать осмысленное имя и с ним работать?
Типа такого:
Код: Выделить всё
_receive0 equ @0x01DD
_receive1 equ _resive0+1