|
本帖最后由 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[i]);
- }
- 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_t TX_ADDRESS[TX_ADR_WIDTH]= {0xA1,0xA1,0xA1,0xA1,0xA0}; //本地地址
- uint8_t RX_ADDRESS[RX_ADR_WIDTH]= {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,有时不是.
结果通信不了,不知道是发送问题还是接收问题,还是硬件问题.
纠缠了数天,前途一片黑暗.最近崩溃了.
附上我的程序.
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
阿莫论坛20周年了!感谢大家的支持与爱护!!
月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!
|