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

 
 
> CYWUSB693x, скорость передачи пакетов.
AndreyS
сообщение Mar 6 2006, 19:06
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 235
Регистрация: 28-01-05
Из: Санкт-Петербург
Пользователь №: 2 276



Вопрос в скорости передачи байта. Верне времени отставания переданного байта в эфир и реально полученного в другом устройстве. Каково оно???

А пока вводная.
Имею
пакет из 5 байт в одну сторону и пакет из 2-х байт в подтверждение.
Пакет на передачу (5 байт) состоит из:
0 - 1 байт заголовок
1,2 - 2 байта данных
3 - 1 байт временной метки
4 - 1 байт CRC
Пакет подтверждения
0 - 1 байт заголовок
1 - 1 байт CRC

Иными словами, меньше чем 5 байт пакет сделать нельзя.

Теперь о скорости передачи. Реально данные (поток байтов в одну сторону) передаются (я говорю про максимальную частоту) с скорость 62500 бит в сек (сам проверял, перед тем как начать писать протокол MAC для своей задачи). Теперь если взять идеал, то для пакетной передачи (в 5 байт на передачу и 5 на ответ) максимальная скорость 781 пакет в секунду. На практике это не достижимо. Мало того у меня получилось что с 5 на передачу и 2 на ответ максимальная скорость формирования пакетов не более 300!! (ну в первую очередь это связано с реповторами, а во вторую из-за того, что время от момента, когда сработало прерывание, что мол передающий буфер передатчика пуст и до момента, когда сработало прерывание в приемнике, что есть байт инфы составляет 490 uS. Это очень много!! Это почти 4 байта полезной информации!!


Вот и вопрос.
Кто работал с этой микрухой, какую максималку в пакетной передачи достигал????
У меня получилось что максимальная скорость (с учетом выше сказанного. А речь идет именно о пакетах!!!) 12000 к бит в сек. Для моей задачи этого мало, да и по расчетам должно было быть болшьше. Но вот время отставания меня просто убило!!! sad.gif Как бы его сокраить???? Не хочется делать асинхронную передачу пакетов. Это будет геморой еще тот!!!

Подскажите. Какое время отставания данных!!!???????


--------------------
Удачи.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
AndreyS
сообщение Mar 7 2006, 08:37
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 235
Регистрация: 28-01-05
Из: Санкт-Петербург
Пользователь №: 2 276



Решил попробывать (как вы рекомендовали) опрос флажка, а не прерывание. Цифры получилиь такими же.
Теперь попробую объяснить что именно я имел в виду.
Вот кусок кода:
Код
bit transmit_radio(byte buffer_length, byte *tx_buffer)
{
   byte i;
   unsigned int counter;
   // Включаем режим передачи
   radio_transmit_on();
   counter=Get_Radio_byte(REG_TX_INT_STAT);
   clr_int_radio;
   // включаем прерывание TX буфер пуст
   Write_Radio(REG_TX_INT_EN, TX_EMPTY);
   // передаем пакет
   LED=!LED;
   for(i = 0; i < buffer_length; ++i, tx_buffer++)
   {
     for (counter = 0; (counter < DEADMAN_MAX_COUNT) && (!Irq_radio); counter++); // ждем полной передачи
     if (Irq_radio)
     {
       LED=1;
       Write_Radio(REG_DATA_TX, *tx_buffer);
       counter=Get_Radio_byte(REG_TX_INT_STAT);
       clr_int_radio;
       LED=0;
     }
     else
     {
       radio_off();
       LED=!LED;
       return(0x00);
     }
   }
   // включаем прерывание EOF
   Write_Radio(REG_TX_INT_EN, TX_EOF);
   for (counter = 0; (counter < DEADMAN_MAX_COUNT) && (!Irq_radio); counter++); // ждем выполненея EOF
   // выключаем передатчик
   radio_off();
   LED=!LED;
   return(0x01);
}


LED в данном случае показывает, когда сработал обработчик записи в CYWUSB байта. По нему и смотрю. Вот и получается что (при передачи 2-х байт) между первым входом в обработчик и второым входом растояние = 180uS. Далее смотрим какое расстояние от первого входа в обработчик отправки и выходом из процедуры (ну вернее я поставил второй щуп осца на ножку прерывания и измеряю расстояние до срабатывания прерывания EOF) и оно равно 460uS.

После этого я вывел на LED приемника в процедуре приема состояние о приеме данных. Приведу процедурку приема.
Код
byte recive_radio(byte *rx_buffer,int TIME_OUT)
{
   unsigned int i;
   byte j,temp_crc;
   byte irq_source=0;
   byte rx_data_len=0;// указатель на результат выполнения функции
   byte num_erasures=0;// число ошибочных бит в переделах одной позиции. При таком подсчете CRC не может быть больше 1.
   byte bad_row=0;// позиция в буфере данных с битым битом
   byte bad_bit_count = 0;// число битых байт во всем пакете. Не может быть более 3-х.
   byte valid_buffer[MAX_RX_BUF];

   radio_receive_on();
   clr_int_radio;
   // включаем прерывание RX (EOF, OVER, FULL)
   irq_source=Get_Radio_byte(REG_RX_INT_STAT);
   Write_Radio(REG_RX_INT_EN, (RX_OVER_A | RX_EOF_A | RX_FULL_A));
   // цикл приема с учетом таймаута.
   // Т.е. принимаем пока не получим EOF или не выйдет время.
   // Если получм OVER, то пакет прибиваем (потерян байт)
   LED=!LED;
   for (i=0; i<=TIME_OUT; i++)
   {
      if (Irq_radio)
      {
         // пошел прием
         // получаем байт состояни прерывания. (кто вызвал нас?)
         irq_source=Get_Radio_byte(REG_RX_INT_STAT);
         clr_int_radio;
         if(irq_source & RX_FULL_A)
         {
            if (rx_data_len<MAX_RX_BUF)
            {
               // есть байт в приемнике. Нужно забрать.
               // читаем данные
               LED=1;
               *rx_buffer=Get_Radio_byte(REG_DATA_RX_A);    
               LED=0;
               // читаем VALID регистр при условии, что в состоянии возведен флаг. То просто FF
               if (irq_source & RX_VALID_A)
               {
                  valid_buffer[rx_data_len] = 0xFF;
               }
               else
               {
                  valid_buffer[rx_data_len] = Get_Radio_byte(REG_VALID_RX_A);
               }    
               // переводим указатели чтения
               rx_data_len++;
               rx_buffer++;    
               // отсрачиваем таймаут
               i=0;
            }
            else
            {
               Get_Radio_byte(REG_DATA_RX_A); // освобождаем буфер приема
               radio_off();
               LED=!LED;
               return(0); // Если на выходе rx_data_len=0, то значит пакет не принят.
            }
         }
         if(irq_source & RX_EOF_A)
         {              
            if (valid_buffer[rx_data_len-1]>=0xFF)
            {
               break; // необходимо выйти. весь пакет приняли
            }
            // ошибка в байте с CRC. Восстановить не сможем
            Get_Radio_byte(REG_DATA_RX_A);     // освобождаем буфер приема
            radio_off();
            LED=!LED;
            return(0); // Если на выходе rx_data_len=0, то значит пакет не принят.
         }
         if(irq_source & RX_OVER_A)
         {
            Get_Radio_byte(REG_DATA_RX_A); // освобождаем буфер приема
            radio_off();
            LED=!LED;
            return(0); // Если на выходе rx_data_len=0, то значит пакет не принят.
         }
      }
      else
      {
         // выждать 10uS
         time(tick_10us);
      }
   }
   radio_off();
   LED=!LED;
   if (rx_data_len != 0)
   {
      // тут обработчик по проверке целостности и попытке восстановления пакета.
   }
   return(rx_data_len);    // Если на выходе rx_data_len=0, то значит пакет не принят.
}


И что же я увидел. Да то что расстояние между первым срабатыванием прерывания в передатчике и первым срабатыванием прерывания в приемнике = 490uS. Сейчас могу сказать что это неправильное измерение. Теперь измеряем расстояние от начала передачи второго байта до начала приема первого байта (вот это истинное отставание) = 240uS. А если посчитать сколько времени понадобится для передачи одного байта при скорости 62500, то оно равно 128uS. Теперь отложим отрезок от первого срабатывания прерывания в передатчике = 128uS и от него измерим расстояние до первого срабатываниря прерывания в приемнике = 292uS. Это равно времени передачи 2.28 байт. Колосальная задержка!!!. Теперь посмотрим расстояние между двумя принятыми байтами в приемнике. Оно равно 128 uS. Т.е. скорость 62500. Иными словами. Все работает на своей скорости, но наблюдается отставание в передаче байт. Такое чувство, что в передатчике есть глубокий буфер и вторым байтом я выпихиваю первый в среду.
В общем если передавать с подтверждением, то эта пауза дает огромную потерю в макимальной частоте формирования пакетов. sad.gif


--------------------
Удачи.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- AndreyS   CYWUSB693x   Mar 6 2006, 19:06
- - Dr.NoA   Не совсем понятно, что вы имеете в виду. Из сказан...   Mar 6 2006, 21:02
- - Dr.NoA   Подобными измерениями я не занимался, так что спор...   Mar 7 2006, 10:43
- - AndreyS   Про поток без подтверждения думал, но определяя ма...   Mar 7 2006, 11:04
- - Dr.NoA   Говоря про увеличение длины пакета, я не имел в ви...   Mar 7 2006, 13:27
- - AndreyS   Точно!!! Вы правы!!! Толь...   Mar 7 2006, 13:52
- - Dr.NoA   Кстати, провел сейчас эксперименты аналогичные ваш...   Mar 7 2006, 15:35
- - AndreyS   Нет не задавал. Я на их форуме не был. И не знаю н...   Mar 7 2006, 19:19
- - Dr.NoA   Суммарная задержка, которую вы собственно и измеря...   Mar 7 2006, 22:06
- - AndreyS   ЦитатаЯ им уже задал этот вопрос, если ответят что...   Mar 8 2006, 09:42
- - Dr.NoA   CYRF6936 новая микросхема и, насколько я понимаю, ...   Mar 8 2006, 11:12
- - AndreyS   Да нет. Модули применять я не собираюсь. Просто пр...   Mar 8 2006, 12:15
- - Dr.NoA   Не совсем понятно как вы прокачаете 1000 пакетов в...   Mar 8 2006, 12:48
- - AndreyS   Да данные передавать нужно только от одно устройст...   Mar 8 2006, 14:33
- - Dr.NoA   Я имел в виду, что микроконтроллер, который у паци...   Mar 8 2006, 19:56
- - AndreyS   День добрый Dr.NoA. Cypress'овский суппорт мо...   Mar 20 2006, 19:09
- - Dr.NoA   Вы как чувствовали Как раз сегодня вечером закончи...   Mar 20 2006, 20:18


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

 


RSS Текстовая версия Сейчас: 21st July 2025 - 21:59
Рейтинг@Mail.ru


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