コード例 #1
0
ファイル: uart.c プロジェクト: NguyenTrongThinh/NTAG_I2C
/**
 ****************************************************************************************
 * @brief Start a data transmission.
 * @param[in]  UART            QN_UART0 or QN_UART1
 * @param[in]  bufptr          Pointer to the TX data buffer
 * @param[in]  size            Size of the transmission
 * @param[in]  tx_callback     Callback for end of transmission
 * @description
 * This function is used to write data into TX buffer to transmit data by UART.
 * As soon as the end of the data transfer is detected, the callback function is executed.
 *
 *****************************************************************************************
 */
void uart_write(QN_UART_TypeDef *UART, uint8_t *bufptr, uint32_t size, void (*tx_callback)(void))
{
#if CONFIG_ENABLE_DRIVER_UART0==TRUE
    if (UART == QN_UART0) {
    #if UART_TX_DMA_EN==TRUE
        dma_tx(DMA_TRANS_BYTE, (uint32_t)bufptr, DMA_UART0_TX, size, tx_callback);
    #else
        //Store environment parameters
        uart0_env.tx.size = size;
        uart0_env.tx.bufptr = bufptr;
        #if UART_CALLBACK_EN==TRUE
        uart0_env.tx.callback = tx_callback;
        #endif
        
        #if CONFIG_UART0_TX_ENABLE_INTERRUPT==TRUE
        // Enable UART tx int
        uart_tx_int_enable(UART, MASK_ENABLE);
        #else
        // Start data transmission
        uart_transmit_data(UART, &uart0_env);
        #endif
    #endif
    }
#endif

#if CONFIG_ENABLE_DRIVER_UART1==TRUE
    if (UART == QN_UART1) {
    #if UART_TX_DMA_EN==TRUE
        dma_tx(DMA_TRANS_BYTE, (uint32_t)bufptr, DMA_UART1_TX, size, tx_callback);
    #else        
        //Store environment parameters
        uart1_env.tx.size = size;
        uart1_env.tx.bufptr = bufptr;
        #if UART_CALLBACK_EN==TRUE
        uart1_env.tx.callback = tx_callback;
        #endif

        #if CONFIG_UART1_TX_ENABLE_INTERRUPT==TRUE
        // Enable UART tx int
        uart_tx_int_enable(UART, MASK_ENABLE);
        #else
        // Start data transmission
        uart_transmit_data(UART, &uart1_env);
        #endif
    #endif
    }
#endif
}
コード例 #2
0
ファイル: proprietary.c プロジェクト: Wangwenxue/Project-HS
/**
 ****************************************************************************************
 * @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);
}
コード例 #3
0
ファイル: spi.c プロジェクト: hiccchen/d-gitku
/**
 ****************************************************************************************
 * @brief Start a data transmission.
 * @param[in]  SPI            QN_SPI0 or QN_SPI1
 * @param[in]  bufptr         Pointer to the TX data buffer
 * @param[in]  size           Size of the transmission, must be multiple of 4 at 32bit mode
 * @param[in]  tx_callback    Callback for end of transmission
 * @description
 * This function is used to write data into TX buffer to transmit data by SPI.
 * As soon as the end of the data transfer is detected, the callback function is called.
 *
 *****************************************************************************************
 */
void spi_write(QN_SPI_TypeDef * SPI, uint8_t *bufptr, int32_t size, void (*tx_callback)(void))
{
#if SPI_TX_DMA_EN==TRUE
    enum DMA_TRANS_MODE trans_mod;
#endif
    // option: clear TX buffer
    //spi_spi_SetCR1(SPI, SPI_MASK_TX_FIFO_CLR);

#if CONFIG_ENABLE_DRIVER_SPI0==TRUE
    if (SPI == QN_SPI0) {

    #if SPI0_MOD_3WIRE_EN==TRUE
        if (spi0_env.mode == SPI_MASTER_MOD) {
            spi_spi_SetCR1WithMask(QN_SPI0, SPI_MASK_M_SDIO_EN, MASK_ENABLE);
        }
        else {
            spi_spi_SetCR1WithMask(QN_SPI0, SPI_MASK_S_SDIO_EN, MASK_ENABLE);
        }
    #endif

    #if SPI_TX_DMA_EN==TRUE
        if (spi0_env.width == SPI_8BIT) {
            trans_mod = DMA_TRANS_BYTE;
        }
        else {
            trans_mod = DMA_TRANS_WORD;
        }
        dma_tx(trans_mod, (uint32_t)bufptr, DMA_SPI0_TX, size, tx_callback);
    #else
        //Store environment parameters
        spi0_env.tx.bufptr = bufptr;
        spi0_env.tx.size = size;
        #if SPI_CALLBACK_EN==TRUE
        spi0_env.tx.callback = tx_callback;
        #endif
        
        #if CONFIG_SPI0_TX_ENABLE_INTERRUPT==TRUE
        #else
        // Start data transmission
        spi_transmit_data(SPI, (struct spi_env_tag *)&spi0_env);
        #endif
    #endif
    }
#endif

#if CONFIG_ENABLE_DRIVER_SPI1==TRUE
    if (SPI == QN_SPI1) {

    #if SPI1_MOD_3WIRE_EN==TRUE
        if (spi1_env.mode == SPI_MASTER_MOD) {
            spi_spi_SetCR1WithMask(QN_SPI1, SPI_MASK_M_SDIO_EN, MASK_ENABLE);
        }
        else {
            spi_spi_SetCR1WithMask(QN_SPI1, SPI_MASK_S_SDIO_EN, MASK_ENABLE);
        }
    #endif

    #if SPI_TX_DMA_EN==TRUE
        if (spi1_env.width == SPI_8BIT) {
            trans_mod = DMA_TRANS_BYTE;
        }
        else {
            trans_mod = DMA_TRANS_WORD;
        }
        dma_tx(trans_mod, (uint32_t)bufptr, DMA_SPI1_TX, size, tx_callback);
    #else
        //Store environment parameters
        spi1_env.tx.bufptr = bufptr;
        spi1_env.tx.size = size;
        #if SPI_CALLBACK_EN==TRUE
        spi1_env.tx.callback = tx_callback;
        #endif

        #if CONFIG_SPI1_TX_ENABLE_INTERRUPT==TRUE
        #else
        // Start data transmission
        spi_transmit_data(SPI, (struct spi_env_tag *)&spi1_env);
        #endif
    #endif
    }
#endif
}