現在是想實作3FIFO通訊,也就是直接發送接收96byte,現在可以發送,但是接收那邊用邏輯分析儀測驗只接收到64byte,而且中間有一個446us的延時(代碼沒有加延時),發送不確定是否完美。
發送配置
void TX_Mode(void)
{
NRF24L01_NRF_WRITE_REG(NRF_WRITE_REG+CONFIG, 0x02);//關機模式
NRF24L01_CE_0();
NRF24L01_Write_Buf(NRF_WRITE_REG+TX_ADDR,(uint8_t*)TX_ADDRESS,TX_ADR_WIDTH);//寫TX節點地址
//NRF24L01_Write_Buf(NRF_WRITE_REG+RX_ADDR_P0,(uint8_t*)RX_ADDRESS,RX_ADR_WIDTH); //設定TX節點地址,主要為了使能ACK
NRF24L01_NRF_WRITE_REG(NRF_WRITE_REG+SETUP_AW,0x01); //地址位3個位元組
NRF24L01_NRF_WRITE_REG(NRF_WRITE_REG+EN_AA,0x00); //關閉通道0的自動應答
NRF24L01_NRF_WRITE_REG(NRF_WRITE_REG+FEATURE, 0x01); //使能命令W_TX_PAYLOAD_NOACK
NRF24L01_NRF_WRITE_REG(NRF_WRITE_REG+SETUP_RETR, 0x00); //使能命令W_TX_PAYLOAD_NOACK
NRF24L01_NRF_WRITE_REG(NRF_WRITE_REG+RF_CH,1); //設定RF通道 ,通道1-125,要避免其他信號的干擾,選擇不常用的,通常越中間干擾越大
//NRF24L01_NRF_WRITE_REG(NRF_WRITE_REG+RF_SETUP,0x0f); //設定TX發射引數,0db增益,2Mbps,低噪聲增益開啟
NRF24L01_NRF_WRITE_REG(NRF_WRITE_REG+RF_SETUP,0x07); //設定TX發射引數,0db增益,1Mbps,低噪聲增益開啟
//NRF24L01_NRF_WRITE_REG(NRF_WRITE_REG+RF_SETUP,0x27); //設定TX發射引數,0db增益,250kbps,低噪聲增益開啟
//NRF24L01_NRF_WRITE_REG(NRF_WRITE_REG+CONFIG,0x0e); //配置基本作業模式的引數;PWR_UP,EN_CRC,16BIT_CRC,接收模式,開啟所有中斷
NRF24L01_NRF_WRITE_REG(NRF_WRITE_REG+CONFIG,0x0A); //接收模式,開啟所有中斷,無CRC
NRF24L01_CE_1();//CE為高,10us后啟動發送
Delay1(0xffff); //CE要拉高一段時間才進入發送模式
}
接收配置
void RX_Mode(void)
{
NRF24L01_NRF_WRITE_REG(NRF_WRITE_REG+CONFIG, 0x02);//關機模式
NRF24L01_CE_0();
NRF24L01_Write_Buf(NRF_WRITE_REG+RX_ADDR_P1,(uint8_t*)RX_ADDRESS,RX_ADR_WIDTH);//寫RX節點地址
NRF24L01_NRF_WRITE_REG(NRF_WRITE_REG+SETUP_AW,0x01); //地址位3個位元組
NRF24L01_NRF_WRITE_REG(NRF_WRITE_REG+FEATURE, 0x01); //使能命令W_TX_PAYLOAD_NOACK
NRF24L01_NRF_WRITE_REG(NRF_WRITE_REG+EN_AA,0x00); //關閉通道0的自動應答
NRF24L01_NRF_WRITE_REG(NRF_WRITE_REG+EN_RXADDR,0x02);
//使能通道0的接收地址
NRF24L01_NRF_WRITE_REG(NRF_WRITE_REG+RF_CH,1); //設定RF通信頻率
NRF24L01_NRF_WRITE_REG(NRF_WRITE_REG+RX_PW_P1,RX_PLOAD_WIDTH);//選擇通道0的有效資料寬度
//NRF24L01_NRF_WRITE_REG(NRF_WRITE_REG+RF_SETUP,0x0f);//設定TX發射引數,0db增益,2Mbps,低噪聲增益開啟
NRF24L01_NRF_WRITE_REG(NRF_WRITE_REG+RF_SETUP,0x07);//設定TX發射引數,0db增益,1Mbps,低噪聲增益開啟
//NRF24L01_NRF_WRITE_REG(NRF_WRITE_REG+RF_SETUP,0x27);//設定TX發射引數,0db增益,250kbps,低噪聲增益開啟
//NRF24L01_NRF_WRITE_REG(NRF_WRITE_REG+CONFIG, 0x0f);//配置基本作業模式的引數;PWR_UP,EN_CRC,16BIT_CRC,接收模式
NRF24L01_NRF_WRITE_REG(NRF_WRITE_REG+CONFIG, 0x0B);//接收模式 ,無crc
NRF24L01_CE_1() ; //CE為高,進入接收模式
}
void NRF24L01_RxPacket_96bit(uint16_t *rxbuf)
{
uint8_t status,sta,i,j,data1,fifo_status;
uint16_t data;
uint8_t num=0;
NRF24L01_CE_1();
while(NRF24L01_IRQ!=0);//等待接收完成
NRF24L01_CE_0();
sta=NRF24L01_Read_Reg(STATUS); //讀取狀態暫存器的值
if(sta&RX_OK)//接收到資料
{
fifo_status = NRF24L01_Read_Reg(FIFO_STATUS);
while(!(fifo_status & 0x01))
{
NRF24L01_CE_0();
NRF24L01_CSN_0(); //使能SPI傳輸
SPIx_ReadWriteByte(RD_RX_PLOAD);//發送暫存器值(位置),并讀取狀態值
for(j=0;j<FIFO_SIZE;j++)
{
data1=SPIx_ReadWriteByte(0xFF);//讀出資料
data=https://bbs.csdn.net/topics/(data1<<8);
*rxbuf++=data;
*rxbuf++=0;
}
NRF24L01_CSN_1(); //關閉SPI傳輸
NRF24L01_CE_1();
fifo_status = NRF24L01_Read_Reg(FIFO_STATUS);
}
NRF24L01_NRF_WRITE_REG(NRF_WRITE_REG+STATUS,sta); //清除TX_DS或MAX_RT中斷標志
NRF24L01_NRF_WRITE_REG(FLUSH_RX,0xff);//清除RX FIFO暫存器
}
}
void NRF24L01_TxPacket_96bit(uint16_t *txbuf)
{
uint8_t sta,status,j,i,data,fifo_status;
uint16_t data1,data2;
//NRF24L01_NRF_WRITE_REG(FLUSH_TX,0xff);//清除TX FIFO暫存器
NRF24L01_NRF_WRITE_REG(NRF_WRITE_REG+STATUS,0x20); //清除TX_DS或MAX_RT中斷標志
fifo_status = NRF24L01_Read_Reg(FIFO_STATUS);
if((fifo_status & 0x10))
{
NRF24L01_CE_0();
for(i=0;i<3;i++)
{
NRF24L01_CSN_0();
status = SPIx_ReadWriteByte(W_TX_PAYLOAD_NOACK);//發送暫存器值(位置),并讀取狀態值
for(j=0;j<FIFO_SIZE; j++)
{
data1=*txbuf++;
data2=*txbuf++;
data=https://bbs.csdn.net/topics/(uint8_t)((data1+data2)>>8);
SPIx_ReadWriteByte(data); //寫入資料
}
NRF24L01_CSN_1(); //關閉SPI傳輸
}
NRF24L01_CE_1();//啟動發送
}
while(NRF24L01_IRQ!=0);//等待發送完成
delay_us(7);//delay_us(500);
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/42244.html
標籤:網絡通信
