Решил попробывать (как вы рекомендовали) опрос флажка, а не прерывание. Цифры получилиь такими же.
Теперь попробую объяснить что именно я имел в виду.
Вот кусок кода:
Код
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. Иными словами. Все работает на своей скорости, но наблюдается отставание в передаче байт. Такое чувство, что в передатчике есть глубокий буфер и вторым байтом я выпихиваю первый в среду.
В общем если передавать с подтверждением, то эта пауза дает огромную потерю в макимальной частоте формирования пакетов.
Удачи.