nrf905 通讯

2019-03-24 12:23发布

单片机发送完一条指令后变为接收状态,正常情况下应不断询问DR是否为高,但程序却停在while(AM_IN||DR_IN);这一句,说明此时DR为高单片机接收到数据,但实际上另一个单片机还没向该单片机发送数据。不知道DR为什么会变高,以为是“发送”导致的,于是在发送后插入10ms的延时,但问题还在 搜狗浏览器截图.jpg   此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
9条回答
智波景严
2019-03-25 08:49
/**********************************************************************
*作    者:WANGBQ                                                      *
*修改时间:2012-11-14                                                  *
*功    能:实现nrf905的数据传输和读取                                  *
*说    明:无                                                          *
**********************************************************************/
//---------------------------------------------------------------------------/
#include"msp430g2553.h"
#define  uchar    unsigned char
#define  uint     unsigned int
#define  Tx_MODE  (P1OUT |= BIT0)  //TX_EN
#define  Rx_MODE  (P1OUT &=~BIT0)  //TX_EN
#define  TRx_EN   (P1OUT |= BIT1)  //TRX_CE
#define  TRx_DIS  (P1OUT &=~BIT1)//TRX_CE
#define  AM       (P1IN  & BIT2)  //address
#define  DR       (P1IN  & BIT3)  //R/T_x  data  is  ok
#define  MISO     (P1IN  & BIT4)  //FOR read
#define  MOSI_HIGH (P1OUT |= BIT5)  //for write
#define  MOSI_LOW  (P1OUT &=~BIT5)
#define  SCK_HIGH  (P1OUT |= BIT6)
#define  SCK_LOW   (P1OUT &=~BIT6)         
#define  CSN_HIGH  (P1OUT |= BIT7)
#define  CSN_LOW   (P1OUT &=~BIT7)
//---------------------------------------------------------------------------/
#define WC  (0X00)   //write Configuration_Register
#define RC  (0X10)   //read Configuraion_Register
#define WTP (0X20)   //write Translation_Payload
#define RTP (0X21)   //read Translation_Payload
#define WTA (0X22)   //write Tanslation_Address
#define RTA (0X23)   //read Tanslation_Assress
#define RRP (0X24)   //read Receive_Payload   */
//---------------------------------------------------------------------------/
uchar TRX_Conf[10]={0x4c, 0x0c, 0x44, 0x01, 0x01, 0xcc, 0xcc, 0xcc,0xcc, 0x58};
/*uchar TRX_Conf[10]={0x4c, 0x0c, 0x44, 0x20, 0x20, 0xcc, 0xcc, 0xcc,0xcc, 0x58};
注释:  0x4c : CH_ON,423MHz频段;
        0x0c : 输出功率10dB,不重发,节点为正常;
        0x44 : 设置地址宽度为四字节;
        0x20,0x20 : 收、发有效数据长度为32字节;(0x01 为一字节)
        0xcc,0xcc,0xcc,0xcc : 接收地址(本机地址);
        0x58 :  CRC使能,八位CRC校正,外部时钟不使能,16M晶振;
*/
int Readbuf=0;
//---------------------------------------------------------------------------/
void delay(uchar x);
void delayms(uchar x);
void SPI_write(uchar byte);                                               
uchar SPI_read();
void Init();
void Conf_nrf905();
void Tran_packet(uchar dat,uchar addr);
void Receive_packet();
//---------------------------------------------------------------------------/
/***********************************************************************
*函数名称:     main                                                       *
*函数参量:       无                                                     *
*函数功能:实现nrf905的数据传输和读取                                  *
*说    明:                                                         *
************************************************************************/
void main()
{
    WDTCTL = WDTHOLD + WDTPW;         
    Init();
    Conf_nrf905();
    for(;;)
    {
      // Receive_packet();
       Tran_packet(0x01,0xee);  //向地址0xee的从机发送数据0x01
    }
}
/***********************************************************************
*函数名称:                                                            *
*函数参量:                                                            *
*函数功能:                                                            *
*说    明:                                                            *
************************************************************************/
void delay(uchar x)
{
    while(x--)
    {
        _NOP();   
    }
}
/***********************************************************************
*函数名称:                                                            *
*函数参量:                                                            *
*函数功能:                                                            *
*说    明:                                                            *
************************************************************************/
void delayms(uchar x)
{
    int i,j;
    for(i=x;i>0;i--)
        for(j=110;j>0;j--);
}
/***********************************************************************
*函数名称:                                                            *
*函数参量:                                                            *
*函数功能:                                                            *
*说    明:                                                            *
************************************************************************/
void SPI_write(uchar byte)
{
    uchar i,buf=byte;
    for(i=0;i<8;i++)
    {   
       SCK_LOW;
        if(buf & 0x80)  MOSI_HIGH ;
        else   MOSI_LOW ;
        SCK_HIGH;
        buf<<=1 ;
        SCK_LOW;
    }
}
/***********************************************************************
*函数名称:                                                            *
*函数参量:                                                            *
*函数功能:                                                            *
*说    明:                                                            *
************************************************************************/
uchar SPI_read()
{
    uchar i,buf=0;
    for(i=0;i<8;i++)
    {   
        SCK_LOW;
        buf<<=1 ;
        if(MISO) buf |=0x01;
        else buf &= ~BIT0 ;  
        SCK_HIGH ;
        delay(2);
        SCK_LOW;
    }
    return buf;
}
/***********************************************************************
*函数名称:                                                            *
*函数参量:                                                            *
*函数功能:                                                            *
*说    明:                                                            *
************************************************************************/
void Init()
{
    P1DIR |= BIT4 + BIT3 + BIT2;    //避免2.3.4口因为其他配置而保持低电平。
    P1OUT |= BIT4 +BIT3;
    P1OUT &= ~BIT2 ;

    P1DIR = 0xe3 ;   //0.1.5.6.7 output
   
    P2DIR |= BIT5 + BIT0;   
    P2OUT |= BIT5;
    TRx_DIS;
    CSN_HIGH;
    SCK_LOW;     
}
/***********************************************************************
*函数名称:                                                            *
*函数参量:                                                            *
*函数功能:                                                            *
*说    明:                                                            *
************************************************************************/
void Conf_nrf905()
{
    uchar i;
    CSN_LOW ;
    SPI_write(WC);
    for(i=0;i<10;SPI_write(TRX_Conf[i++]));
    CSN_HIGH;
    TRx_DIS;
}
/***********************************************************************
*函数名称:                                                            *
*函数参量:                                                            *
*函数功能:                                                            *
*说    明:                                                            *
************************************************************************/
void Tran_packet(uchar dat,uchar addr)
{
    Tx_MODE;
    CSN_LOW;
    SPI_write(WTA);
    SPI_write(addr);
    SPI_write(addr);
    SPI_write(addr);
    SPI_write(addr);
    CSN_HIGH;
    delayms(1);         
    CSN_LOW;      
    SPI_write(WTP);
    SPI_write(dat);
    CSN_HIGH;
    delayms(1);
    TRx_EN;
    delayms(1);
    TRx_DIS;
    while(!DR);   
    P2OUT |= BIT0;  //用一根杜邦线把P2.1与一个led连一起,发出数据是它会闪烁。
    delayms(100);
    P2OUT &= ~BIT0;
}
/***********************************************************************
*函数名称:                                                            *
*函数参量:                                                            *
*函数功能:                                                            *
*说    明:                                                            *
************************************************************************/
void Receive_packet()
{
    Rx_MODE;
    TRx_EN;
    delayms(1); //>650us
    for(;;)
    {
        if(AM&&DR)             //received
        {
            TRx_DIS;       //stop Receive
            CSN_LOW;
            SPI_write(RRP);
            Readbuf=SPI_read();
            CSN_HIGH;
            while(DR);
            TRx_EN;  
            P2OUT |= BIT5; //用一根杜邦线吧P2.5与一个led连一起,收完数据是它会闪烁。
           delayms(100);
           P2OUT &= ~BIT5;
            break;
        }
    }  
}

//好久没来论坛了,希望贴上后对你还有帮助

[ 本帖最后由 智波景严 于 2013-1-1 22:31 编辑 ]

一周热门 更多>

相关问题

    相关文章