void NRF_Init(void){ Delay_us(100); CE=0; // chip enable CSN=1; // Spi disable SCK=0; // Spi clock line init high SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH); // 写本地地址 SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, RX_ADDRESS, RX_ADR_WIDTH); // 写接收端地址 SPI_WriteReg(WRITE_REG + EN_AA, 0x01); // 频道0自动 ACK应答允许 SPI_WriteReg(WRITE_REG + EN_RXADDR, 0x01); // 允许接收地址只有频道0,如果需要多频道可以参考Page21 SPI_WriteReg(WRITE_REG + RF_CH, 40); // 设置信道工作为2.4GHZ,收发必须一致 SPI_WriteReg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH); //设置接收数据长度,本次设置为20字节 SPI_WriteReg(WRITE_REG + RF_SETUP, 0x07); //设置发射速率为1MHZ,发射功率为最大值0dB }
void NRF_Send(uchar * buf_send){ CE=0; //StandBy I模式 SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); // 装载接收端地址 SPI_Write_Buf(WR_TX_PLOAD, buf_send, TX_PLOAD_WIDTH); // 装载数据 SPI_WriteReg(WRITE_REG + CONFIG, 0x0e); // IRQ收发完成中断响应,16位CRC,主发送 CE=1; //置高CE,激发数据发送 Delay_us(10); }
void MFRC522_WriteRegister(uint8_t addr, uint8_t val) { RF_Activate(); // Address format:0XXXXXX0 addr = (addr << 1) & 0x7E; // Address format: 0XXXXXX0 SPI_WriteReg(addr, val); RF_Deactivate(); }
void NRF_Receive(uchar * buf_recv){ //uchar revale=0; sta=SPI_ReadReg(STATUS); // 读取状态寄存其来判断数据接收状况 if(Flag_Receive) // 判断是否接收到数据 { CE = 0; //SPI使能 SPI_Read_Buf(RD_RX_PLOAD,buf_recv,TX_PLOAD_WIDTH);// read receive payload from RX_FIFO buffer //revale =1; //读取数据完成标志 } SPI_WriteReg(WRITE_REG+STATUS,sta); //接收到数据后RX_DR,TX_DS,MAX_PT都置高为1,通过写1来清楚中断标志 }
void NRF_setMode_Send(){ CE=0; SPI_WriteReg(WRITE_REG + CONFIG, 0x0e); // IRQ收发完成中断响应,16位CRC,主发送 CE = 1; Delay_us(130); }
void NRF_setMode_Receive(){ CE=0; SPI_WriteReg(WRITE_REG + CONFIG, 0x0f); // IRQ收发完成中断响应,16位CRC ,主接收 CE = 1; Delay_us(130); }