nRF24L01是收發(fā)雙方都要編程的,同時(shí)調(diào)試一旦出錯(cuò),不易判斷哪方出錯(cuò),所以可以采用分開(kāi)調(diào)試。
收發(fā)過(guò)程:
發(fā)送 - 等待應(yīng)答 - (自動(dòng)重發(fā))- 產(chǎn)生中斷
接收 - 等待應(yīng)答 - 產(chǎn)生中斷
取消等待應(yīng)答便可以實(shí)現(xiàn)單獨(dú)調(diào)試發(fā)送方了,等發(fā)送方調(diào)試成功再調(diào)接收方。
SPI模擬函數(shù):
u8 SPI_RW(u8 byte)
{
}
u8 SPI_RW_Reg(u8 reg, u8 value)
{
u8 status;
status = SPI_RW(reg); // 選擇寄存器,同時(shí)返回狀態(tài)字
SPI_RW(value); // 然后寫數(shù)據(jù)到該寄存器
CSN = 1; // CSN拉高,結(jié)束數(shù)據(jù)傳輸
return(status); // 返回狀態(tài)寄存器
}
u8 SPI_Read(u8 reg)
{
u8 reg_val;
CSN = 0; // CSN置低,開(kāi)始傳輸數(shù)據(jù)
SPI_RW(reg); // 選擇寄存器
reg_val = SPI_RW(0); // 然后從該寄存器讀數(shù)據(jù)
CSN = 1; // CSN拉高,結(jié)束數(shù)據(jù)傳輸
return(reg_val); // 返回寄存器數(shù)據(jù)
}
u8 SPI_Read_Buf(u8 reg, u8 *pBuf, u8 bytes)
{
u8 status, i;
CSN = 0; // CSN置低,開(kāi)始傳輸數(shù)據(jù)
status = SPI_RW(reg); // 選擇寄存器,同時(shí)返回狀態(tài)字
for(i=0; i
CSN = 1; // CSN拉高,結(jié)束數(shù)據(jù)傳輸
return(status); // 返回狀態(tài)寄存器
}
u8 SPI_Write_Buf(u8 reg, u8 *pBuf, u8 bytes)
{
u8 status, i;
CSN = 0; // CSN置低,開(kāi)始傳輸數(shù)據(jù)
status = SPI_RW(reg); // 選擇寄存器,同時(shí)返回狀態(tài)字
delay_us(10);
for(i=0; i
SPI_RW(*pBuf++); // 逐個(gè)字節(jié)寫入nRF24L01
CSN = 1; // CSN拉高,結(jié)束數(shù)據(jù)傳輸
return(status); // 返回狀態(tài)寄存器
}
void SetRX_Mode(void)
{
//CE=0; //可以不進(jìn)行拉低操作,考慮此時(shí)的效率
//SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f); // IRQ收發(fā)完成中斷響應(yīng),16位CRC ,主接收
delay_us(1500); // 需要一定的延時(shí),具體時(shí)間等待驗(yàn)證(手冊(cè)上寫的是130us)
}
// 接受數(shù)據(jù)函數(shù)
u8 RxPacket(u8* rx_buf)
{
sta = SPI_Read(STATUS); // 讀取狀態(tài)寄存其來(lái)判斷數(shù)據(jù)接收狀況
if(RX_DR) // 判斷是否接收到數(shù)據(jù)
{
SPI_Read_Buf(RD_RX_PLOAD,rx_buf,TX_PLOAD_WIDTH); // read receive payload from RX_FIFO buffer
revale =1; // 讀取數(shù)據(jù)完成標(biāo)志
}
SPI_RW_Reg(WRITE_REG+STATUS,sta); // 接收到數(shù)據(jù)后RX_DR置高,寫1清中斷標(biāo)志,同時(shí)清除RX FIFOS?
return revale; // 是否接受到數(shù)據(jù)的標(biāo)志位
}
// 發(fā)送數(shù)據(jù)函數(shù)
void TxPacket(u8* tx_buf)
{
CE=0; //StandBy I模式
SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); // 裝載接收端地址
SPI_Write_Buf(WR_TX_PLOAD, tx_buf, TX_PLOAD_WIDTH); // 裝載數(shù)據(jù)
//SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e); // IRQ收發(fā)完成中斷響應(yīng),16位CRC,主發(fā)送
CE=1; //置高CE,激發(fā)數(shù)據(jù)發(fā)送
delay_us(1000); //延時(shí)時(shí)間待最小確定,是否是130us?
}
// 初始化TX or RX Mode
void init_nRF(void)
{
delay_us(1000);
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_RW_Reg(WRITE_REG + EN_AA, 0x00); // 頻道0自動(dòng) ACK應(yīng)答允許
SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01); // 允許接收地址只有頻道0,如果需要多頻道可以參考Page21
SPI_RW_Reg(WRITE_REG + RF_CH, 0); // 設(shè)置信道工作為2.4GHZ,收發(fā)必須一致
//SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0X00); // disable the retr (TX mode)
SPI_RW_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH); // 設(shè)置接收數(shù)據(jù)長(zhǎng)度,本次設(shè)置為32字節(jié)
SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07); // 設(shè)置發(fā)射速率為1MHZ,發(fā)射功率為最大值0dB
SPI_RW_Reg(WRITE_REG + CONFIG, 0X0F); // 0x0f for RX (0x0e for TX mode)
delay_ms(1);
}
第一步:
寄存器的讀寫操作。寫進(jìn)(如CONFIG)一個(gè)值,然后讀出,可以檢查nRF24L01是否正常,引腳配置與連接是否正確,SPI模擬時(shí)序函數(shù)是否可用等。
第二步:
然后再只調(diào)發(fā)送端。把自動(dòng)應(yīng)答關(guān)閉。
SPI_RW_Reg(WRITE_REG + EN_AA, 0X00); //取消通道0自動(dòng)應(yīng)答
SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0X00); //無(wú)接收通道
SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0X00); //取消自動(dòng)重發(fā)功能
第三步:
最后調(diào)接收端,同樣先把自動(dòng)應(yīng)答關(guān)閉。
SPI_RW_Reg(WRITE_REG + EN_AA, 0X00); //取消通道0自動(dòng)應(yīng)答
SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0X01); //使能接收通道0