nRF24L01无线模块使用(待写。。。)

版权声明:本文为博主原创文章。 https://blog.csdn.net/u012763833/article/details/52899965

以前用过,最近得好好整理资料
time pass
nRF24L01的通信接口为SPI,其读写操作时序图如下图所示:


nRF24L01 SPI write & read operation

SPI总线模式选择

    SPI_InitTypeDef  SPI_InitStructure; 

    SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;   // SPI设置为双线双向全双工
    SPI_InitStructure.SPI_Mode = SPI_Mode_Master;                        // SPI主机
    SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;                    // 发送接收8位帧结构
    SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;                           // 时钟悬空低
    SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;                         // 数据捕获于第1个时钟沿
    SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;                            // NSS信号由软件控制
    SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_16;  // 定义波特率预分频的值:波特率预分频值为16
    SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;                   // 数据传输从MSB位开始
    SPI_InitStructure.SPI_CRCPolynomial = 7;                             // CRC值计算的多项式
    SPI_Init(SPI1, &SPI_InitStructure);                                  // 根据SPI_InitStruct中指定的参数初始化外设SPIx寄存器

nRF24L01操作函数

/**
 * nRF24L01写寄存器
 * @param reg:
 * @param data:
 * @return:读写状态
 */
void nrf24l01_write_reg(uint8_t reg, uint8_t data)
{
    NRF24L01_CSN_LOW();      
    spi_read_write_byte(NRF_WRITE_REG | reg);    
    spi_read_write_byte(data);       
    NRF24L01_CSN_HIGH();         
}

/**
 * nRF24L01读寄存器
 * @param reg:寄存器地址
 * @note   地址在设备中有效
 * @return 读取的数据
 */
uint8_t nrf24l01_read_reg(uint8_t reg)
{
    uint8_t btmp;

    NRF24L01_CSN_LOW();                       
    spi_read_write_byte(NRF_READ_REG | reg);  
    btmp = spi_read_write_byte(0xFF);         
    NRF24L01_CSN_HIGH();                          

    return btmp;
}

/**
 * nRF24L01写指定长度的数据
 * @param reg:寄存器地址
 * @param p_buf:数据存放地址
 * @param len:数据长度
 * @note  数据长度不超过255,地址在设备中有效
 * @return 写状态
 */
void nrf24l01_write_buf(uint8_t reg, uint8_t *p_buf, uint8_t len)
{
    uint8_t i;

    NRF24L01_CSN_LOW();      
    spi_read_write_byte(NRF_WRITE_REG | reg);  
    for (i=0; i<len; i++) {
        spi_read_write_byte(*(p_buf + i));  
    }
    NRF24L01_CSN_HIGH();         
}

/**
 * nRF24L01读指定长度的数据
 * @param reg:寄存器地址
 * @param p_buf:数据存放地址
 * @param len:数据长度
 * @note  数据长度不超过255,地址在设备中有效
 * @return 读取状态
 */
void nrf24l01_read_buf(uint8_t reg, uint8_t *p_buf, uint8_t len)
{
    uint8_t btmp;

    NRF24L01_CSN_LOW();     
    spi_read_write_byte(NRF_READ_REG | reg);         
    for (btmp=0; btmp<len; btmp++) {
        *(p_buf + btmp) = spi_read_write_byte(0xFF);      
    }
    NRF24L01_CSN_HIGH();        
}

/**
 * nRF24L01发送数据
 * @param tx_buf:发送数据的地址
 * @param len:数据长度
 * @return
 *          MAX_TX:达到最大重发次数
 *          TX_OK:发送完成
 *          0xFF:其他原因发送失败
 */ 
uint8_t nrf24l01_tx_packet(uint8_t *tx_buf, uint8_t len)
{
    uint8_t status = 0;
    uint16_t ms_times = 0;

    NRF24L01_CSN_LOW();     
    spi_read_write_byte(FLUSH_TX);
    NRF24L01_CSN_HIGH();

    NRF24L01_CE_LOW();      
    nrf24l01_write_buf(WR_TX_PLOAD, tx_buf, len);    
    NRF24L01_CE_HIGH();   
    while (0 != NRF24L01_GET_IRQ_STATUS()) {
        //delay_ms(1);
        if (500 == ms_times++) {  // 超时未发送成功,重新初始化设备。 
            nrf24l01_gpio_init();
            nrf24l01_init();
            nrf24l01_set_mode(MODE_TX);
            break;
        }
    }
    status = nrf24l01_read_reg(STATUS);  // 读状态寄存器 
    nrf24l01_write_reg(STATUS, status);  // 清除TX_DS或MAX_RT中断状态

    if (status & MAX_TX) {  
        nrf24l01_write_reg(FLUSH_TX, 0xFF); 
        return MAX_TX; 
    }
    if (status & TX_OK) { 
        return TX_OK;
    }

    return 0xFF;    
}

/**
 * nRF24L01接收数据
 * @param rxbuf:接收数据存放地址
 * @return 接收到数据的长度
 */ 
uint8_t nrf24l01_rx_packet(uint8_t *rx_buf)
{
    uint8_t status = 0, rx_len = 0;

    status = nrf24l01_read_reg(STATUS);  // 读状态寄存器 
    nrf24l01_write_reg(STATUS, status);  // 清除中断状态
    if (status & RX_OK) {  
        rx_len = nrf24l01_read_reg(R_RX_PL_WID);        
        nrf24l01_read_buf(RD_RX_PLOAD, rx_buf, rx_len);  
        nrf24l01_write_reg(FLUSH_RX, 0xff);                 
        return rx_len; 
    }   

    return 0;           
}

猜你喜欢

转载自blog.csdn.net/u012763833/article/details/52899965