не могу понять в чем дело, настраиваю регистр MCSM1.RXOFF_MODE = 11 (3) чтоб он оставался в RX после приема пакета, но он постоянно выходит в IDLE.
Что может быть причиной такого?
Код: Выделить всё
void CC1101_Reset(void) {
CSN_LOW();
Delay_us(5);
CSN_HIGH();
Delay_us(40);
CC1101_WriteStrobe(0x30);
Delay_us(2);
}Код: Выделить всё
void CC1101_Configure(void)
{
CC1101_WriteReg(CCxxx0_IOCFG0,0x06); //IOCFG0 - GDO0 Output Pin Configuration
CC1101_WriteReg(CCxxx0_FIFOTHR,0x47); //FIFOTHR - RX FIFO and TX FIFO Thresholds
CC1101_WriteReg(CCxxx0_PKTLEN,0x3E); //PKTLEN - Packet Length
CC1101_WriteReg(CCxxx0_PKTCTRL1,0x0C); //PKTCTRL1 - Packet Automation Control
CC1101_WriteReg(CCxxx0_PKTCTRL0,0x05); //PKTCTRL0 - Packet Automation Control
CC1101_WriteReg(CCxxx0_ADDR,0x23); //ADDR - Device Address
CC1101_WriteReg(CCxxx0_CHANNR,0x01); //CHANNR - Channel Number
CC1101_WriteReg(CCxxx0_FSCTRL1,0x06); //FSCTRL1 - Frequency Synthesizer Control
CC1101_WriteReg(CCxxx0_FREQ2,0x10); //FREQ2 - Frequency Control Word, High Byte
CC1101_WriteReg(CCxxx0_FREQ1,0xA7); //FREQ1 - Frequency Control Word, Middle Byte
CC1101_WriteReg(CCxxx0_FREQ0,0x62); //FREQ0 - Frequency Control Word, Low Byte
CC1101_WriteReg(CCxxx0_MDMCFG4,0xF9); //MDMCFG4 - Modem Configuration
CC1101_WriteReg(CCxxx0_MDMCFG3,0x93); //MDMCFG3 - Modem Configuration
CC1101_WriteReg(CCxxx0_MDMCFG2,0x43); //MDMCFG2 - Modem Configuration
CC1101_WriteReg(CCxxx0_DEVIATN,0x15); //DEVIATN - Modem Deviation Setting
CC1101_WriteReg(CCxxx0_MCSM0,0x18); //MCSM0 - Main Radio Control State Machine Configuration
CC1101_WriteReg(CCxxx0_MCSM1,0x0F); //MCSM1 - Main Radio Control State Machine Configuration
CC1101_WriteReg(CCxxx0_FOCCFG,0x16); //FOCCFG - Frequency Offset Compensation Configuration
CC1101_WriteReg(CCxxx0_WORCTRL,0xFB); //WORCTRL - Wake On Radio Control
CC1101_WriteReg(CCxxx0_FSCAL3,0xE9); //FSCAL3 - Frequency Synthesizer Calibration
CC1101_WriteReg(CCxxx0_FSCAL2,0x2A); //FSCAL2 - Frequency Synthesizer Calibration
CC1101_WriteReg(CCxxx0_FSCAL1,0x00); //FSCAL1 - Frequency Synthesizer Calibration
CC1101_WriteReg(CCxxx0_FSCAL0,0x1F); //FSCAL0 - Frequency Synthesizer Calibration
CC1101_WriteReg(CCxxx0_TEST2,0x81); //TEST2 - Various Test Settings
CC1101_WriteReg(CCxxx0_TEST1,0x35); //TEST1 - Various Test Settings
CC1101_WriteReg(CCxxx0_TEST0,0x09); //TEST0 - Various Test Settings
}Код: Выделить всё
CC1101_Reset();
CC1101_Configure();Код: Выделить всё
void uEXTI_IRQHandler(uint32_t Pin)
{
HandleStatus = 1;
}Код: Выделить всё
while (1)
{
if (HandleStatus)
{
HandleStatus = 0x00;
CC1101_HandleStatus();
}
}Код: Выделить всё
void CC1101_HandleStatus(void) {
uint8_t Length = CC1101_ReadStatusReg(CCxxx0_RXBYTES);
if (Length & BYTES_IN_RXFIFO) {
CC1101_ReadBurstReg(CCxxx0_RXFIFO, CC1101_Data, Length);
// CC1101_RxMode();
}
}Код: Выделить всё
void CC1101_RxMode(void) {
CC1101_WriteStrobe(CCxxx0_SFRX);
CC1101_WriteStrobe(CCxxx0_SRX);
}Код: Выделить всё
P1IES_bit.GDO0 = 0; // set INT on low-to-high transition
P1IFG = 0; // clear port IF
P1IE = RST_BTN + GDO0; // enable port pin interrupts
__low_power_mode_3(); // wait for receiving the sync word
P1IES_bit.GDO0 = 1; // sync word received - set INT on high-to-low transition
P1IFG = 0; // clear IF
P1IE_bit.GDO0 = 1; // enable GDO0 pin INT
__low_power_mode_3(); // wait for receiving packet in FIFO6 (0x06) - Asserts when sync word has been sent / received, and de-asserts at the end of the packet.
0x02: IOCFG0 – GDO0 Output Pin Configuration
Bit 6: Invert output, i.e. select active low (1) / high (0)
Кстати, после чтения длины принятого пакета командой 0xFB следует передёрнуть CS и уже потом в следующей сессии читать RX FIFO командой 0xFF.
greeka - если то, о чём пишите, единственная проблема, что мешает Вам подать команду перевода модуля в RX после выгрузки из него пакета? Или имеется опасность пропустить какой-то пакет за время выгрузки?
У меня тут, кстати, несколько статей в шерсти про модули на Si найдте.
Более того, приемник не рекомендуется долго держать в состоянии приема т.к. он уплывает.
greeka писал(а):будут ли битые данные в RX FIFO?
greeka писал(а):Подскажите как статьи искать по автору? Или дайте ссылки на них.
GRAF писал(а):Страница 2
Details
If a received data byte is written to the RX FIFO at the exact same time as the last byte in the RX FIFO is read over the SPI interface, the RX FIFO pointer is not properly updated and the last read byte is duplicated.
Workaround(s)
For packets below 64 bytes, it is recommended to wait until the complete packet has been received before reading it out.
Ser60 писал(а):У меня тут несколько статей на тему. Быстрее будет Вам нажать кнопку Профиль под этим моим сообщением, чтобы получить доступ к статьям.
greeka писал(а):что будет с данными, которые я еще не прочитал из буфера?