Hi!
I have a problem transmitting messages with the RFM95 module using a MSP430 MCU and the RadioHead library. Init() works successfully and the device sets OP_MODE into standby (idle 0x81) mode correctly.
However, I get stuck in an infinite while-loop in waitCAD() and isChannelActive(), as I am never receiving an interrupt callback from the DIO0 pin. The interrupt routine works fine itself as it fires when I connect/disconnect the cable. (it is set to RISING).
Please note that I am using the Dragino LoRa Shield without any Arduino, see attachment:
I have connected the ICSP pins for SPI, DIO0 to my interrupt pin and D10 to the slave select pin. I am NOT using any SPI interrupt pin as I don't think it is necessary for this?
Code:
uint8_t init_RH_RF95()
{
__disable_interrupt();
_mode=RHModeInitialising;
_thisAddress=RH_BROADCAST_ADDRESS;
_promiscuous=0;
_txHeaderTo=RH_BROADCAST_ADDRESS;
_txHeaderFrom=RH_BROADCAST_ADDRESS;
_txHeaderId=0;
_txHeaderFlags=0;
_rxGood=0;
_txGood=0;
_cad_timeout=10000;
// Tell the low level SPI interface we will use SPI within this interrupt
//spiUsingInterrupt(interruptNumber);
RFM95W_SPISetup(); // using GPIO 6 as channel select
_rxBufValid=0;
// Set sleep mode, so we can also set LORA mode:
RFM95W_SPIByteWriteReg(RH_RF95_REG_01_OP_MODE, RH_RF95_MODE_SLEEP | RH_RF95_LONG_RANGE_MODE);
__delay_cycles(240000); // Wait 10ms for sleep mode to take over from say, CAD
// Check we are in sleep mode, with LORA set
if (RFM95W_SPIByteReadReg(RH_RF95_REG_01_OP_MODE) != (RH_RF95_MODE_SLEEP | RH_RF95_LONG_RANGE_MODE ))
{
__enable_interrupt();
return 0; // No device present?
}
// Set up FIFO
// We configure so that we can use the entire 256 byte FIFO for either receive
// or transmit, but not both at the same time
RFM95W_SPIByteWriteReg(RH_RF95_REG_0E_FIFO_TX_BASE_ADDR, 0);
RFM95W_SPIByteWriteReg(RH_RF95_REG_0F_FIFO_RX_BASE_ADDR, 0);
// Packet format is preamble + explicit-header + payload + crc
// Explicit Header Mode
// payload is TO + FROM + ID + FLAGS + message data
// RX mode is implmented with RXCONTINUOUS
// max message data length is 255 - 4 = 251 octets
setModeIdle();
// Set up default configuration
// No Sync Words in LORA mode.
setModemRegisters(0x78, 0xC4, 0x0C); // slow long range (see header file for more info)
//setModemRegisters(0x92, 0x74, 0x00); //for fast/short transmission
setPreambleLength(8); // Default is 8
setFrequency(868.0);
setTxPower(13, 0); // Lowish power (PA_boost=1 for higher power)
__enable_interrupt();
return 1;
}
void sendToLora(void){
uint8_t data[] = "Hello World!";
int status=send(data, sizeof(data)); // <--- STUCK HERE
waitPacketSent();
sprintf((char *)outString, "SENT! %d \n", status);
putsUART((unsigned char *)outString,strlen((char *)outString));
// Now wait for a reply
uint8_t buf[RH_RF95_MAX_MESSAGE_LEN];
uint8_t len = sizeof(buf);
if (waitAvailableTimeout(3000))
{
// Should be a reply message for us now
if (recv(buf, &len))
{
sprintf((char *)outString, "RSSI: %d, got reply: ", _lastRssi);
putsUART((unsigned char *)outString,strlen((char *)outString));
putsUART((unsigned char *)(char*)buf,strlen((char *)outString));
}
else
{
sprintf((char *)outString, "recieve failed. ");
putsUART((unsigned char *)outString,strlen((char *)outString));
}
}
else
{
sprintf((char *)outString, "No reply, LoRa server running?");
putsUART((unsigned char *)outString,strlen((char *)outString));
}
sprintf((char *)outString, "\n");
putsUART((unsigned char *)outString,strlen((char *)outString));
}
Thanks in advance!
