/** **************************************************************************************** * @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 }
/** **************************************************************************************** * @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); }
/** **************************************************************************************** * @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 }