一.SPI协议
二.SPI指令
向寄存器写数据(写寄存器指令+寄存器地址,写入数据)伪代码soft_spi_write_8bit_register函数向指定寄存器写入一个数据soft_spi_write_8bit_register(soft_spi_obj, W_REGISTER(写指令)+ 寄存器地址, 写入数据);
三.工作模式
四.发送端寄存器配置
(1)写Rx节点地址RX_ADDR_P0
soft_spi_write_8bit_registers函数向指定寄存器写入多个数据
soft_spi_write_8bit_registers(soft_spi_obj, W_REGISTER(写指令)+ RX_ADDR_P0, RX_ADDRESS, RX_ADR_WIDTH);//写接收地址
(2)使能AUTO ACK EN_AA
这里只使用了通道0所以只用使能通道0自动应答,配置为0x01
(3)使能PIPE 0 EN_RXADDR
这里只使用了通道0所以只用使能接收通道0,配置为0x01
(4)设置通信频率RF_CH
设置射频通道频率40
(5)设置接收通道0有效数据宽度Rx_Pw_P0
这里只使用了接收数据通道0设置接收地址有效数据的宽度32
(6)配置发射参数(低噪放大增益、发射功率、无线速率)
设置射频寄存器,这里我设置的使0x0F,即传输速率1-2Mbps,发射功率0dBm,低噪声放大器增益
(7)配置24L01基本参数以及切换工作模式
五.发射端寄存器配置
(1)写Tx节点地址TX_ADDR
soft_spi_write_8bit_registers函数向指定寄存器写入多个数据
soft_spi_write_8bit_registers(soft_spi_obj, W_REGISTER(写指令)+ TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH);//写发送地址
(2)写Rx节点地址RX_ADDR_P0
soft_spi_write_8bit_registers函数向指定寄存器写入多个数据
soft_spi_write_8bit_registers(soft_spi_obj, W_REGISTER(写指令)+ RX_ADDR_P0, RX_ADDRESS, RX_ADR_WIDTH);//写接收地址
(3)使能AUTO ACK EN_AA
这里只使用了通道0,所以只用使能通道0自动应答,配置为0x01
(4)使能PIPE 0 EN_RXADDR
这里只使用了通道0所以只用使能接收通道0,配置为0x01
(5)配置自动重发次数SETUP_RETR
这里设置的是0x1A,自动重发延时500us + 86us 自动重发计数10次
(6)设置通信频率RF_CH
设置射频通道频率40
(7)配置发射参数(低噪放大增益、发射功率、无线速率)
设置射频寄存器,这里我设置的使0x0F,即传输速率1-2Mbps,发射功率0dBm,低噪声放大器增益
(8)设置接收通道0有效数据宽度Rx_Pw_P0
这里只使用了接收数据通道0设置接收地址有效数据的宽度32
(9)配置24L01基本参数以及切换工作模式
六.接收端代码
通过判断状态寄存器第6位是否是1来判断是否接收到了数据
void main(void)
{
uchar sta;
init_io(); //初始化IO引脚
delay_ms(1000);
RX_Mode(); //配置为接收模式
while(1)
{
sta=SPI_Read(STATUS); //读取芯片的状态寄存器
if((sta & 0x40) != 0) //是否发生了接收数据完成的中断
{ //是的话,将收到的数据存到数组rx_buf里
SPI_Read_Buf(RD_RX_PLOAD,rx_buf,TX_PLOAD_WIDTH);
}
SPI_RW_Reg(FLUSH_RX,0xff); //清除接收缓冲器
SPI_RW_Reg(WRITE_REG+STATUS,sta);//清除接收中断标志
delay_ms(1000);
}
}
七.发送端代码
数据发送完成IRQ引脚为低电平
void main(void)
{
unsigned char sta;
delay_ms(1000);
init_io(); //引脚初始化
delay_ms(1000);
TX_Mode(); //发送端初始化
while(1)
{
CE = 0;
SPI_Write_Buf(WR_TX_PLOAD, tx_buf, TX_PLOAD_WIDTH); //将数据送入发射缓冲区
CE = 1;
while(IRQ);
sta=SPI_Read(STATUS);
SPI_RW_Reg(FLUSH_TX, 0xff); //清除发射缓冲区
SPI_RW_Reg(WRITE_REG+STATUS,sta); //清除各种中断标志
delay_ms(1000);
}
}