Перейти к содержанию
    

cc1100 фиксированная длина пакета

Здравствуйте!!!

Подскажите кто использовал фиксированную длину пакета передачи данных в этом трансивере, как правильно нужно сконфигурировать

сс1100. Когда использую переменную длину пакета всё работает, захотелось использовать FEC а он работает только с фиксированной длиной пакета.

const unsigned char   rfSettings[][2]=
{
  {CCxxx0_FSCTRL1 ,0x06},   // FSCTRL1   Frequency synthesizer control.
  {CCxxx0_FSCTRL0 ,0x00},   // FSCTRL0   Frequency synthesizer control.
  {CCxxx0_FREQ2   ,0x20},   // FREQ2     Frequency control word, high byte.
  {CCxxx0_FREQ1   ,0x28},   // FREQ1     Frequency control word, middle byte.
  {CCxxx0_FREQ0   ,0xC5},   // FREQ0     Frequency control word, low byte.
  {CCxxx0_MDMCFG4 ,0xF6},   // MDMCFG4   Modem configuration.
  {CCxxx0_MDMCFG3 ,0x75},   // MDMCFG3   Modem configuration.
  {CCxxx0_MDMCFG2 ,0x72},   // MDMCFG2   Modem configuration.
  {CCxxx0_MDMCFG1 ,0x22},   // MDMCFG1   Modem configuration.
  {CCxxx0_MDMCFG0 ,0xE5},   // MDMCFG0   Modem configuration.
  {CCxxx0_CHANNR  ,0x00},   // CHANNR    Channel number.
  {CCxxx0_DEVIATN ,0x00},   // DEVIATN   Modem deviation setting (when FSK modulation is enabled).
  {CCxxx0_FREND1  ,0x56},   // FREND1    Front end RX configuration.
  {CCxxx0_FREND0  ,0x10},   // FREND0    Front end RX configuration.
// {CCxxx0_MCSM1   ,0x33},   // MCSM1     Main Radio Control State Machine configuration.
  {CCxxx0_MCSM0   ,0x18},   // MCSM0     Main Radio Control State Machine configuration.
  {CCxxx0_FOCCFG  ,0x16},   // FOCCFG    Frequency Offset Compensation Configuration.
  {CCxxx0_BSCFG   ,0x6C},   // BSCFG     Bit synchronization Configuration.
  {CCxxx0_AGCCTRL2,0x03},   // AGCCTRL2  AGC control.
  {CCxxx0_AGCCTRL1,0x40},   // AGCCTRL1  AGC control.
  {CCxxx0_AGCCTRL0,0x91},   // AGCCTRL0  AGC control.
  {CCxxx0_FSCAL3  ,0xE9},   // FSCAL3    Frequency synthesizer calibration.
  {CCxxx0_FSCAL2  ,0x2A},   // FSCAL2    Frequency synthesizer calibration.
  {CCxxx0_FSCAL1  ,0x00},   // FSCAL1    Frequency synthesizer calibration.
  {CCxxx0_FSCAL0  ,0x1F},   // FSCAL0    Frequency synthesizer calibration.
  {CCxxx0_FSTEST  ,0x59},   // FSTEST    Frequency synthesizer calibration.
  {CCxxx0_TEST2   ,0x81},   // TEST2     Various test settings.
  {CCxxx0_TEST1   ,0x35},   // TEST1     Various test settings.
  {CCxxx0_TEST0   ,0x09},   // TEST0     Various test settings.
  {CCxxx0_FIFOTHR ,0x07},   //
  {CCxxx0_IOCFG2  ,0x07},   // IOCFG2    GDO2 output pin configuration.
  {CCxxx0_IOCFG0  ,0x06},   // IOCFG0D   GDO0 output pin configuration.
  {CCxxx0_PKTCTRL1,0x04},   // PKTCTRL1  Packet automation control.
  {CCxxx0_PKTCTRL0,0x04},   // PKTCTRL0  Packet automation control.
  {CCxxx0_ADDR    ,0x00},   // ADDR      Device address.
  {CCxxx0_PKTLEN  ,0x08}    // PKTLEN    Packet length.
};

передаю 8 байт данных

проверка адреса не используеться, длина фиксированая поэтому передаю только полезные 8 байт данных

вопросы

1 в pktlen значение должно быть только длина данных или длина + 2 байта rssi и lqi насколько понимаю без двух байт

2 длина пакета фиксированая и сс1100 сам знает длину данных(pktlen), то-есть нулевой байт буффера TX это полезные данные

3 согласно моим настройкам адрес не используеться и я также его непередаю

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

PKTLEN = 8, независимо от того, дополняется ли принимаемая информация статусом и RSSI.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1. В PKTLEN именно длина самих данных без учета CRC и LQI, т.е. надо учитывать, что перед отправкой добавится 2 байта, поэтому не более 62 байт для передачи без разбиения.

2. При фиксированной передаче после преамбулы байт длины пакета не передается, сразу полезные данные, т.е. при переменной длине к длине бы пакета с CRC и LQI добавилась бы еще LENGTH.

3. Адрес в настройках выключен и не передается.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо за ответы!!!

проблема осталась, при чтении пакета crc совпадает, но данные состоят из мусора, длину возвращает как и должно быть 8 байт

пишу так

halRfSendPacket((char*)&txbuff,sizeof(txbuff));

void halRfSendPacket(unsigned char *txBuffer,unsigned char size)                 //собственно передача пакета
{
  unsigned short Wait;                                          //счетчик ожидания

  halSpiWriteBurstReg(CCxxx0_TXFIFO, txBuffer, size);           //запись пакета
  halSpiStrobe(CCxxx0_STX);                                     //запуск передачи
  Wait=1000;                                                    //ждем 1с
  while(!GDO0 && Wait) { delay_us(10); Wait--; }                 // Wait for GDO0 to be set -> sync transmitted
  Wait=1000;                                                    //ждем 1с
  while(GDO0 && Wait)  { delay_us(10); Wait--; }                 // Wait for GDO0 to be cleared -> end of packet
}

читаю

         LENG=sizeof(rxbuff);
        i= halRfReceivePacket((char*) &rxbuff, &LENG);

буфферы

 unsigned char txbuff[8];
unsigned char rxbuff[10];

unsigned char halRfReceivePacket(unsigned char *rxBuffer,unsigned char *length)   //проверка наличия пакета и его чтение
{
  //Defines
  #define CRC_OK              0x80
  #define RSSI                0
  #define LQI                 1
  #define BYTES_IN_RXFIFO     0x7F

  unsigned char  Status[2];                                     //статус принятого пакета
  unsigned char  PacketLength;                                  //длина принятого пакета

  // This status register is safe to read since it will not be updated after
  // the packet has been received (See the CC1100 and 2500 Errata Note)
  if((halSpiReadStatus(CCxxx0_RXBYTES) & BYTES_IN_RXFIFO))      //если в RXFIFO есть байты
  {
    PacketLength = halSpiReadReg(CCxxx0_RXFIFO);                //Read length byte

    if(PacketLength <= *length)                                 //Read data from RX FIFO and store in rxBuffer
    {
      halSpiReadBurstReg(CCxxx0_RXFIFO,rxBuffer,PacketLength);  //чтение всех байт пакета
      *length=PacketLength;                                     //возврат длины прочитанного пакета
      // Read the 2 appended status bytes (status[0] = RSSI, status[1] = LQI)
      halSpiReadBurstReg(CCxxx0_RXFIFO, Status, 2);
      return (Status[LQI] & CRC_OK);                            //MSB of LQI is the CRC_OK bit
    }
    else                                                        //длина буфера приема недостаточна
    {
      *length = PacketLength;                                   //вернем фактическую длину пакета
      // Make sure that the radio is in IDLE state before flushing the FIFO
      // (Unless RXOFF_MODE has been changed, the radio should be in IDLE state at this point)
      halSpiStrobe(CCxxx0_SIDLE);
      // Flush RX FIFO
      halSpiStrobe(CCxxx0_SFRX);
      return 0;                                                 //пакет не принят
    }
  }
  else return 0;                                                //пакет не принят
}

не могу понять в чем проблема :help:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

да переделывал функцию приема на фиксированную длину пакета

[code]unsigned char halRfReceivePacket(unsigned char *rxBuffer,unsigned char *length)   //проверка наличия пакета и его чтение
{
  //Defines
  #define CRC_OK              0x80
  #define RSSI                0
  #define LQI                 1
  #define BYTES_IN_RXFIFO     0x7F

  unsigned char  Status[2];                                     //статус принятого пакета
  unsigned char  PacketLength;                                  //длина принятого пакета

  // This status register is safe to read since it will not be updated after
  // the packet has been received (See the CC1100 and 2500 Errata Note)
  if((halSpiReadStatus(CCxxx0_RXBYTES) & BYTES_IN_RXFIFO))      //если в RXFIFO есть байты
  {
    PacketLength = halSpiReadStatus(CCxxx0_RXBYTES);                //Read length byte

    if(PacketLength <= *length)                                 //Read data from RX FIFO and store in rxBuffer
    {
      halSpiReadBurstReg(CCxxx0_RXFIFO,rxBuffer,PacketLength);  //чтение всех байт пакета
      *length=PacketLength;                                     //возврат длины прочитанного пакета
      // Read the 2 appended status bytes (status[0] = RSSI, status[1] = LQI)
      halSpiReadBurstReg(CCxxx0_RXFIFO, Status, 2);
      return (Status[LQI] & CRC_OK);                            //MSB of LQI is the CRC_OK bit
    }
    else                                                        //длина буфера приема недостаточна
    {
      *length = PacketLength;                                   //вернем фактическую длину пакета
      // Make sure that the radio is in IDLE state before flushing the FIFO
      // (Unless RXOFF_MODE has been changed, the radio should be in IDLE state at this point)
      halSpiStrobe(CCxxx0_SIDLE);
      // Flush RX FIFO
      halSpiStrobe(CCxxx0_SFRX);
      return 0;                                                 //пакет не принят
    }
  }
  else return 0;                                                //пакет не принят
}

не помогло

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Что-то долго мучился с проблемой, как всегда невнимательность :rolleyes:

нужно было убрать чтение RSSI и LQI в функции чтения(она написана для переменной длины пакета)

получалось что пакет я уже прочитал, и пытаюсь считать еще два байта :biggrin:

unsigned char halRfReceivePacket(unsigned char *rxBuffer,unsigned char *length)   //проверка наличия пакета и его чтение
{
  //Defines
  #define BYTES_IN_RXFIFO     0x7F

  unsigned char  PacketLength;                                  //длина принятого пакета

  // This status register is safe to read since it will not be updated after
  // the packet has been received (See the CC1100 and 2500 Errata Note)
  if((halSpiReadStatus(CCxxx0_RXBYTES) & BYTES_IN_RXFIFO))      //если в RXFIFO есть байты
  {
    PacketLength = halSpiReadStatus(CCxxx0_RXBYTES);                //Read length byte

    if(PacketLength == *length)                                 //Read data from RX FIFO and store in rxBuffer
    {
      halSpiReadBurstReg(CCxxx0_RXFIFO,rxBuffer,PacketLength);  //чтение всех байт пакета
      *length=PacketLength;                                     //возврат длины прочитанного пакета

      return (1);                            
    }
    else                                                        //длина буфера приема недостаточна
    {
      *length = PacketLength;                                   //вернем фактическую длину пакета
      halSpiStrobe(CCxxx0_SIDLE);
      // Flush RX FIFO
      halSpiStrobe(CCxxx0_SFRX);
      return 0;                                                 //пакет не принят
    }
  }
  else return 0;                                                //пакет не принят
}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...