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

 
 
> at91sam7s spi, Помогите понять что происходит
en0t
сообщение Feb 27 2010, 12:31
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 59
Регистрация: 31-01-08
Пользователь №: 34 612



Здравствуйте, подскажите что к чему.
Есть есть задача связать at91sam7s256(мастер) и attinny85(слейв) по SPI, всё сделал как написано по даташиту, связь есть но странная.От мастера к слейву данные доходят нормально а вот от слейва они как будто идут с задержкой в 2 байта.
Как будто приём SPI настроен на 24 бита.


прием мастером осуществлён вот так
Код
AT91PS_SPI pSPI = AT91C_BASE_SPI;
while( !( pSPI->SPI_SR & AT91C_SPI_TDRE ) ); // transfer compl. wait
pSPI->SPI_TDR = (dat & 0xFFFF) | (((~(1 << 2)) & 0xF)<< 16);


while( !( pSPI->SPI_SR & AT91C_SPI_RDRF ) ); // wait for char

return (unsigned char)( pSPI->SPI_RDR ); // it's important to read RDR here!



зы. тяжёло описать правельно что у меня происходит но думаю кто с этим сиалкивался поймёт.
Go to the top of the page
 
+Quote Post
2 страниц V   1 2 >  
Start new topic
Ответов (1 - 22)
aaarrr
сообщение Feb 27 2010, 12:54
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(en0t @ Feb 27 2010, 15:31) *
тяжёло описать правельно что у меня происходит но думаю кто с этим сиалкивался поймёт.

Постарайтесь все-таки.

P.S. Подозреваю, что где-то при предыдущих передачах не читается RDR. Если все передачи организованы так, как в приведенном фрагменте, то значит проблема где-то в другом месте.
Go to the top of the page
 
+Quote Post
en0t
сообщение Feb 27 2010, 14:12
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 59
Регистрация: 31-01-08
Пользователь №: 34 612



aaarrr , спасибо действительно помогло.

вот ещё есть вопросик.

Код
SlaveSPITransfer:
        out        USIDR,r16
        ldi        r16,(1<<USIOIF)
        out        USISR,r16
SlaveSPITransfer_loop:
        in        r16, USISR
        sbrs    r16, USIOIF
        rjmp    SlaveSPITransfer_loop
        in        r16,USIDR
        ret



в данном примере для слейва сначало идет передача а потом приём.А можно наоборот сначала прием обработка и передача. а то как то вся логика теряется.
спасибо
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Feb 27 2010, 14:16
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(en0t @ Feb 27 2010, 17:12) *
в данном примере для слейва сначало идет передача а потом приём.А можно наоборот сначала прием обработка и передача. а то как то вся логика теряется.

А как вы себе это представляете? Если SPI что-то принимает, то, соответственно, обязан и что-то передавать. И это что-то должно быть загружено заранее.
Все остальное решается протоколами верхнего уровня.
Go to the top of the page
 
+Quote Post
en0t
сообщение Feb 27 2010, 14:25
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 59
Регистрация: 31-01-08
Пользователь №: 34 612



да я понимаю , спросил так на всякий случай, а вдруг.
Цитата
Все остальное решается протоколами верхнего уровня.

а это как , ткните ссылкой если не затруднит.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Feb 27 2010, 14:33
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(en0t @ Feb 27 2010, 17:25) *
а это как , ткните ссылкой если не затруднит.

Ссылкой не ткну, но все и так очевидно - добавляйте don't care байты там, где слейву нужно "подумать", или работайте в режиме запрос-ответ.
Go to the top of the page
 
+Quote Post
en0t
сообщение Feb 27 2010, 14:40
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 59
Регистрация: 31-01-08
Пользователь №: 34 612



aaarrr, ещё раз спасибо.Буду думать примерять.
Go to the top of the page
 
+Quote Post
shrek
сообщение Apr 14 2010, 07:47
Сообщение #8


Частый гость
**

Группа: Участник
Сообщений: 125
Регистрация: 1-12-08
Из: г. Орел
Пользователь №: 42 126



У меня была почти такая же проблема с SPI только я его использовал и использую с PDC.
В первом случае в шине стояли резисторы по 300 Ом... Из-за этого спустя некоторое время при отправке команд протокольных и прочее пакет сдвигался на один байт... выпаял резисторы поставил перемычки глюк исчез!
Потом опять проявился этот эффект но это по моему мнению уже было связанно с загруженностью одного из контроллеров при попытке отправить команду или данные тут же сдвигался на один байт! именно передача со слейва!
Взял за правило инициализировать PDC при следующем приеме передаче одновременно и на прием и на передачу!
Go to the top of the page
 
+Quote Post
strannyi
сообщение Apr 14 2010, 11:02
Сообщение #9


Участник
*

Группа: Участник
Сообщений: 40
Регистрация: 8-07-07
Из: Ярославль
Пользователь №: 28 962



Потери в PDC еще возникают из-за загруженности внутренней шины ARM-а
Замечал такое когда работа идет на высоких скоростях.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Apr 14 2010, 11:43
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(shrek @ Apr 14 2010, 12:02) *
У меня была почти такая же проблема с SPI только я его использовал и использую с PDC.
В первом случае в шине стояли резисторы по 300 Ом... Из-за этого спустя некоторое время при отправке команд протокольных и прочее пакет сдвигался на один байт... выпаял резисторы поставил перемычки глюк исчез!

А объяснить Вы столь странную связь можете? Я - нет. И очень-очень сильно сомневаюсь, что дело было в резисторах.

Цитата(strannyi @ Apr 14 2010, 15:17) *
Потери в PDC еще возникают из-за загруженности внутренней шины ARM-а
Замечал такое когда работа идет на высоких скоростях.

Когда PDC пытается отгрызть более 1/8 пропускной способности шины - да, бывает. Правда, одного SPI для этого мало.


P.S. Если кто не заметил, проблема топикстартера решена.
Go to the top of the page
 
+Quote Post
shrek
сообщение May 21 2010, 11:14
Сообщение #11


Частый гость
**

Группа: Участник
Сообщений: 125
Регистрация: 1-12-08
Из: г. Орел
Пользователь №: 42 126



Цитата
А объяснить Вы столь странную связь можете? Я - нет. И очень-очень сильно сомневаюсь, что дело было в резисторах.


Могу! Помехи от двигателя постоянного тока. Из за резисторов вероятность возникновения глюка стала 0.99! Практически всегда после начала работы шумящего элемента глюк вылезал! Поставил перемычки вероятность возникновения снизилась примерно до 0.01. А с работой шагового двигателя (и такой имеется в приборе, требовалась реализация микрошага) вероятность глюка повысилась до 0.3 - 0.4. Проблему решил программно. При ошибке CRC slave устройства перезапускали SPI и перенастраивали канал PDC. Работоспособность восстановилась. Байты бегали туда сюда, данными модули между собой обменивались)

Цитата
P.S. Если кто не заметил, проблема топикстартера решена.

мне кажется эта тема и проблема будет всегда возникать)))
пора бы выложить рекомендации в отдельную тему форума по настройке и работе с SPI)))

Сообщение отредактировал shrek - May 21 2010, 11:15
Go to the top of the page
 
+Quote Post
aaarrr
сообщение May 21 2010, 11:22
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(shrek @ May 21 2010, 15:14) *
Могу! Помехи от двигателя постоянного тока.

Сдвиг на один байт объяснить можете? Ведь не на один бит, не на 5, 6 или 11, а ровно на байт. Такая умная помеха?

Цитата(shrek @ May 21 2010, 15:14) *
мне кажется эта тема и проблема будет всегда возникать)))
пора бы выложить рекомендации в отдельную тему форума по настройке и работе с SPI)))

Это большой и неблагодарный труд. Вообще, для понимания работы атмеловского SPI из SAM7 нужно:
1. Изучить даташит
2. Изучить аппноту для толкования неясностей даташита (а они есть)
3. Задать вопрос здесь, если не помогло smile.gif
Go to the top of the page
 
+Quote Post
xelax
сообщение May 24 2010, 05:57
Сообщение #13


Местный
***

Группа: Свой
Сообщений: 370
Регистрация: 7-11-06
Пользователь №: 22 035



Цитата(aaarrr @ May 21 2010, 15:22) *
Вообще, для понимания работы атмеловского SPI из SAM7 нужно:
1. Изучить даташит
2. Изучить аппноту для толкования неясностей даташита (а они есть)
3. Задать вопрос здесь, если не помогло smile.gif


Я бы ещё один пункт добавил.
4. Изучить errata.

Он весьма обширный, в том числе и на SPI.
Go to the top of the page
 
+Quote Post
shrek
сообщение May 27 2010, 06:59
Сообщение #14


Частый гость
**

Группа: Участник
Сообщений: 125
Регистрация: 1-12-08
Из: г. Орел
Пользователь №: 42 126



Цитата
Сдвиг на один байт объяснить можете? Ведь не на один бит, не на 5, 6 или 11, а ровно на байт. Такая умная помеха?

счетчик PDC делает декремент после принятия именно байта. Возникла помеха SPI посчитал что это очердной тактовый импульс (или несколько, или вообще не посчитал что был тактовый импульс). В PDC байты ушли раньше положенного (или вообще не ушли, т.е. уйдут при следующем обращении мастера к слейву), а мастер допустим еще передает (к случаю если PDC слейва раньше примет байты). Если прерывание быстро обрабатывается (например PDC заново инициализируется в начале работы подпрограммы обработки прерывания, а частота тактовых импульсов SPI не превышает 1МГц), то получается мастер еще не окончил предыдущую передачу, а слейв уже новую начинает...
Примерно по тому же принципу если бы слейв был настроен на прием передачу 8 байт, а мастер на прием передачу 9 байт.

Сообщение отредактировал shrek - May 27 2010, 07:08
Go to the top of the page
 
+Quote Post
aaarrr
сообщение May 27 2010, 08:03
Сообщение #15


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(shrek @ May 27 2010, 10:59) *
Возникла помеха SPI посчитал что это очердной тактовый импульс...

...и данные сместились на бит, а никак не на байт. А уж PDC тут вообще ни при чем.
Go to the top of the page
 
+Quote Post
shrek
сообщение May 27 2010, 15:18
Сообщение #16


Частый гость
**

Группа: Участник
Сообщений: 125
Регистрация: 1-12-08
Из: г. Орел
Пользователь №: 42 126



Цитата
...и данные сместились на бит, а никак не на байт. А уж PDC тут вообще ни при чем.

сместились все правильно. если это был последний тактовый импульс для данного байта, но не последний для пакета или последний какая разница помеха может возникнуть в любом месте пакета, то SPI генерит флаг что мол буфер полный этот байт идет в PDC. Данные сместились то есть как бы слейв посчитал что пакет например из 9 байт принял, а мастер еще передает. Судя из моих рассуждений по идее данные смещались бы на биты, но не на байты, признаю ошибку, но... На осцыле данные смещались строго на 1 - 2 байта!!! laughing.gif бывали случаи даже гуляли по пакету (правда в одну сторону левую, если смотреть на осциле).

Сообщение отредактировал shrek - May 27 2010, 15:20
Go to the top of the page
 
+Quote Post
aaarrr
сообщение May 27 2010, 15:29
Сообщение #17


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(shrek @ May 27 2010, 19:18) *
На осцыле данные смещались строго на 1 - 2 байта!!! laughing.gif

Тогда причину нужно искать в программе.
Go to the top of the page
 
+Quote Post
shrek
сообщение May 28 2010, 07:09
Сообщение #18


Частый гость
**

Группа: Участник
Сообщений: 125
Регистрация: 1-12-08
Из: г. Орел
Пользователь №: 42 126



Цитата
Тогда причину нужно искать в программе.

До включения ШИМ все работает как часы, без ошибок длительное время. На сколько включал на столько и работал прибор до включения ШИМ. Даю команду включения ШИМ каналов по SPI. Вот собственно вся дурь после этого и начинается... Причем канал ШИМ работает на шинный усилитель, шинный усилитель работает на пару транзисторов Si2301 Si2302, эта пара работает на транзистор IRLIZ34, последний работает на индуктивную нагрузку (обмотка двигателя). Таких каналов 7. 4 канала работают на шаговый двигатель, 1 канал комутит двигатель постоянного тока. причем 4 канала (которые работают на ШД) расположены ближе к разьему с которого раздается питание. Как только грубо говоря включаю двигатель постоянного тока начинает лезть помеха но влияния особого не оказывает (иногда возникают ошибки примерно раз в 5 - 10 минут). Как только включаю ШД то тут все и начинается smile.gif. Ошибки каждую секунду идут. laughing.gif

Сообщение отредактировал shrek - May 28 2010, 07:17
Go to the top of the page
 
+Quote Post
romazan
сообщение Mar 22 2011, 13:23
Сообщение #19





Группа: Новичок
Сообщений: 3
Регистрация: 21-03-11
Пользователь №: 63 771



Всем привет.
У меня такая проблема, шлю данные в дисплей, он не запускается. Ладно. Начинаю вручную отлаживать - F11, данные начинают выходить и дисплей нормально запускается. Пробовал ставить задержки в секунду!!! Такая-же байда. У кого есть идеи?
Прикрепленные файлы
Прикрепленный файл  Blinky.rar ( 137.79 килобайт ) Кол-во скачиваний: 27
 
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Mar 22 2011, 13:54
Сообщение #20


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (romazan @ Mar 22 2011, 15:23) *
У кого есть идеи?
Я бы поменял местами дерганье RS и ожидание окончания передачи:
CODE
    while(!(SPI0->SPI_SR & AT91C_SPI_TDRE))
       ;
    if(cmd==1){
        PIOB->PIO_SODR = LCD_RS;
        }
    else{
        PIOB->PIO_CODR = LCD_RS;
        }



--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
romazan
сообщение Mar 22 2011, 20:25
Сообщение #21





Группа: Новичок
Сообщений: 3
Регистрация: 21-03-11
Пользователь №: 63 771



Вроде помогло, но глюков дофига! maniac.gif Баги! Баги! В ручном режиме данные идут нормально - как запускаю в автомат, начинается ппц. То может вместо постановки курсора в позицию (0:0) унести его куда угодно, то вместо 3 в порт идёт 1. Добавил функцию Image - выводин изображение из массива, так на экране какая-то какофония из пикселей.
CODE
static void image(void){
volatile word a;
LcdSend( 0x20, LCD_CMD, 0);
LcdSend( 0x40, LCD_CMD, 0);
LcdSend( 0x80, LCD_CMD, 0);
for(a=0;a<=614;a++)
{
LcdSend(ImageGraf[a], LCD_DAT, 0);
};
};
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Mar 22 2011, 20:40
Сообщение #22


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Для отслеживания окончания передачи следует опрашивать флаг TXEMPTY, а не TDRF. В противном случае RS будет переключаться когда попало.
Go to the top of the page
 
+Quote Post
romazan
сообщение Mar 25 2011, 10:27
Сообщение #23





Группа: Новичок
Сообщений: 3
Регистрация: 21-03-11
Пользователь №: 63 771



Спасибо за советы. Заработало. Буду с дисплеем разбираться, почему-то медленно заливается, вроде скорость на максимум поставил, но он всё равно тупит.
Go to the top of the page
 
+Quote Post

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

 


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


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