in March, i was working on a wrapper for LoRa library, but from tests done by ehsan gilassi, both call-back were not working.
last week i received 2 SX1278, Ra-01 M modules, i was able to make tests and i was able to reproduce this issue.
- call-back OnReceive/OnRxDone is OK under arduino (project example with library)
- call-back OnReceive/OnRxDone is NOK under B4R. (same project converted in B4R)
from tests, call-back process is working => issue is before
with traces added in library, i found an issue at interruption on Dio0 pin, after Dio0 interrupt, behavior was different in arduino project and in B4R project
=======================
code at Dio0 interrupt:
=======================
after several tests done, interruption routine don't have access to variables in the library... No crash, but value are seen = 00
i did a change in code to check what is wrong: i run handleDio0Rise from a loop in B4R project, not from interruption, and interruption is doing nothing
===================
code after modification is this one:
====================
in this configuration interruption is doing nothing, a check of dio0 pin is done from a loop in B4R and if level HIGHT => run of handleDio0Rise.
=> with this modification call-backs are working.
tests were done on esp32 and esp8266, and issue is the same: library is working with arduino, library is not working with B4R due to issue on pin interrupt
=> why interruption on pin working in arduino project is not working in B4R project ? i didn't find explanation...
if someone have an idea, he will be welcome
last week i received 2 SX1278, Ra-01 M modules, i was able to make tests and i was able to reproduce this issue.
- call-back OnReceive/OnRxDone is OK under arduino (project example with library)
- call-back OnReceive/OnRxDone is NOK under B4R. (same project converted in B4R)
from tests, call-back process is working => issue is before
with traces added in library, i found an issue at interruption on Dio0 pin, after Dio0 interrupt, behavior was different in arduino project and in B4R project
=======================
code at Dio0 interrupt:
=======================
B4X:
ISR_PREFIX void LoRaClass::onDio0Rise()
{
LoRa.handleDio0Rise();
}
void LoRaClass::handleDio0Rise()
{
int irqFlags = readRegister(REG_IRQ_FLAGS);
Serial.print("irqFlags=");Serial.println(irqFlags); //debug******************
//=> irqFlags should be "80" but with B4R it is "00"
// clear IRQ's
writeRegister(REG_IRQ_FLAGS, irqFlags);
if ((irqFlags & IRQ_PAYLOAD_CRC_ERROR_MASK) == 0) {
if ((irqFlags & IRQ_RX_DONE_MASK) != 0) {
//=> du to irqflags=00, never we come in this part, never we received a packet
Serial.println("receive packet");//debug*********************************
_packetIndex = 0;
// read packet length
int packetLength = _implicitHeaderMode ? readRegister(REG_PAYLOAD_LENGTH) : readRegister(REG_RX_NB_BYTES);
// set FIFO address to current RX address
writeRegister(REG_FIFO_ADDR_PTR, readRegister(REG_FIFO_RX_CURRENT_ADDR));
if (_onReceive) {
_onReceive(packetLength);
}
}
else if ((irqFlags & IRQ_TX_DONE_MASK) != 0) {
if (_onTxDone) {
_onTxDone();
}
}
}
}
i did a change in code to check what is wrong: i run handleDio0Rise from a loop in B4R project, not from interruption, and interruption is doing nothing
===================
code after modification is this one:
====================
B4X:
//added for B4R
void LoRaClass::processing() {
if (digitalRead(_dio0)== HIGH) {handleDio0Rise(); } //test of pin dio0 used for interruption
}
ISR_PREFIX void LoRaClass::onDio0Rise()
{
//LoRa.handleDio0Rise();
}
void LoRaClass::handleDio0Rise()
{
int irqFlags = readRegister(REG_IRQ_FLAGS);
// clear IRQ's
writeRegister(REG_IRQ_FLAGS, irqFlags);
if ((irqFlags & IRQ_PAYLOAD_CRC_ERROR_MASK) == 0) {
if ((irqFlags & IRQ_RX_DONE_MASK) != 0) {
// received a packet
_packetIndex = 0;
// read packet length
int packetLength = _implicitHeaderMode ? readRegister(REG_PAYLOAD_LENGTH) : readRegister(REG_RX_NB_BYTES);
// set FIFO address to current RX address
writeRegister(REG_FIFO_ADDR_PTR, readRegister(REG_FIFO_RX_CURRENT_ADDR));
if (_onReceive) {
_onReceive(packetLength);
}
}
else if ((irqFlags & IRQ_TX_DONE_MASK) != 0) {
if (_onTxDone) {
_onTxDone();
}
}
}
}
=> with this modification call-backs are working.
tests were done on esp32 and esp8266, and issue is the same: library is working with arduino, library is not working with B4R due to issue on pin interrupt
=> why interruption on pin working in arduino project is not working in B4R project ? i didn't find explanation...
if someone have an idea, he will be welcome