|
at91sam7s spi, Помогите понять что происходит |
|
|
|
Feb 27 2010, 12:31
|
Участник

Группа: Участник
Сообщений: 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! зы. тяжёло описать правельно что у меня происходит но думаю кто с этим сиалкивался поймёт.
|
|
|
|
2 страниц
1 2 >
|
 |
Ответов
(1 - 22)
|
Feb 27 2010, 14:12
|
Участник

Группа: Участник
Сообщений: 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 в данном примере для слейва сначало идет передача а потом приём.А можно наоборот сначала прием обработка и передача. а то как то вся логика теряется. спасибо
|
|
|
|
|
Feb 27 2010, 14:25
|
Участник

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

|
да я понимаю , спросил так на всякий случай, а вдруг. Цитата Все остальное решается протоколами верхнего уровня. а это как , ткните ссылкой если не затруднит.
|
|
|
|
|
Feb 27 2010, 14:40
|
Участник

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

|
aaarrr, ещё раз спасибо.Буду думать примерять.
|
|
|
|
|
Apr 14 2010, 11:02
|
Участник

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

|
Потери в PDC еще возникают из-за загруженности внутренней шины ARM-а Замечал такое когда работа идет на высоких скоростях.
|
|
|
|
|
Apr 14 2010, 11:43
|
Гуру
     
Группа: Свой
Сообщений: 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. Если кто не заметил, проблема топикстартера решена.
|
|
|
|
|
May 21 2010, 11:14
|
Частый гость
 
Группа: Участник
Сообщений: 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
|
|
|
|
|
May 21 2010, 11:22
|
Гуру
     
Группа: Свой
Сообщений: 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. Задать вопрос здесь, если не помогло
|
|
|
|
|
May 24 2010, 05:57
|

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

|
Цитата(aaarrr @ May 21 2010, 15:22)  Вообще, для понимания работы атмеловского SPI из SAM7 нужно: 1. Изучить даташит 2. Изучить аппноту для толкования неясностей даташита (а они есть) 3. Задать вопрос здесь, если не помогло  Я бы ещё один пункт добавил. 4. Изучить errata. Он весьма обширный, в том числе и на SPI.
|
|
|
|
|
May 27 2010, 06:59
|
Частый гость
 
Группа: Участник
Сообщений: 125
Регистрация: 1-12-08
Из: г. Орел
Пользователь №: 42 126

|
Цитата Сдвиг на один байт объяснить можете? Ведь не на один бит, не на 5, 6 или 11, а ровно на байт. Такая умная помеха? счетчик PDC делает декремент после принятия именно байта. Возникла помеха SPI посчитал что это очердной тактовый импульс (или несколько, или вообще не посчитал что был тактовый импульс). В PDC байты ушли раньше положенного (или вообще не ушли, т.е. уйдут при следующем обращении мастера к слейву), а мастер допустим еще передает (к случаю если PDC слейва раньше примет байты). Если прерывание быстро обрабатывается (например PDC заново инициализируется в начале работы подпрограммы обработки прерывания, а частота тактовых импульсов SPI не превышает 1МГц), то получается мастер еще не окончил предыдущую передачу, а слейв уже новую начинает... Примерно по тому же принципу если бы слейв был настроен на прием передачу 8 байт, а мастер на прием передачу 9 байт.
Сообщение отредактировал shrek - May 27 2010, 07:08
|
|
|
|
|
May 27 2010, 15:18
|
Частый гость
 
Группа: Участник
Сообщений: 125
Регистрация: 1-12-08
Из: г. Орел
Пользователь №: 42 126

|
Цитата ...и данные сместились на бит, а никак не на байт. А уж PDC тут вообще ни при чем. сместились все правильно. если это был последний тактовый импульс для данного байта, но не последний для пакета или последний какая разница помеха может возникнуть в любом месте пакета, то SPI генерит флаг что мол буфер полный этот байт идет в PDC. Данные сместились то есть как бы слейв посчитал что пакет например из 9 байт принял, а мастер еще передает. Судя из моих рассуждений по идее данные смещались бы на биты, но не на байты, признаю ошибку, но... На осцыле данные смещались строго на 1 - 2 байта!!!  бывали случаи даже гуляли по пакету (правда в одну сторону левую, если смотреть на осциле).
Сообщение отредактировал shrek - May 27 2010, 15:20
|
|
|
|
|
May 28 2010, 07:09
|
Частый гость
 
Группа: Участник
Сообщений: 125
Регистрация: 1-12-08
Из: г. Орел
Пользователь №: 42 126

|
Цитата Тогда причину нужно искать в программе. До включения ШИМ все работает как часы, без ошибок длительное время. На сколько включал на столько и работал прибор до включения ШИМ. Даю команду включения ШИМ каналов по SPI. Вот собственно вся дурь после этого и начинается... Причем канал ШИМ работает на шинный усилитель, шинный усилитель работает на пару транзисторов Si2301 Si2302, эта пара работает на транзистор IRLIZ34, последний работает на индуктивную нагрузку (обмотка двигателя). Таких каналов 7. 4 канала работают на шаговый двигатель, 1 канал комутит двигатель постоянного тока. причем 4 канала (которые работают на ШД) расположены ближе к разьему с которого раздается питание. Как только грубо говоря включаю двигатель постоянного тока начинает лезть помеха но влияния особого не оказывает (иногда возникают ошибки примерно раз в 5 - 10 минут). Как только включаю ШД то тут все и начинается  . Ошибки каждую секунду идут.
Сообщение отредактировал shrek - May 28 2010, 07:17
|
|
|
|
|
Mar 22 2011, 13:23
|
Группа: Новичок
Сообщений: 3
Регистрация: 21-03-11
Пользователь №: 63 771

|
Всем привет. У меня такая проблема, шлю данные в дисплей, он не запускается. Ладно. Начинаю вручную отлаживать - F11, данные начинают выходить и дисплей нормально запускается. Пробовал ставить задержки в секунду!!! Такая-же байда. У кого есть идеи?
Прикрепленные файлы
Blinky.rar ( 137.79 килобайт )
Кол-во скачиваний: 27
|
|
|
|
|
Mar 22 2011, 13:54
|

Гуру
     
Группа: Модераторы
Сообщений: 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)
|
|
|
|
|
Mar 22 2011, 20:25
|
Группа: Новичок
Сообщений: 3
Регистрация: 21-03-11
Пользователь №: 63 771

|
Вроде помогло, но глюков дофига!  Баги! Баги! В ручном режиме данные идут нормально - как запускаю в автомат, начинается ппц. То может вместо постановки курсора в позицию (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); }; };
|
|
|
|
|
Mar 25 2011, 10:27
|
Группа: Новичок
Сообщений: 3
Регистрация: 21-03-11
Пользователь №: 63 771

|
Спасибо за советы. Заработало. Буду с дисплеем разбираться, почему-то медленно заливается, вроде скорость на максимум поставил, но он всё равно тупит.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|