打印

请教nRF905数据发送的问题

[复制链接]
2334|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lhwaizhu|  楼主 | 2012-6-12 21:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近调试一对nRF905,昨天晚上调试成功了,一直很稳定,今天再试就不行了,接收方DR变高后读数据有时候正确有时候错误(为0x00),后来发现,昨天发送端进入发送模式后DR变高但是接着会变低(这里是不是因为数据发送完了就变低?),今天是变高后一直未高,是不是说没有发送完?可是程序我又没变,很是郁闷...请教大家帮我看看,我实在是不知道哪儿有问题,我用的是M16,下面是程序,有不对的地方请指教,谢谢了!
#include <mega16.h>
#include <delay.h>

#define uint unsigned int
#define uchar unsigned char

#define DATA7 (DATA_BUF&(1<<7))!= 0
#define DATA0   (DATA_BUF&(1<<0))!= 0
//----------------配置口定义---------------------------------------
#define TXEN_1          PORTB.0=1// (PORTB|=(1<<0))
#define TXEN_0          PORTB.0=0// (PORTB&=~(1<<0))
#define TRX_CE_1        PORTB.1=1// (PORTB|=(1<<1))
#define TRX_CE_0        PORTB.1=0// (PORTB&=~(1<<1))
#define PWR_1           PORTB.2=1// (PORTB|=(1<<2))
#define PWR_0           PORTB.2=0// (PORTB&=~(1<<2))
#define MISO            PINB.3// (PINB&(1<<3))
#define MOSI_1          PORTB.4=1// (PORTB|=(1<<4))
#define MOSI_0          PORTB.4=0// (PORTB&=~(1<<4))
#define SCK_1           PORTB.5=1// (PORTB|=(1<<5))
#define SCK_0           PORTB.5=0// (PORTB&=~(1<<5))
#define CSN_1           PORTB.6=1// (PORTB|=(1<<6))
#define CSN_0           PORTB.6=0// (PORTB&=~(1<<6))
//---------------------NRF905状态IO-------------------------------------
#define AM PINA.0
#define DR PINA.1
#define CD PINA.2
//--------------------------------nrf905控制指令------
#define WC  0x00
#define RC  0x10
#define WTP  0x20
#define RTP  0x21
#define WTA  0x22
#define RTA  0x23
#define RRP  0x24

uchar TxAddress[4]={0xcc,0xcc,0xcc,0xcc};  //发送端发送的地址(接收端的本机地址)

unsigned  char DATA_BUF;
unsigned char TxBuf[4]=
{
0x01,0x02,0x03,0x04
};

unsigned char RxBuf[4];

unsigned char  RFConf[11]=
{
  0x00,                             //配置命令//
  0x4c,                             //CH_NO,配置频段在430MHZ
  0x0c,                             //输出功率为10db,不重发,节电为正常模式
  0x44,                             //地址宽度设置,为4字节
  0x04,0x04,                        //接收发送有效数据长度为32字节
  0xCC,0xCC,0xCC,0xCC,              //本机地址
  0x58,                              //CRC充许,8位CRC校验,外部时钟信号不使能,16M晶振
};


// SPI读操作

unsigned char SpiRead(void)
{
        unsigned char j;
        for(j=0;j<8;j++)
        {
                DATA_BUF=DATA_BUF<<1;
                SCK_1;        //初始化时SCK为低电平
                if(MISO)      //读取最高位先保存到末尾,通过左移到最高位
                {
                        DATA_BUF|=(1<<0);
                }
                else
                {
                        DATA_BUF&=~(1<<0);
                }   
                SCK_0;
        }
        return DATA_BUF;
}

//spi写函数
void SpiWrite(unsigned char send)
{
        unsigned char i;
        DATA_BUF=send;
        for(i=0;i<8;i++)
        {
                if(DATA7)
                {
                        MOSI_1;
                }              
                else
                {
                        MOSI_0;
                }              
                SCK_1;
                DATA_BUF=DATA_BUF<<1;
                SCK_0;      
        }   
}


void nRF905Init(void)
{
        CSN_1;      // Spi  disable
        SCK_0;      // Spi clock line init low
        PORTA=0XFF;   //AM DR CD输入拉高
        DDRA=0X00;
        PWR_1;     // nRF905 power on
        TRX_CE_0;     // Set nRF905 in standby mode
        TXEN_0;     // set radio in Rx mode
}
//--------------------初始化寄存器-----------------------------------


void Config905(void)
{
        unsigned char  i;
        CSN_0;      // Spi enable for write a spi command
        for (i=0;i<11;i++) // Write configration words  写放配置字
        {
                SpiWrite(RFConf[i]);
               // delay_us(2);
        }
        CSN_1;     // Disable Spi
}
//---------------------------发送数据打包-----------------------------------

void TxPacket(uchar *TxRxBuf)
{
        unsigned char i;
        CSN_0;
        SpiWrite(WTP);    // Write payload command
        for (i=0;i<4;i++)
        {
                SpiWrite(TxBuf[i]);  // Write 32 bytes Tx data
               // delay_us(2);
        }// Spi enable for write a spi command
        CSN_1;
      //  delay_ms(1);      // Spi disable
        CSN_0;      // Spi enable for write a spi command
        SpiWrite(WTA);    // Write address command
        for (i=0;i<4;i++)   // Write 4 bytes address
        {
                 SpiWrite(TxAddress[i]);
                // delay_us(2);
        }
        CSN_1;      // Spi disable
      //  delay_us(2);
        
        TRX_CE_1;     // Set TRX_CE high,start Tx data transmission
        delay_ms(1); //    // while (DR!=1);
        delay_ms(1);
        TRX_CE_0;     // Set TRX_CE low  发送完成后进入空闲模式
}
//------------------------设置发送状态------------------------------
void SetTxMode(void)
{
        TRX_CE_0;
        TXEN_1;
        delay_ms(2);      // delay for mode change(>=650us)
}
//------------设置接受状态-----------------------------------------
void SetRxMode(void)
{
        TXEN_0;
        TRX_CE_1;
        delay_ms(2);      // delay for mode change(>=650us)
}

//----------读NRF905接收数据--------------------------------
void RxPacket(void)      
{
        uchar i;
        TRX_CE_0;
        CSN_0;      // Spi enable for write a spi command
        delay_ms(1);
        SpiWrite(RRP);
        for (i = 0 ;i < 4 ;i++)
        {
                RxBuf[i]=SpiRead();  // Read data and save to buffer
                delay_us(2);      
        }
        CSN_1;
        delay_ms(1);
        TRX_CE_1;      
}

void main(void)
{
// Declare your local variables here
        DDRB=0xF7;  //MISO(PB3)为输入 其他输出
        DDRA=0x00;
        nRF905Init();
        Config905();
         
while (1)
      {
        SetTxMode();
       TxPacket(TxBuf);
      }
}

相关帖子

沙发
lhwaizhu|  楼主 | 2012-6-13 21:33 | 只看该作者
刚才又调通了,换了一个单片机调试又不行了,,,,,

使用特权

评论回复
板凳
darlin520| | 2012-6-25 23:56 | 只看该作者
不知道楼主为什么不用硬件的SPI而是用模拟时序呢,M16不是有标准的SPI口吗

使用特权

评论回复
地板
darlin520| | 2012-6-25 23:56 | 只看该作者
不知道楼主为什么不用硬件的SPI而是用模拟时序呢,M16不是有标准的SPI口吗

使用特权

评论回复
5
darlin520| | 2012-6-30 22:30 | 只看该作者
楼主能分享一下经验吗?最近我也一直在调,也是用M16,想用硬件的SPI

使用特权

评论回复
6
lzqxs89| | 2012-7-27 00:59 | 只看该作者
我最近调了个CC2500无线东东

使用特权

评论回复
7
Daojia211| | 2013-5-26 16:38 | 只看该作者
没有用过M16,不过我就用过89C52

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

24

主题

79

帖子

2

粉丝