Hi Alex,
Now I am able to send Sync command for every 60ms from Gateway. But End devices not responding.
This is because AT86RF Interrupt ISR is not get call. Our board using PB14 for interrupt. File trxaccess.c which is taken from PEER2PEER project having following definition for AT86 interrupt:
typedef void (*irq_handler_t)(void);
static irq_handler_t irq_hdl_trx = NULL;
void trx_spi_init(void)
{
/* Initialize SPI in master mode to access the transceiver */
#if SAMD || SAMR21 || SAML21 || SAMR30
spi_slave_inst_get_config_defaults(&slave_dev_config);
slave_dev_config.ss_pin = AT86RFX_SPI_CS;
spi_attach_slave(&slave, &slave_dev_config);
spi_get_config_defaults(&config);
config.mux_setting = AT86RFX_SPI_SERCOM_MUX_SETTING;
config.mode_specific.master.baudrate = AT86RFX_SPI_BAUDRATE;
config.pinmux_pad0 = AT86RFX_SPI_SERCOM_PINMUX_PAD0;
config.pinmux_pad1 = AT86RFX_SPI_SERCOM_PINMUX_PAD1;
config.pinmux_pad2 = AT86RFX_SPI_SERCOM_PINMUX_PAD2;
config.pinmux_pad3 = AT86RFX_SPI_SERCOM_PINMUX_PAD3;
spi_init(&master, AT86RFX_SPI, &config);
spi_enable(&master);
struct extint_chan_conf eint_chan_conf;
extint_chan_get_config_defaults(&eint_chan_conf);
eint_chan_conf.gpio_pin = AT86RFX_IRQ_PIN;
eint_chan_conf.gpio_pin_mux = AT86RFX_IRQ_PINMUX;
eint_chan_conf.gpio_pin_pull = EXTINT_PULL_DOWN; //EXTINT_PULL_DOWN
#if (SAML21 || SAMR30)
eint_chan_conf.enable_async_edge_detection = false;
#else
eint_chan_conf.wake_if_sleeping = true;
#endif
eint_chan_conf.filter_input_signal = false;
eint_chan_conf.detection_criteria = EXTINT_DETECT_RISING;
extint_chan_set_config(AT86RFX_IRQ_CHAN, &eint_chan_conf); //AT86RFX_IRQ_CHAN=14(PB14 connected to IRQ)
extint_register_callback(AT86RFX_ISR, AT86RFX_IRQ_CHAN, EXTINT_CALLBACK_TYPE_DETECT);
extint_chan_enable_callback(AT86RFX_IRQ_CHAN,EXTINT_CALLBACK_TYPE_DETECT);
}
In the PHY_Init(), I am calling trx_irq_init(FUNC_PTR trx_irq_cb) like below to set callback function as irq_handler_trx()
void PHY_Init(void)
{
uint8_t reg;
trx_spi_init();
trx_irq_init((FUNC_PTR)irq_handler_trx);
PhyReset();
phyRxState = false;
phyBand = 0;
phyModulation = phyReadRegister(TRX_CTRL_2_REG) & 0x3f;
phyState = PHY_STATE_IDLE;
do { phyWriteRegister(TRX_STATE_REG, TRX_CMD_TRX_OFF);
} while (TRX_STATUS_TRX_OFF !=(phyReadRegister(TRX_STATUS_REG) & TRX_STATUS_MASK));
phyWriteRegister(IRQ_MASK_REG, (1<<TRX_END)); //---------> Enabling inetrrupt for Transmission and Reception
reg = phyReadRegister(RF_CTRL_0_REG) & ~0x03;
phyWriteRegister(RF_CTRL_0_REG, reg | 0X02); /* GC_TX_OFFS =3 for BPSK */
phyWriteRegister(PHY_TX_PWR_REG, 0x00); /* 3dBm */
phyWriteRegister(TRX_CTRL_1_REG,(1 << TX_AUTO_CRC_ON) | (3 << SPI_CMD_MODE) | (1 << IRQ_MASK_MODE));
phyWriteRegister(TRX_CTRL_2_REG, (1 << RX_SAFE_MODE));
}
void irq_handler_trx(void)
{
if (PHY_STATE_SLEEP == phyState)
{
return;
}
if (phyReadRegister(IRQ_STATUS_REG) & (1 << TRX_END))
{
if (PHY_STATE_IDLE == phyState)
{
PHY_DataInd_t ind;
uint8_t size;
int8_t rssi;
rssi = (int8_t)phyReadRegister(PHY_ED_LEVEL_REG);
trx_frame_read(&size, 1);
trx_frame_read(phyRxBuffer, size + 2);
ind.data = phyRxBuffer + 1;
ind.size = size - PHY_CRC_SIZE;
ind.lqi = phyRxBuffer[size + 1];
ind.rssi = rssi + phyRssiBaseVal();
PHY_DataInd(&ind);
phyWaitState(TRX_STATUS_RX_AACK_ON);
}
else if (PHY_STATE_TX_WAIT_END == phyState)
{
uint8_t status = (phyReadRegister(TRX_STATE_REG) >>TRAC_STATUS) & 7;
if (TRAC_STATUS_SUCCESS == status)
{
status = PHY_STATUS_SUCCESS;
}
else if (TRAC_STATUS_CHANNEL_ACCESS_FAILURE == status)
{
status = PHY_STATUS_CHANNEL_ACCESS_FAILURE;
}
else if (TRAC_STATUS_NO_ACK == status)
{
status = PHY_STATUS_NO_ACK;
}
else
{
status = PHY_STATUS_ERROR;
}
phySetRxState();
phyState = PHY_STATE_IDLE;
PHY_DataConf(status);
}
}
}
Please suggest a solution
Thanks,
Muthu