• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

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)++
 
Сверху Снизу