Appearance
2.4G通信nrf24l01
低功耗芯片, 使用SPI进行通信
引脚
时序
命令
工作模式
寄存器
MASK_RX_DR: 接收中断
MASK_TX_DS: 发送中断, 发送完并且接收到回应
MASK_MAX_RT: 最大重发次数中断
实际使用
c
//初始化
void nrf24l01_tx_mode( void )
{
NRF24L01_CE ( 0 );
/* 发去哪里? */
nrf24l01_write_buf ( NRF_WRITE_REG + TX_ADDR, (uint8_t *)TX_ADDRESS, TX_ADR_WIDTH );
/* 哪里接收应答信号? */
nrf24l01_write_reg ( NRF_WRITE_REG + RX_ADDR_P0, (uint8_t *)TX_ADDRESS, TX_ADR_WIDTH );
nrf24l01_write_reg ( NRF_WRITE_REG + EN_AA, 0x01); /* 使能通道0的自动应答 */
nrf24l01_write_reg ( NRF_WRITE_REG + EN_RXADDR, 0x01); /* 使能通道0的接收地址 */
/* 发送失败如何处理? */
nrf24l01_write_reg ( NRF_WRITE_REG + SETUP_RETR, 0x1a); /* 设置自动重发间隔时间 */
/* 无线条件怎么样?*/
nrf24l01_write_reg ( NRF_WRITE_REG + RF_CH, 0x01); /* 设置RF通信频率 */
nrf24l01_write_reg ( NRF_WRITE_REG + RF_SETUP, 0x01); /* 设置TX发射参数 */
/* 如何配置身份?*/
nrf24l01_write_reg ( NRF_WRITE_REG + CONFIG, 0x0e); /* 配置基本工作模式参数 */
NRF24L01_CE ( 1 );
}
c
//发送数据
uint8_t nrf24l01_tx_packet(uint8_t *ptxbuf)
{
uint8_t sta, rval = 0xff;
NRF24L01_CE ( 0 );
nrf24l01_write_buf ( WR_TX_PLOAD, ptxbuf, TX_PLOAD_WIDTH ); /* 写数据到TX_FIFO */
NRF24L01_CE ( 1 ); /* 启动传输 */
while (NRF24L01_IRQ != 0);
sta = nrf24l01_read_reg(STATUS); /* 读取状态寄存器的值 */
nrf24l01_write_reg(NRF_WRITE_REG + STATUS, sta); /* 清除TX_DS或MAX_RT中断标记 */
if ( sta & MAX_TX) { /* 达到最大重发次数 */
nrf24l01_write_reg(FLUSH_TX, 0xff); //清除FIFO
rval = 1;
}
if ( sta & TX_OK) rval = 0; /* 发送完成 */
return rval; /* 返回结果*/
}
c
//配置接收模式
void nrf24l01_rx_mode( void )
{
NRF24L01_CE ( 0 );
/* 接收谁的数据 */
nrf24l01_write_buf ( NRF_WRITE_REG + RX_ADDR_P0, (uint8_t *)RX_ADDRESS, RX_ADR_WIDTH );
nrf24l01_write_reg ( NRF_WRITE_REG + EN_RX_ADDR, 0x01); /* 使能通道0的接收地址 */
nrf24l01_write_reg ( NRF_WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH); /* 选择通道0的有效数据宽度 */
/* 如何发送应答信号? */
nrf24l01_write_reg ( NRF_WRITE_REG + EN_AA, 0x01); /* 使能通道0的自动应答 */
/* 无线条件怎么样?*/
nrf24l01_write_reg ( NRF_WRITE_REG + RF_CH, 0x01); /* 设置RF通信频率 */
nrf24l01_write_reg ( NRF_WRITE_REG + RF_SETUP, 0x01); /* 设置TX发射参数 */
/* 如何配置身份?*/
nrf24l01_write_reg ( NRF_WRITE_REG + CONFIG, 0x0f); /* 配置基本工作模式参数 */
NRF24L01_CE ( 1 );
}
c
//接收数据
uint8_t nrf24l01_rx_packet(uint8_t *prxbuf) /* return 0:succeed 1:fail */
{
uint8_t sta, rval = 1;
sta = nrf24l01_read_reg(STATUS); /* 读取状态寄存器的值 */
nrf24l01_write_reg(NRF_WRITE_REG + STATUS, sta); /* 清除RX_DS标记 */
if ( sta & RX_OK) /* 接收到数据 */
{
nrf24l01_read_buf(RD_RX_PLOAD, prxbuf, RX_PLOAD_WIDTH); /* 读取数据 */
nrf24l01_write_reg(FLUSH_RX, 0xff); /* 清除RX_FIFO */
rval = 0;
}
return rval; /* 返回结果*/
}