以前用过,最近得好好整理资料
time pass
nRF24L01的通信接口为SPI,其读写操作时序图如下图所示:
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;
}