Цитата(woodman @ Jan 22 2009, 04:44)

Спасибо!
А зависания в режиме приема с СС2510 наблюдались?
И еще, использовали ли ПДП на приеме?
С передачей нет проблем, а вот прием (Пакеты ~24Bytes; 250kbps; FSK) какой-то глюкавый получается у нас.
Поэтому любой опыт работы с чипом будет интересен и полезен.
Зависания есть, помогает только пересброс питания или код подобный тому что у меня.
Происходят это после приёма сбойного пакета и последующей потери синхронизации, дальше надо проводить термокалибровку - без неё приём не востановится. А также не всегда при приёме пакета (особенно если он неправильный - сбойный) выстанавливался флаг.
Вот упрощённая процедура приёма.
tick_t4 - таймер по прерыванию 500 мкс
tick_25ms - счётчик 25 мс интервалов
void RadioRXwork(void)
{
mode = RADIO_MODE_RX;
// Установка DMA для перемещения пакета в радиобуфер
dmaRadioSetup(RADIO_MODE_RX);
// Начало приёма
DMAARM = DMAARM_CHANNEL0; // Arm DMA channel 0
RFST = STROBE_RX; // Switch radio to RX
tick_25ms=0; // Обнуление ожидания приёма
while (TRUE)
{
// Опрос поступающего пакета принятого по радио
if (pktRcvdFlag) // TRUE значит пришёл пакет и его обрабатывают
{
pktRcvdFlag = FALSE;
// Проверка принятого пакета
if (pktCheckValidity())
{ // Определяется что должно быть в пакете чтобы приемник его принял
// Запись данных в буфер UART и выдача в UART
tick_t4=40; // Снхронизация таймеров приёмной и передающей части
SIZE_UART_TX_DATA=radioPktBuffer[1]-6;
for (temp_i=7; temp_i<=38; temp_i++) uartTxBuffer[temp_i-7] = radioPktBuffer[temp_i];
// Если пакет не пустой, то запрещение прерываний (иначе UART передавал по несколько байтов) и выдача в UART
if (SIZE_UART_TX_DATA > 0) {RX_TX_DATA++; uartStartTxForIsr();}
return;
}
// Нам не нужен буфер пакета больше, готовимся к следующему пакету
if (SIZE_UART_TX_DATA == 0) {DMAARM = DMAARM_CHANNEL0; RFST = STROBE_RX;} //// <<<<<<<< ЭТО ОБЯЗАТЕЛЬНО!!!
}
if (tick_25ms>40) // Если не было обмена более 1с - выключаем радиотракт (переводим в режим IDLE)
{
P2_0=0; RFST = 0x04; //// <<<<<<<< переводим в режим IDLE ЭТО ОБЯЗАТЕЛЬНО!!! Чтобы без термокалибровки в приём не переходило
halWait(10); P2_0=1; // Мигание светодиода в дежурном режиме
tick_t4=20; break;
}
}
}
Кстати, везде где есть проверка флагов использую конструкцию с привязкой по времени
while((!pktSentFlag) && (tick_t4!=25)); //////////// ЗДЕСЬ без (tick_t4!=25) ЗАВИСАЛО
pktSentFlag = FALSE;