Wemos D1 работа с si4463 по SPI

Casper

Member
Подключил модуль трансивера si4463 к Wemos d1 mini, а также пробовал и к Wemos D1 R2 v2.1.0 и получаю не правильный результат на приеме данных. Второй модуль, который отправляет данные подключен к STM32.
STM32 отправляет строку "T1=12C H=80% T1=12C" всего 19 символов + конец строки = 20 байт. А принимаю строку длинной 21 байт и следующего вида "U0=03C H=80% T1=12C" хотя логический анализатор показывает что все данный приходят корректные! На фото видно, первый байт это длина принятых данных, потом байты данных идут. И почему-то в начале значения пару байт на 1 больше чем реальный данные по логическому анализатору. Думал в начале что ком порт косячит..
Эта же библиотека хорошо работала на ардуино, все принималось, выводилось корректно!
 

Вложения

Последнее редактирование:

Casper

Member
Этот же код отлично работает с Ардуино и STM32! А с ESP работать не хочет.
Код:
if(rf4463.waitnIRQ())    // wait for PACKET_RX interrupt
        {
          Serial.println("Valid_data");
            rf4463.clrInterrupts();
            rx_len=rf4463.rxPacket(rx_buf);  // read rx data
            Serial.print("len = ");
            Serial.println(rx_len);
            for(int i = 0; i < rx_len-1; i++)
            {
              Serial.write(rx_buf[i]);
            }
//            Serial.write(rx_buf,rx_len);    // print out by serial
                rf4463.rxInit();    // wait for packet from tx
        }
Код:
uint8_t RF4463::rxPacket(uint8_t* recvbuf)
{
    uint8_t rxLen;
    rxLen=ReadRxFifo(recvbuf);            // read data from fifo
    fifoReset();                        // clr fifo

    return rxLen;
}
Код:
uint8_t RF4463::ReadRxFifo(uint8_t* databuf)
{
    if(!checkCTS())
        return 0;
    uint8_t readLen;
    digitalWrite(_nSELPin, LOW);
    spiByte(RF4463_CMD_RX_FIFO_READ);
    spiReadBuf(1,&readLen);
    spiReadBuf(readLen,databuf);
    digitalWrite(_nSELPin, HIGH);
    return readLen;
}
Код:
void RF4463::spiWriteBuf(uint8_t writeLen,uint8_t* writeBuf)
{
        while (writeLen--)
        spiByte(*writeBuf++);
}
void RF4463::spiReadBuf(uint8_t readLen,uint8_t* readBuf)
{
        while (readLen--)
        *readBuf++=spiByte(0);
}
uint8_t RF4463::spiByte(uint8_t writeData)
{
    uint8_t readData;
    readData=SPI.transfer(writeData);
    return readData;
}
Скажите пожалуйста, где тут может быть ошибка?
 
Последнее редактирование:

Юрий Ботов

Moderator
Команда форума
T и U отличаются 1 завершающим битом... могу предположить наводку на несогласованный высокоомный вывод контроллера (бывало уже такое) попробуйте притяните rx и tx (или соответсвующие ноги spi если проблема в нем) контроллера к земле через 10ком...
 

CodeNameHawk

Moderator
Команда форума
Если отправляете "T1=12C H=80% T1=12C", а принимаете "U0=03C H=80% T1=12C" похоже буфер не очищен или еще что, без кода можно долго гадать.
У вас мало информации, какую библиотеку используете для STM32, а какую для ЕСП (для работы с si4463)
 

Casper

Member
Использую библиотеку от NiceRF что под ардуино, что под STM, точнее с ардуино портировал ее на STM32. Под ESP библиотеку не переделывал. Просто странно, что в одном и том же месте идут не правильные байты...
 

Вложения

Юрий Ботов

Moderator
Команда форума
Под ESP библиотеку не переделывал. Просто странно, что в одном и том же месте идут не правильные байты...
Учитывая вышенаписанное чего странного?
Вообще, писателю библиотеки ноги бы оторвать... за это: *writeBuf++
дело в том что операции взятия указателя и инкремента имеют одинаковый приоритет "3" и выбор порядка исполнения "на усмотрение компилятора" и при этом *(x++) это сооооовсем не то что (*x)++
Кстати, похоже ваша проблема именно в этом.
 
Последнее редактирование:

Casper

Member
Правильно ли я понял, что правильнее будет исправить так spiByte((*writeBuf)++);
И *readBuf++ тоже стоит исправить на (*readBuf)++
 
Сверху Снизу