Продолжаю биться.
С переходом в RX после TX все получается. - А вот наоборот - нет.
Прежде чем приводить код, опишу алгоритм на пальцах.
Ведущий: отправляет посылку в 2 байта (пинг), немедленно переходит в прием. Получая ответ на пинг функция Ping_RF() завершается. Далее следует принудительная пауза в 10 мс и далее по кругу. ТАймаут на ожидание ответа - 100 мсек.
Ведомый: в цикле ловит спад на GDO0, после чего переписывает пришедший пакет из FIFO в буфер контроллера. Если пинг корректен (2 байта), то пикает динамиком ( beep() ) отправляет ответ ( Ping_RF_Answer() ).
Если все хорошо, то ведомый постоянно трещит динамиком - близко к сотне посылок в секунду, как раз соответствует паузе в цикле в 10 мсек, что говорит о том, что пропусков пакетов нет.
Далее есть 3 строки
Код
TI_CC_SPIStrobe(TI_CCxxx0_SIDLE);
TI_CC_SPIStrobe(TI_CCxxx0_SFRX);
TI_CC_SPIStrobe(TI_CCxxx0_SRX);
после переписывания данных из FIFO.
Стоит закомментировать перевод в IDLE - начинает пикать около 10 раз в секунду, светодиод, который должен загораться по таймауту, начинает моргать.
Но и динамик довольно часто пикает - то есть пакеты довольно часто и причем равномерно проходят.
Что самое интересное - строб SRX можно убрать, переводится автоматом, но почему-то хочет чтобы после обработки буфера был переовд в IDLE.
Вот код ведущего
Код
unsigned char Ping_RF()
{
RF_TX_Buffer[0]=2;
RF_TX_Buffer[1]= 0xAA;
RF_TX_Buffer[2]= RF_RX_Buffer[0];
TI_CC_SPIWriteBurstReg(TI_CCxxx0_TXFIFO, RF_TX_Buffer, 3);
// TX_ON;
TI_CC_SPIStrobe(TI_CCxxx0_STX);
rf_ping_timeout_tick=RF_PING_TIMEOUT;
while(rf_ping_timeout_tick>0)
{
if (GDO0_flag==1)
{
TX_OFF;
rf_ping_timeout_tick=0;
GDO0_flag=0;
TI_CC_SPIStrobe(TI_CCxxx0_SFTX);
}
}
// RX_ON;
rf_ping_timeout_tick=RF_PING_TIMEOUT;
while(rf_ping_timeout_tick>0)
{
if (GDO0_flag==1)
{
rf_ping_timeout_tick=0;
GDO0_flag=0;
st=RFReceivePacket(RF_RX_Buffer,&leng);
TI_CC_SPIStrobe(TI_CCxxx0_SIDLE);
TI_CC_SPIStrobe(TI_CCxxx0_SFRX);
TI_CC_SPIStrobe(TI_CCxxx0_SRX);
return 1;
}
}
RX_OFF;
LED2_ON;
delay_ms(10);
LED2_OFF;
return 0;
}
............................
while(1)
{
Ping_RF();
delay_ms(10);
}
Вот код ведомого:
Код
void Ping_RF_Answer(unsigned char code)
{
RX_OFF;
RF_TX_Buffer[0]=2;
for (i=1;i<=2;i++) RF_TX_Buffer[i]= code;
TI_CC_SPIWriteBurstReg(TI_CCxxx0_TXFIFO, RF_TX_Buffer, 3);
//TX_ON;
TI_CC_SPIStrobe(TI_CCxxx0_STX);
rf_ping_timeout_tick=RF_PING_TIMEOUT;
while(rf_ping_timeout_tick>0)
{
if (GDO0_flag==1)
{
TX_OFF;
rf_ping_timeout_tick=0;
GDO0_flag=0;
TI_CC_SPIStrobe(TI_CCxxx0_SFTX);
}
}
// RX_ON;
}
........................
while(1)
{
rf_ping_timeout_tick=RF_PING_TIMEOUT;
GDO0_flag=0;
while(rf_ping_timeout_tick>0)
{
if (GDO0_flag==1)
{
GDO0_flag=0;
LINK_PRESENT_flag=1;
rf_ping_timeout_tick=RF_PING_TIMEOUT;
ping_error_count=0;
st=RFReceivePacket(RF_RX_Buffer,&leng);
TI_CC_SPIStrobe(TI_CCxxx0_SIDLE);
TI_CC_SPIStrobe(TI_CCxxx0_SFRX);
TI_CC_SPIStrobe(TI_CCxxx0_SRX);
if (leng==2)
{
beep();
delay_ms(10);
Ping_RF_Answer(0x44);
}
}
}
}
Где я что делаю не так?
Сообщение отредактировал zheka - Aug 10 2013, 09:05