Example #1
0
/**
 ****************************************************************************************
 * @brief  Proprietary mode receive
 * @param[in]    ble_ch_idx     Channel frequency index
 *      Get this parameter from rf_freq_tab[](in file qnrf.c) accroding to the frequency
 *      chosen
 * @param[in]    aa_buf         Access address buffer, own device address
 * @param[in]    aa_num         Access address length
 * @param[in]    data_buf       Receive data buffer
 * @param[in]    data_len       Receive data length
 * @param[in]    tx_callback    Called after receive complete
 *****************************************************************************************
 */
void prop_mode_rx(uint32_t ble_ch_idx, uint8_t *aa_buf, enum PROP_AA_NUM aa_num, uint8_t *data_buf, uint16_t data_len)
{
    
    /* Wait for last transfer complete */
    while(dp_dp_GetReg(0x38)& DP_MASK_TX_BUSY);
    
    /* Channel configure */
    rf_set_freq(RF_RX_IMR0, ble_ch_idx);
    
    /* Access Address and Payload length, Note: Payload length in bit */
    dp_dp_SetRegWithMask(0x00, DP_MASK_RX_PDU_LEN_IN, data_len << 3);
    dp_dp_SetRegWithMask(0x04, 
                        (DP_MASK_PROP_AA_NUM | DP_MASK_PROP_AA_ADDR_IN),
                        (aa_num << DP_POS_PROP_AA_NUM) | (aa_buf[4]));
    dp_dp_SetReg(0x08, *(uint32_t *)aa_buf);
    
    /* Enable transmit request */
    dp_dp_SetRegWithMask(0x00, DP_MASK_RX_REQ, 0);
    dp_dp_SetRegWithMask(0x00, DP_MASK_RX_REQ, DP_MASK_RX_REQ);
    
    //Wait for ready(40us)
    delay(70);
    
    /* Receive pack by DMA */
    prop_ctrl_reset();
    dma_rx(DMA_TRANS_BYTE, DMA_PROP_RX, (uint32_t)data_buf, data_len, NULL);
    
    /* Wait for transfer complete */
    while(!(dma_dma_GetIntStatus(QN_DMA) & DMA_MASK_DONE));
    dma_dma_ClrIntStatus(QN_DMA, DMA_MASK_DONE);
}
Example #2
0
/**
 ****************************************************************************************
 * @brief  Proprietary mode transmit
 * @param[in]    ble_ch_idx     Channel frequency index
 *      Get this parameter from rf_freq_tab[](in file qnrf.c) accroding to the frequency
 *      chosen
 * @param[in]    aa_buf         Access address buffer, destination device address
 * @param[in]    aa_num         Access address length
 * @param[in]    data_buf       Transmit data buffer
 * @param[in]    data_len       Transmit data length
 * @param[in]    tx_callback    Called after transmission complete
 *****************************************************************************************
 */
void prop_mode_tx(uint32_t ble_ch_idx, uint8_t *aa_buf, enum PROP_AA_NUM aa_num, uint8_t *data_buf, uint16_t data_len)
{
    uint8_t preamble_byte;
    uint8_t preamble_num;
    
    uint16_t i;
    
    /* Wait for last transfer complete */
    while(dp_dp_GetReg(0x38) & DP_MASK_TX_BUSY);
    
    /* Channel configure */
    rf_set_freq(RF_TX, ble_ch_idx);
    
    /* Access Address and Payload length, Note: Payload length in bit */
    dp_dp_SetRegWithMask(0x00, DP_MASK_RX_PDU_LEN_IN, data_len << 3);
    dp_dp_SetRegWithMask(0x04, DP_MASK_PROP_AA_NUM, aa_num << DP_POS_PROP_AA_NUM);
    
    /* Preamble pack */
    preamble_num  = PROP_PREAMBLE_NUM;
    preamble_byte = (prop_tx_buf[0] & 0x80) ? 0xAA : 0x55;
    for(i = 0; i < preamble_num; i++)
    {
        prop_tx_buf[i] = preamble_byte;
    }
    
    /* Access Address pack */
    aa_num += 2;
    preamble_num  = PROP_PREAMBLE_NUM;
    for(i = 0; i < aa_num; i++)
    {
        prop_tx_buf[preamble_num+i] = aa_buf[aa_num-1-i];
    }
    
    /* Payload pack */
    for(i = 0; i < data_len; i++)
    {
        prop_tx_buf[preamble_num + aa_num + i] = data_buf[i];
    }
    
    /* Enable transmit request */
    dp_dp_SetRegWithMask(0x00, DP_MASK_TX_REQ, 0);
    dp_dp_SetRegWithMask(0x00, DP_MASK_TX_REQ, DP_MASK_TX_REQ);
    
    //Wait for ready(40us)
    delay(70);
    
    /* Transmit pack by DMA */
    prop_ctrl_reset();
    dma_tx(DMA_TRANS_BYTE, (uint32_t)prop_tx_buf, DMA_PROP_TX, (preamble_num + aa_num + data_len), NULL);
    
    /* Wait for transfer complete */
    while(!(dma_dma_GetIntStatus(QN_DMA) & DMA_MASK_DONE));
    dma_dma_ClrIntStatus(QN_DMA, DMA_MASK_DONE);
    
    /* Wait for complete */
    while(dp_dp_GetReg(0x38) & DP_MASK_TX_BUSY);
}
Example #3
0
/**
 ****************************************************************************************
 * @brief DMA interrupt handler
 ****************************************************************************************
 */
void DMA_IRQHandler(void)
{
    uint32_t reg;

    dev_allow_sleep(PM_MASK_DMA_ACTIVE_BIT);
    reg = dma_dma_GetIntStatus(QN_DMA);
    if (reg & DMA_MASK_DONE) {
        /* clear interrupt flag */
        dma_dma_ClrIntStatus(QN_DMA, DMA_MASK_DONE);

#if DMA_CALLBACK_EN==TRUE
        // Call end of Transfer callback
        if (dma_env.callback != NULL) {
            dma_env.callback();
        }
#endif
    }
    else if (reg & DMA_MASK_ERRO) {
         /* clear interrupt flag */
        dma_dma_ClrIntStatus(QN_DMA, DMA_MASK_ERRO);
    }
}