|
глобальные грабли с spi1 в lpc214x, не работает на прием |
|
|
|
Sep 29 2006, 06:56
|
Местный
  
Группа: Свой
Сообщений: 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)
мож кто сталкивался с подобным?
Заранее благодарствую
|
|
|
|
|
 |
Ответов
|
Oct 2 2006, 11:36
|

Гуру
     
Группа: Свой
Сообщений: 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
|
|
|
|
|
Oct 2 2006, 12:09
|

Гуру
     
Группа: Свой
Сообщений: 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
|
|
|
|
|
Oct 2 2006, 13:02
|
Местный
  
Группа: Свой
Сообщений: 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. нет
|
|
|
|
|
Oct 2 2006, 14:58
|

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

|
Цитата(diwil @ Oct 2 2006, 16:02)  2. PCLK/2 : pclk = 14.7456/2 MHz итого сторость СПИ1 около 1МГц "Скорость" SPI таки в битах, посему ~7,5MHz, что является достаточно быстрым и попадает в неприятную зону, когда уже не успеть (практически это в Вашем случае 128 тактов процессора с момента полупустого FIFO)забивать и вычитывать FIFO со скоростью обеспечивающей отсутствие аппаратного дергания SSEL. SSEL - софтом дергать надо будет. Кроме того это где-то надо думать использовать/не использовать прерывание - ибо прерывание опять будет приходить через 128 тактов - и накладные расходы на обслуживание будут немалые. Ответ на вопрос по использованию прерывания зависит от прочих системных решений. Цитата 3. нет. хочу передавать и принимать (одновременно) данные от 37 до 535 байт. при этом, на время всей передачи SSEL должен быть низким. Т.е. в какой-то момент времени в буфере передачи появляетя порция от 37 до 535 байт и это является сигналом к началу процесса. Принятые байты складываются в приемный буфер и все разборки "потом". Самый тупой вариант SSEL софтом управляемый, байты запихиваются в FIFO и со сдвигом на несколько засунутых в FIFO байт считываются. Прерывания от SPI не используются. Времени занимает много, но при разрешенных прерываниях и/или наличии операционки все будет работать с минимальными суммарными накладными расходами. Набросать такой вариант? Или с прерываниями, если нужно обеспечить более высокую равномерность работы с SPI?
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
Сообщений в этой теме
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     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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|