帮分析NRF24L01时序图,不知道哪里出问题了,通信不了
本帖最后由 CCALM 于 2013-5-22 17:15 编辑下面是发送时序图:
1
2
3
接收时序图:
1
2
3
下面是发送程序主函数:int main()
{
char a,b;
GPIO_INIT(); //GPIO初始化
SPI1_INIT(); //SPI初始化
NRF24L01_INIT(); //NRF初始化
while(1)
{
GPIO_SetBits(GPIOC ,GPIO_Pin_8); ////LED
SetTX_Mode(); //设置为发送模式
NRF_TxPacket(TxBuf,32);
a=NRF_Read_Reg(STATUS);
// b=NRF_Read_Reg(FIFO_STATUS);
if(a==0x2e)
GPIO_WriteBit(GPIOC,GPIO_Pin_6,0); //检查并发送数据,发送完LED亮
else GPIO_WriteBit(GPIOC,GPIO_Pin_6,1);
if(!(GPIOC->IDR & GPIO_Pin_11))NRF_IRQ(); //
GPIO_WriteBit(GPIOC,GPIO_Pin_7,NRF24L01_Check()); //LED显示NRF存在
d();
GPIO_ResetBits(GPIOC,GPIO_Pin_8);
d();
}
}接收程序主函数:int main()
{
int i;
char a,b;
GPIO_INIT();
USART_Config();
SPI1_INIT();
NRF_INIT();
GPIO_WriteBit(GPIOD,GPIO_Pin_6,0);
while(1)
{
GPIO_SetBits(GPIOD,GPIO_Pin_5);
SetRX_Mode();
if(NRF_RxPacket(RxBuf,32))
{
GPIO_WriteBit(GPIOD,GPIO_Pin_6,1);
for(i=0;i<32;i++)
USART1_Putc(RxBuf);
}
else
{ a=NRF_Read_Reg(STATUS);
b=NRF_Read_Reg(FIFO_STATUS);
GPIO_WriteBit(GPIOD,GPIO_Pin_6,0);
USART1_Putc(a);
USART1_Putc(b);
}
if(!(GPIOC->IDR & GPIO_Pin_11))NRF_IRQ();
GPIO_WriteBit(GPIOD,GPIO_Pin_7,NRF_Check());
d();
GPIO_ResetBits(GPIOD,GPIO_Pin_5);
d();
}
}SPI设置:void SPI1_INIT(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
SPI_InitTypeDef SPI_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1|RCC_APB2Periph_AFIO, ENABLE);
/*配置 SPI_NRF_SPI的 SCK,MISO,MOSI引脚,GPIOA^5,GPIOA^6,GPIOA^7 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用功能
GPIO_Init(GPIOA, &GPIO_InitStructure);
/*配置SPI_NRF_SPI的CE引脚,和SPI_NRF_SPI的 CSN 引脚:*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; //CE
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; //CSN
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
/*配置SPI_NRF_SPI的IRQ引脚,*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU ; //上拉输入
GPIO_Init(GPIOC, &GPIO_InitStructure);
// CSN_H();
SPI_I2S_DeInit(SPI1);
SPI_Cmd(SPI1, DISABLE); //必须先禁用,才能改变MODE
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; //双线全双工
SPI_InitStructure.SPI_Mode = SPI_Mode_Master; //主模式
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; //数据大小8位
SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low; //时钟极性,空闲时为低
SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge; //第1个边沿有效,上升沿为采样时刻
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; //NSS信号由软件产生
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_64; //8分频,9MHz
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; //高位在前
SPI_InitStructure.SPI_CRCPolynomial = 7;
SPI_Init(SPI1, &SPI_InitStructure);
/* Enable SPI1 */
SPI_Cmd(SPI1, ENABLE);
//SPI_ReadWriteByte(0xff); //启动传输
}NRF初始化配置:
uint8_tTX_ADDRESS= {0xA1,0xA1,0xA1,0xA1,0xA0}; //本地地址
uint8_tRX_ADDRESS= {0xA1,0xA1,0xA1,0xA1,0xA0}; //接收地址
void NRF_INIT(void)
{
CE_L();
NRF_Write_Buf(NRF_WRITE_REG+RX_ADDR_P0,RX_ADDRESS,RX_ADR_WIDTH);//写RX节点地址
NRF_Write_Buf(NRF_WRITE_REG+TX_ADDR,TX_ADDRESS,TX_ADR_WIDTH); //写TX节点地址
NRF_Write_Reg(NRF_WRITE_REG+EN_AA,0x01); //使能通道0的自动应答
NRF_Write_Reg(NRF_WRITE_REG+EN_RXADDR,0x01);//使能通道0的接收地址
NRF_Write_Reg(NRF_WRITE_REG+SETUP_RETR,0x1a);//设置自动重发间隔时间:500us + 86us;最大自动重发次数:10次
NRF_Write_Reg(NRF_WRITE_REG+RF_CH,40); //设置RF通道为CHANAL
NRF_Write_Reg(NRF_WRITE_REG+RX_PW_P0,RX_PLOAD_WIDTH);//选择通道0的有效数据宽度
NRF_Write_Reg(NRF_WRITE_REG+RF_SETUP,0x07); //设置TX发射参数,0db增益,2Mbps,低噪声增益开启
NRF_Write_Reg(NRF_WRITE_REG + CONFIG, 0x0f); // IRQ收发完成中断响应,16位CRC,主发送
CE_H();
}单片机能检测带NRF24L01的存在.
接收程序读取STATUS的值是0X0E,FIFOSTATUS的值是0X11; 接收数据全是0.
发送程序读取STATUS的值有时是0x2e,有时不是.
结果通信不了,不知道是发送问题还是接收问题,还是硬件问题.
纠缠了数天,前途一片黑暗.最近崩溃了.
附上我的程序.
发送设置:
//3 使能AUTO ACK
nrf24_Writer_REG(WRITE_REG + EN_AA, 0); // Enable Auto.Ack:Pipe0
//4 使能PIPE0
nrf24_Writer_REG(WRITE_REG + EN_RXADDR, 0); // Enable Pipe0
//5 配置自动重发次数
nrf24_Writer_REG(WRITE_REG + SETUP_RETR, 0); // 500us + 86us, 10 retrans...1a(0xff发射超时最大70MS,发射最小只要1MS)
并确认每次都可以发送成功,发送间隔时间1s一次就可以了。OK后通电让发送端一直工作,下面就可以调试接收端了:
接收设置:
//3 使能AUTO ACK
nrf24_Writer_REG(WRITE_REG + EN_AA, 0); // Enable Auto.Ack:Pipe0
//4 使能PIPE0
nrf24_Writer_REG(WRITE_REG + EN_RXADDR, 0x01); // Enable Pipe0
这样就可以了,接收方就可以进入接收模式去接收数据了,你可以先读出REG 0x07 / REG 0x17的值后再处理。
int8_t Get_RF_Status(void)
{
uint8_t status;
int8_t ret;
status = nrf24_Read_REG(STATUS);
if (status & 0x10)
{//数据多次重发,无ACK
nrf24_Writer_REG(FLUSH_TX, 0);
nrf24_Writer_REG(FLUSH_RX, 0);
ret = -1;
}
else if (status & 0x20)
{//发送成功
ret = 0;
}
else if (status & 0x40)
{//收到数据
ret = 1;
}
status = nrf24_Read_REG(STATUS);
nrf24_Writer_REG(WRITE_REG + STATUS, status);
return ret;
}
后面的就不用和说了吧! skype 发表于 2013-5-23 09:18 static/image/common/back.gif
发送设置:
//3 使能AUTO ACK
nrf24_Writer_REG(WRITE_REG + EN_AA, 0); // Enable Auto.Ack ...
我都试过了,但是都接收不了 先把接收关掉,只开发送,用示波器看看IRQ引脚是否会出现低电平,如果有低电平出现说明发送没有问题,否则就是根本没往外发数据。个人调试理解,仅供参考 woshisangao 发表于 2013-5-28 11:21 static/image/common/back.gif
先把接收关掉,只开发送,用示波器看看IRQ引脚是否会出现低电平,如果有低电平出现说明发送没有问题,否则 ...
谢谢,现在可能怀疑是硬件问题,因为板子是我自己画的,可以下程序,可以流水灯,不知道是芯片问题还是电路问题了. 学习中..................
页:
[1]