搜索
bottom↓
回复: 1

AVR atmega128a nrf24l01接收端问题

[复制链接]

出0入0汤圆

发表于 2013-8-17 17:38:31 | 显示全部楼层 |阅读模式
用C51作为发送端,atmega128作为nrf24l01的接收端,发送端没问题,已经能正常发送,可是接收端一直接收不到数据,查看STATUS寄存器发现一直为0x0e;接收端模拟代码:
#include <iom128v.h>
#include <macros.h>
#include "Wireless.h"
#include "myconfig.h"


uchar Wireless_Write_Buf(uchar Address, uchar *data, uchar D_Width)
{
   unsigned char i, status=0;

   PORTD &= ~BIT(SPI_CSN); //使能SPI
   delay_nus(2);
   status = SPI_RW(Address);
   for(i=0; i<D_Width; i++)
   {
     SPI_RW(*data++);
   }
   PORTD |= BIT(SPI_CSN);
   delay_nus(2);
   return status;
}

unsigned char Wireless_RW_Reg(uchar Address,uchar value)
{
   unsigned char tem, status=0;

   PORTD &= ~BIT(SPI_CSN); //使能SPI
   delay_nus(2);
   status = SPI_RW(Address);
   SPI_RW(value);
   PORTD |= BIT(SPI_CSN);
   return status;
}

uchar Wireless_Read_Buf(uchar Address, uchar *ReD, uchar D_Width)
{
   uchar i;
   uchar status;

   PORTD &= ~BIT(SPI_CSN); //使能SPI
   delay_nus(2);
   status = SPI_RW(Address);
   for(i=0; i<D_Width; i++)
   {
     ReD[i] =  SPI_RW(0);
   }
   PORTD |= BIT(SPI_CSN);
   delay_nus(2);
   return(status);
}

unsigned char SPI_RW_REG(uchar Wreg, uchar value) //用于读出status寄存器
{
   unsigned char i;
   unsigned char status = 0;
   
   PORTD &= ~BIT(SPI_CSN); //使能SPI
   delay_nus(2);
   status = SPI_RW(Wreg);
   SPI_RW(value);
   PORTD |= BIT(SPI_CSN);
   return status;
}

unsigned char SPI_RW(uchar wdat)
{
   unsigned char i;
   unsigned char RWdata;
   RWdata = wdat;
   
   for(i=0; i<8; i++)
   {
     if(RWdata&0x80)
          PORTD |= BIT(SPI_MOSI);
         else
          PORTD &= ~BIT(SPI_MOSI);
         
         RWdata <<= 1;
         PORTD |= BIT(SPI_SCK);
         if(PIND&0x08)
          RWdata |= 0x01;
         else
          RWdata &= 0xFE;

         PORTD &= ~BIT(SPI_SCK);
   }
   return RWdata;
}

unsigned char SPI_Read(unsigned char reg)
{
   unsigned char buff;
   PORTD &= ~BIT(SPI_CSN);  
   delay_nus(2);
   SPI_RW(reg);
   buff = SPI_RW(0);
   PORTD |= BIT(SPI_CSN);
   delay_nus(2);
   return buff;
}
写数据到nrf24l01寄存器中,再读出来完全没有问题。
#include <iom128v.h>
#include <macros.h>
#include "Wireless.h"
#include "myconfig.h"
#include "delay.h"

#pragma interrupt_handler Wireless_IRQ: 4

unsigned char PRX_ADDRESS[RX_ADR_WIDTH] = {0x34,0x43,0x10,0x10,0x01};
unsigned char TX_ADDRESS[TX_ADR_WIDTH] = {0x34,0x43,0x10,0x10,0x01};
unsigned char Receive_Data[Receive_Data_WIDTH];
unsigned char flag = 0;

//////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////
void nRF24L01_TxPacket(unsigned char *Buf)
{
   PORTD &= ~BIT(nRF_CE);
   Wireless_Write_Buf(Wireless_W_REG + Wireless_RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH);
   Wireless_Write_Buf(W_TX_PAYLOAD, Buf, Send_Data_WIDTH); //写发送的数据
   Wireless_RW_Reg(Wireless_W_REG + Wireless_CONFIG, 0x0E); //TX mode
   PORTD |= BIT(nRF_CE); //CE置高,发送数据
   delay_nus(20); //保持CE为高至少10us
}

void SetRX_Mode(void)
{
   PORTD &= ~BIT(nRF_CE);
   delay_nus(2);
   Wireless_RW_Reg(Wireless_W_REG + Wireless_CONFIG, 0x0F);//RX mode
   delay_nus(2);
   PORTD |= BIT(nRF_CE);
   delay_nus(500);
}
//////////////////////////////////////////////////////////////////////
void init_NRF24L01(void)
{
   delay_nus(130);
   PORTD &= ~BIT(nRF_CE);
   delay_nus(2);
   PORTD |= BIT(SPI_CSN); //disable SPI
   delay_nus(2);
   PORTD &= ~BIT(SPI_SCK);
   delay_nus(2);
   PORTD |= BIT(SPI_IRQ);
   delay_nus(2);
   Wireless_RW_Reg(Wireless_W_REG + Wireless_SETUP_AW, 0x03);//5 byte
   Wireless_Write_Buf(Wireless_W_REG + Wireless_TX_ADDR, PRX_ADDRESS, RX_ADR_WIDTH);
   Wireless_Write_Buf(Wireless_W_REG + Wireless_RX_ADDR_P0, PRX_ADDRESS, RX_ADR_WIDTH);//RX地址,与PTX地址一致
   Wireless_RW_Reg(Wireless_W_REG + Wireless_EN_AA, 0x00);
   Wireless_RW_Reg(Wireless_W_REG + Wireless_EN_RXADDR, 0x01); //for RX
   Wireless_RW_Reg(Wireless_W_REG + Wireless_RF_CH, 0);
   Wireless_RW_Reg(Wireless_W_REG + Wireless_RX_PW_P0, 4);//for RX ,4bytes
   Wireless_RW_Reg(Wireless_W_REG + Wireless_RF_SETUP, 0x07); //Datarate=1Mbps, 0dBm
   Wireless_RW_Reg(Wireless_W_REG + Wireless_SETUP_RETE, 0x1F); //wait 500us,for TX
}

//////////////////////////////////////////////////////////////////////
void nRF24L01_RxPacket(unsigned char* rx_buf)
{
           uchar temp;
            
         delay_nus(2);
         temp = SPI_Read(Wireless_STATUS);
         while(temp&0x40)
         {
         PORTD &= ~BIT(nRF_CE);
         Wireless_Read_Buf(R_RX_PAYLOAD, rx_buf, Receive_Data_WIDTH);
         PORTD |= BIT(nRF_CE);
         flag = 1;
         PORTB &= ~(1<<PB0);
         }
            delay_nus(2);
}
////////////////////////
void Wireless_task(void)
{
                 uchar tmp;
           nRF24L01_RxPacket(Receive_Data);
        if(flag == 1)
        {
        flag = 0;
        PORTB |= (1<<PB0);
        }
               
        tmp = SPI_Read(Wireless_STATUS);
        if(tmp == 0x0e)
         {
           PORTB &= ~(1<<PB0);
           delay_nms(1000);
           PORTB |= (1<<PB0);
           delay_nms(1000);
        }       
}
中断程序如下:
void Wireless_IRQ(void)
{
         uchar temp;
         CLI();
         PORTD |= BIT(nRF_CE);
         temp = SPI_Read(Wireless_STATUS);
         if(temp&0x40)
         {
                  nRF24L01_RxPacket(Receive_Data);
                if(Receive_Data[0])
                {
                 PORTB &= ~(1<<PB0);
                 delay_nms(1000);
                 PORTB |= (1<<PB0);
                 delay_nms(1000);
                }
         }
       
         if(temp&0x20)
         {
          SetRX_Mode();
         }
         if(temp&0x10)
         {
          SetRX_Mode();
         }
         PORTD &= ~BIT(nRF_CE);
         Wireless_RW_Reg(Wireless_W_REG + Wireless_STATUS, temp);
         PORTD |= BIT(nRF_CE);
         delay_nus(20);
         
         SEI();
}
硬件上,直接操作IO口高低电平没有问题,将IRQ脚拉低也能进中断。电压实测是3.28V左右。
可是就是接收不了数据,很郁闷,求大神指教。。

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

 楼主| 发表于 2013-8-28 08:05:33 | 显示全部楼层
自己顶一下。。。。。。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-24 01:23

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表