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

 
 
> глобальные грабли с spi1 в lpc214x, не работает на прием
diwil
сообщение Sep 29 2006, 06:56
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 366
Регистрация: 5-09-06
Из: Санкт-Петербург
Пользователь №: 20 107



Уважаемые,

Я тут наткнулся на следующие грабли -
запускаю СПИ1 в режиме мастера - CPOL = 1, CPHA = 1,
разрешаю прерывания - SSPIMSC = 8 (прерывания, когда очередь на передачу на половину пуста).

Стартую СПИ1 так -
1. очищаю приемную очередь:
while( SSPSR & (1<<2)) __dummy = SSPDR;

2. Записываю 1 байт в очередь
SSPDR = *out_buff++;

3. Разрешаю прерывания.

Осциллом смотрю на все ноги. На ногу MISO подаю данные, которые знаю.
Однако ножку SSEL1 дергаю сам. Вижу следующее -
Посылается один байт. Вызывается обработчик прерывания.

В обработчике прерывания я
1. проверяю - есть ли данные в приемной очереди :
while(SSPSR & (1<<2)) *in_buff++ = SSPDR;

2. Набиваю очередь на передачу
while(SSPSR & (1<<1)) SSPDR = *out_buff++;

3. Естественно, контролирую количество байт, но это не затрагивает обращение к переферийным регистрам.


Теперь собственно ГРАБЛИ:
1. В обработчике прерывания бит RNE (receive FIFO not empty) никогда не бывает установлен в единицу. А это значит, что ничего не принято - а это не понятно почему. Тем не менее, при запуске СПИ1 в приемной очереди есть данные всегда.

2. Передающая очередь никогда не бывает размером больше 2х - т.е. цикл
while(SSPSR & (1<<1)) SSPDR = *out_buff++;
выполняется не более 2х раз!!! (размер очереди - 8)


мож кто сталкивался с подобным?

Заранее благодарствую
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
zltigo
сообщение Oct 2 2006, 11:36
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Урвал минутку, посмотрел.
Для начала, так:
Код
  
while(SSPSR & (1<<1))
     SSPDR = *out++;

Делать нельзя, дело в том, что обращение к периферии очень медленное (не менее 8 тактов на обращение) и на приличных скоростях SPI SSPDR удается в общем случае загружать медленне, чем он разгружается :-(
Даже простейший вариант
SSPDR = i++;
Успевает (проверено электроникой) даже на 15Mhz "залить" в 8ми элементное FIFO 32!!! байта до его "переполнения" Глубина FIFO действительно 8 элементов и при приеме из 32 переданных вычитываются первые 8.
Эксперимент проводился на 2148 без индекса 01 - возможно с 01 картина будет несколько иная.
Так что заливать придется, например, с огдядкой :-( на переполнение приемного FIFO.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
diwil
сообщение Oct 2 2006, 11:46
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 366
Регистрация: 5-09-06
Из: Санкт-Петербург
Пользователь №: 20 107



хм...

байты по СПИ1 передаются правильно... смотрел осциллом и на другой конец приходят прально.

если читать приемный регистр "руками", то они в нем тоже правильные оказываются...
не понятки - почему не выставляется флаг что приемная очередь не пуста?

тогда ладно... допустим он по прерываниям не будет работать...
а если сделать как в филипсовском примере? (платы нет под рукой)
Go to the top of the page
 
+Quote Post
zltigo
сообщение Oct 2 2006, 12:09
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(diwil @ Oct 2 2006, 14:46) *
хм...

байты по СПИ1 передаются правильно... смотрел осциллом и на другой конец приходят прально.

У меня для начала однозначно захлебывается уже передача.

Цитата
тогда ладно... допустим он по прерываниям не будет работать...

Почему не будет! будет!
А что Вы хотели сказать (ну хотя-бы HEX, если биты влом описать) этим
SSPIMSC = 12;
Выбирая прерывания при полупустых обеих FIFO
зачем оба-то, тем более для мастера?

Цитата
а если сделать как в филипсовском примере?

Не читал "примеры" - давно "завязал" :-( c чтением.


Я честно говоря просто не могу понять конечную цель, чего надо достигнуть???

Давайте так:
1. Master - это понятно.
2. На какой скорости?
3. Обмен пакетный? Одиночными фреймами?
4. Нарезка SSELом на фреймы нужна?


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
diwil
сообщение Oct 2 2006, 13:02
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 366
Регистрация: 5-09-06
Из: Санкт-Петербург
Пользователь №: 20 107



Цитата(zltigo @ Oct 2 2006, 16:09) *
Давайте так:
1. Master - это понятно.
2. На какой скорости?
3. Обмен пакетный? Одиночными фреймами?
4. Нарезка SSELом на фреймы нужна?


1. Мастер и только мастер
2. PCLK/2 : pclk = 14.7456/2 MHz итого сторость СПИ1 около 1МГц
3. нет. хочу передавать и принимать (одновременно) данные от 37 до 535 байт. при этом, на время всей передачи SSEL должен быть низким.
4. нет
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- diwil   глобальные грабли с spi1 в lpc214x   Sep 29 2006, 06:56
- - zltigo   Честно прочитал четыре раза. После процесса иницал...   Sep 29 2006, 21:20
|- - diwil   Цитата(zltigo @ Sep 30 2006, 01:20) Честн...   Oct 2 2006, 08:02
|- - zltigo   Цитата(diwil @ Oct 2 2006, 11:02) Грабли ...   Oct 2 2006, 09:08
|- - diwil   Цитата(zltigo @ Oct 2 2006, 13:08) Цитата...   Oct 2 2006, 10:16
|- - zltigo   Цитата(diwil @ Oct 2 2006, 16:02) 2. PCLK...   Oct 2 2006, 14:58
|- - diwil   Цитата(zltigo @ Oct 2 2006, 18:58) Самый ...   Oct 2 2006, 16:17
- - zltigo   Простейший вариант без прерывания. На частоте SPI...   Oct 2 2006, 17:33
- - diwil   Цитата(zltigo @ Oct 2 2006, 21:33) Просте...   Oct 3 2006, 07:26
- - zltigo   Цитата(diwil @ Oct 3 2006, 10:26) 1. част...   Oct 3 2006, 07:48
- - diwil   Цитата(zltigo @ Oct 3 2006, 11:48) Но: 2....   Oct 3 2006, 08:06
- - zltigo   Цитата(diwil @ Oct 3 2006, 11:06) Дело, н...   Oct 3 2006, 08:14
- - diwil   получилось так: Кодvoid spi1_transfer(uint8_t ...   Oct 3 2006, 17:45


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

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 15:57
Рейтинг@Mail.ru


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