请教老鸟->NRF24L01+ 无法兼容24L01原有代码
以前24L01的代码已经经过多个平台的使用,只需要底层的SPI驱动函数即可正常通讯。但换成24L01+后就不能通讯了,调了两天没有结果,板子是自己送出去做的,用24L01测试没有问题。硬件连接没有问题,发送端和接受端状态寄存器返回值均为0x0e。上网找了一些24L01+的代码,移植过去也是一样的结果。这个东西很不好调试,所以想请教一下有用过这两款芯片的老鸟们它们在配置寄存器方面有什么差异?是否可以提供局部的代码参考一下呢,谢谢。以下是不带+正常通讯的部分代码void SetRX_Mode(u8 num){
CE_L;
SPI_RW_Reg(WRITE_REG + RX_PW_P0, num);
SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f); // IRQ收发完成中断响应,16位CRC ,主接收
delay_us(200);
CE_H;
}
u8 nRF24L01_RxPacket(unsigned char* rx_bufn,u8 num)
{
u8 sta;
u8 revale=0;
CE_L; //SPI使能
sta=SPI_Read(STATUS); // 读取状态寄存其来判断数据接收状况
if(sta & RX) // 判断是否接收到数据
{
CE_L; //SPI使能
SPI_Read_Buf(RD_RX_PLOAD,rx_bufn,num);// read receive payload from RX_FIFO buffer
revale =1;//读取数据完成标志
SPI_RW_Reg(WRITE_REG+STATUS,sta); //接收到数据后RX_DR,TX_DS,MAX_PT都置高为1,通过写1来清楚中断标志
SPI_Read(FLUSH_RX);
}
CE_H;
return revale;
}
void nRF24L01_TxPacket(u8 * tx_buf,u8 num)
{
u8 temp = SPI_Read(STATUS);
temp &= 0x31;
if(temp)
{
SPI_Read(FLUSH_TX);
SPI_RW_Reg(WRITE_REG+STATUS,temp);
}
SPI_RW_Reg(WRITE_REG+STATUS,0xff);
SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); // 装载接收端地址
SPI_Write_Buf(WR_TX_PLOAD, tx_buf, num); // 装载数据
SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e); // IRQ收发完成中断响应,16位CRC,主发送
CE_H; //置高CE,激发数据发送
delay_us(20);
CE_L; //StandBy I模式
delay_us(100);
SPI_RW_Reg(WRITE_REG+STATUS,0xff);
}
void SPI_init(void)
{
SPI0CFG = 0x40;
SPI0CN = 0x0D;
SPI0CKR = 0x04;
}
void init_NRF24L01(void)
{
delay_us(10000);
SPI_init();
CE_L; // chip enable
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, 0x01); //频道0自动 ACK应答允许
SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01);//允许接收地址只有频道0,如果需要多频道可以参考Page21
SPI_RW_Reg(WRITE_REG + RF_CH, 0); // 设置信道工作为2.4GHZ,收发必须一致
SPI_RW_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH); //设置接收数据长度,本次设置为4字节
SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07); //设置发射速率为1Mkbps,发射功率为最大值0dB
SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x01);
}
问题已解决,初始化代码改为以下形式即可:void init_NRF24L01(void)
{
delay_us(10000);
SPI_init();
CE_L; // chip enable
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, 0x01); //频道0自动 ACK应答允许
SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01);//允许接收地址只有频道0,如果需要多频道可以参考Page21
SPI_RW_Reg(WRITE_REG + RF_CH, 0); // 设置信道工作为2.4GHZ,收发必须一致
SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x03);
SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x0e); //设置发射速率为1MHZ,发射功率为最大值0dB
SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e); CE_H;
} mangoes 发表于 2012-8-13 00:36 static/image/common/back.gif
问题已解决,初始化代码改为以下形式即可:
嗯,我也发现不兼容的问题!谢啦 谢谢 very good !!! mark!!!!!! good,mark
mark{:smile:} SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x0e); //设置发射速率为1MHZ,发射功率为最大值0dB
24L01+ SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x06); 0x06才是1M啊,0x0e是2M吧
请指教
noynot 发表于 2013-4-8 17:56 static/image/common/back.gif
SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x0e); //设置发射速率为1MHZ,发射功率为最大值0dB
...
我的野火板子例程:SPI_NRF_WriteReg(NRF_WRITE_REG + RF_SETUP, 0x0f);//2Mbps 请教 0x07是 1Mbps 是吗? 250Kbps是0x0几? 进来看看!! 学习一下! 很好,正苦恼呢,谢谢 谢谢分享
页:
[1]