문제를 발견했습니다 : 라디오가 패킷 전송 후 올바르게 꺼지지 않습니다.
파일 cpu/cc2538/dev/cc2538-rf.c
에있는 transmit()
의 끝에는 이전에 꺼져 있던 경우에만 라디오가 꺼집니다.
if(rf_flags & WAS_OFF) {
rf_flags &= ~WAS_OFF;
off();
}
실제로 프로그램은 절대로이 상태가되지 않으며 라디오는 패킷 전송 직후에 꺼지지 않습니다.
함수 channel_clear()
(transmit()
함수 시작 부분에서 호출 됨)이 먼저이 플래그를 지우므로 문제가 발생합니다. 따라서 함수 transmit()
은 라디오가 실행되기 전에 라디오가 꺼져 있었기 때문에 더 이상 알지 못하므로 라디오가 켜져 있습니다.
문제를 해결하려면 channel_clear()
안에 로컬 변수를 넣고 라디오를 끄고 플래그 자체가 기능 자체 내에서 켜져있는 경우에만 지우십시오.
주 :
static int
channel_clear(void)
{
int cca;
/* Fix: local variable */
uint8_t intern_onoff;
intern_onoff = 0;
PRINTF("RF: CCA\n");
/* If we are off, turn on first */
if((REG(RFCORE_XREG_FSMSTAT0) & RFCORE_XREG_FSMSTAT0_FSM_FFCTRL_STATE) == 0) {
rf_flags |= WAS_OFF;
on();
intern_onoff = 1;
}
/* Wait on RSSI_VALID */
while((REG(RFCORE_XREG_RSSISTAT) & RFCORE_XREG_RSSISTAT_RSSI_VALID) == 0);
if(REG(RFCORE_XREG_FSMSTAT1) & RFCORE_XREG_FSMSTAT1_CCA) {
cca = CC2538_RF_CCA_CLEAR;
} else {
cca = CC2538_RF_CCA_BUSY;
}
/* If we were off, turn back off */
if((rf_flags & WAS_OFF) == WAS_OFF && intern_onoff) {
rf_flags &= ~WAS_OFF;
off();
intern_onoff = 0;
}
return cca;
}
패킷 전송시 소비 전류는 지금과 같은
#define STROBE_TIME RTIMER_ARCH_SECOND/100
이 : 스트로브 시간으로 10ms의에 의도적으로 감소 왜 방송 메시지에 대해 전송 스트로브가 세 번 있는지 설명하십시오.
스트로브의 지속 시간은 3ms입니다. 즉 데이터 속도는 ~ 140kbps (?)입니다.
전체 설명을 읽어 주셔서 감사합니다. 나는 이미 250Hz의 지속 시간이 2 배인 8Hz의 CCA 검사를 의심했다. 라디오가 제대로 꺼지지 않은 것 같아서 다시 시도하기 전에 다음 라디오 확인을 기다려야합니다. –