搜索
bottom↓
回复: 4

NRF24L01丢包过高的问题,请教

[复制链接]

出0入0汤圆

发表于 2010-1-11 11:17:41 | 显示全部楼层 |阅读模式
我用MSP430联的NRF24L01,通信距离只有1M,丢包率几乎80%,y有人说是程序的原因,哪位大哥能帮我看看啊


接收:
#include "msp430x14x.h"
#include"api.h"
#define TX_ADR_WIDTH    5   // 5 bytes TX(RX) 地址长度
#define RX_ADR_WIDTH    5   // 5 bytes TX(RX) 地址长度
#define TX_PLOAD_WIDTH  5  // 20 bytes TX 有效载荷
#define RX_PLOAD_WIDTH  5  // 20 bytes TX 有效载荷
//********延时段***************
#define CPU_F ((double)6000000)
#define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0))
#define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))
//**********************************数据的定义*********************************************
typedef unsigned char uchar; //数据类型
typedef unsigned int  uint;
uchar  TX_ADDRESS[TX_ADR_WIDTH]  = {0x34,0x43,0x10,0x10,0x01}; // Define a static TX address
uchar  RX_ADDRESS[RX_ADR_WIDTH]  = {0x34,0x43,0x10,0x10,0x01};
uchar  TEST[TX_ADR_WIDTH];
uchar rx_buf[TX_PLOAD_WIDTH]; //接收缓存数组
uchar tx_buf[RX_PLOAD_WIDTH]={0x01,0x02,0x03,0x04,0x05};//发送缓存数组
uchar flag;  //
char sta;//状态寄存器
uchar cfcs=0;
uchar faci=0;
uchar jscs=0;
uchar receive[5];
uchar data[5]={0x01,0x02,0x02,0x01,0x01};
//********************************按键定义*************************
#define CSN_HIGH P1OUT|=BIT2//P1.2控制SPI使能
#define CSN_LOW P1OUT&=~BIT2
#define CE_HIGH P1OUT|=BIT1//P1.1控制芯片发射使能
#define CE_LOW P1OUT&=~BIT1
#define IRQ P1IN&BIT0//读取P1.0的值*/
//*****************************声明子函数**************************************************
void int_clk();//初始化时钟
void int_spi0();//初始化SPI接口
void init_io();//初始化IO
//uchar delay_us(uint i);//延时
uchar SPI_RW(uchar byte);//通过SPI往nRF24L01写一个字节数据,接收nRF24L01的状态寄存器的值
uchar SPI_RW_Reg(uchar reg,uchar value);//通过SPI往nRF24L01将一个字节数据”value“写到寄存器”reg“里
uchar SPI_Read(uchar reg);//读nRF24L01 中寄存器”reg“里的值
uchar SPI_Read_Buf(uchar reg, uchar *pBuf, uchar bytes);//从寄存器”reg“读取“bytes”个字节数据存放在数组pBuf里
uchar SPI_Write_Buf(uchar reg, uchar *pBuf, uchar bytes);//将存放在数组pBuf里“bytes”个字节数据写到寄存器”reg“中
uchar nRF24L01_RxPacket(uchar *rx_buf);//初始化nRF24L01为接收模式
uchar  nRF24L01_TxPacket(uchar *tx_buf);//初始化nRF24L01为发送模式
void SetRX_Mode();
void nRF24L01_Config();//nRF24L01配置
//*********************************主函数**********************************************
int main( void )
{
  WDTCTL=WDTPW+WDTHOLD;
  delay_us(10);
  int_clk();
  init_io();
  int_spi0();
nRF24L01_Config();
   _EINT();

  while(1)
  {
   SetRX_Mode();
   while(1)
   {
  while(P1IN&BIT0)
  {
    flag=SPI_Read(STATUS);
  cfcs=SPI_Read(CD);
delay_ms(10);
  }
  SPI_RW_Reg(WRITE_REG+STATUS,0X7E);
   }
  //while(1);
  /*while(1)
  {
    SPI_RW_Reg(WRITE_REG+STATUS,0x0E);
  while(sta&0x10);
  delay_us(10000);
  }*/
  }
}

/***********************************延时********************************************
uchar delay_us(uint i)
{
  while(i--)
    _NOP();
}*/

//***********************************初始化时钟********************************************
void int_clk()//MCLK=6MHZ,SMCLK=3MHZ,//ACLK=32768HZ,
{
  uchar i;
  //P5SEL=0X70;
  BCSCTL1&=~XT2OFF;//开高晶振
  BCSCTL2|=SELM1+SELS+DIVS0;
  do
  {
    IFG1&=~OFIFG;
    for(i=0xFF;i>0;i--);
  }
  while((IFG1&OFIFG)!=0);
  IFG1&=~OFIFG;
}
//*************************初始化io端口******************************************
void init_io()
{
  P1SEL=0X00;
  P1DIR|=BIT1+BIT2;//单片机对nRF24L01的控制管脚P1.0(IRQ)P1.1(CE)P1.2(CSN)
   P1OUT&=~BIT1;//CE低
   P1OUT|=BIT2;//CSN高
   P1IE|=BIT0;
   P1IES|=BIT0;
   P1IE|=BIT0;
  //P5SEL=0X70;//时钟信号检测口
}
//********************************初始化SPI0***********************************************
void int_spi0()//6;1;N;9600
{
  P3SEL|=0X0E;
  P3DIR|=BIT1+BIT3;
  U0CTL|=SWRST;
  U0CTL|=CHAR+SYNC+MM;
  U0TCTL|=SSEL1+STC;
  U0TCTL|=CKPH;
  U0TCTL&=~CKPL;
  U0BR0 = 0X38;
  U0BR1 = 0X01;
  U0MCTL = 0X40;
  ME1|=USPIE0;
  U0CTL&=~SWRST;
  IE1&=~UTXIE0;
  IE1&=~URXIE0;//禁止中断

}
//***********使用命令字*****************************
uchar SPI_WORD(uchar word)
{
  P1OUT&=~BIT2;
      U0TXBUF=word;
    while(IFG1&URXIFG0);
while((IFG1&UTXIFG0)==0);
   IFG1&=~UTXIFG0;
   delay_ms(1);
   P1OUT|=BIT2;
   return(U0RXBUF);   
}
  

//*******************************SPI发送一个字节数据,**************************************************
uchar SPI_RW(uchar byte)      //
{
    U0TXBUF=byte;
// 输出 'byte',从高位到低位
    while(IFG1&URXIFG0);
while((IFG1&UTXIFG0)==0);
   IFG1&=~UTXIFG0;
    delay_us(1000);
   return(U0RXBUF);       // 返回接收的状态字节
}
//*************************往寄存器reg中写值'value',返回状态寄存器值*******************************************************
uchar SPI_RW_Reg(uchar reg,uchar value)
{
        uchar status;

          P1OUT&=~BIT2;                   // CSN 低, 初始化SPI通信
          status = SPI_RW(reg);      // 选择寄存器
          SPI_RW(value);             // 写值.
          P1OUT|=BIT2; // CSN 高
        delay_us(1);
          return(status);            // 返回nRF24L01状态值
}
//*****************************读寄存器的值****************************************************
uchar SPI_Read(uchar reg)
{
        char reg_val;
        
          P1OUT&=~BIT2;               //  CSN 低, 初始化SPI通信
          SPI_RW(reg);            // 选择寄存器
          reg_val=SPI_RW(0x00);    // 写寄存器
          P1OUT|=BIT2;                // CSN 高, 停止通信
        delay_us(1);
          return(reg_val);        // 返回寄存器值
}
//********************************读出byte字节数据*************************************************
uchar SPI_Read_Buf(uchar reg, uchar *pBuf, uchar bytes)
{
        uchar status,byte_ctr;

          P1OUT&=~BIT2;               // P1.2 CSN 低, 初始化SPI通信
          status = SPI_RW(reg);               // 选择寄存器去读,并且读状态寄存器的值

          for(byte_ctr=0;byte_ctr<bytes;byte_ctr++)
            pBuf[byte_ctr] = SPI_RW(0x00);    // 从 nRF24L01读字节

          P1OUT|=BIT2;                // CSN 高, 停止通信
         delay_us(1);
          return(status);                    // 返回NRF24L01的状态值
}
//*******************************写入BYTE字节数**************************************************
uchar SPI_Write_Buf(uchar reg, uchar *pBuf, uchar bytes)
{
        uchar status,byte_ctr;

          P1OUT&=~BIT2;           // P1.2 CSN 低, 初始化SPI通信
          status = SPI_RW(reg);    // 选择寄存器去写,并且读状态寄存器的值
          for(byte_ctr=0; byte_ctr<bytes; byte_ctr++) // 将字几个节写到 buffer(*pBuf)
            SPI_RW(*pBuf++);
          P1OUT|=BIT2;  // CSN 高, 停止通信
        delay_us(1);
          return(status);          // 返回NRF24L01的状态值
}
/****************************************************************************************************/
/*函数:void SetRX_Mode(void)
/*功能:数据接收配置
/****************************************************************************************************/
void SetRX_Mode()
{
  delay_ms(1.5);
P1OUT&=~BIT1;
SPI_RW_Reg(WRITE_REG+CONFIG, 0x0F);
SPI_RW_Reg(WRITE_REG+STATUS,0X7E);
SPI_WORD(FLUSH_RX);//清空RXFIFRO
//SPI_WORD(FLUSH_TX);
     SPI_Write_Buf(WRITE_REG+TX_ADDR,TX_ADDRESS,TX_ADR_WIDTH);
    //给发送寄存器写入地址,宽度为TX_ADR_WIDTH
  SPI_Write_Buf(WRITE_REG+RX_ADDR_P0,TX_ADDRESS,TX_ADR_WIDTH);
// flag=SPI_Read(CD);
P1OUT|=BIT1;
delay_us(500);
}
//*********************************************************************************
//接收函数,接收返回1表示有数据收到
uchar nRF24L01_RxPacket(uchar *rx_buf)
{
  delay_ms(1.5);
  //P1OUT&=~BIT1; //CE_LOW进入闲置模式
  uchar revale=0;
  //SPI_WORD(FLUSH_RX);
  //SPI_WORD(FLUSH_TX);
  sta=SPI_Read(STATUS);
  if(sta&0x40)
  {
    SPI_Read_Buf(RD_RX_PLOAD,rx_buf,TX_PLOAD_WIDTH);//读数据
    revale =1;       
    jscs++;//读取数据完成标志
        //SPI_RW_Reg(WRITE_REG+STATUS,0x1E);//接收到数据后RX_DR,TX_DS,MAX_PT都置高为1,通过写1来清楚中断标志
  }
        return revale;
}
//************************发送函数******************************
uchar  nRF24L01_TxPacket(uchar *tx_buf)
{
  //stand by 模式
delay_ms(1.5);
  P1OUT&=~BIT1;//CE置低
    SPI_RW_Reg(WRITE_REG+CONFIG,0X0F);
  //给发送寄存器写入地址,宽度为TX_ADR_WIDTH
  SPI_WORD(FLUSH_TX);
    SPI_Write_Buf(WRITE_REG+TX_ADDR,TX_ADDRESS,TX_ADR_WIDTH);
    //给发送寄存器写入地址,宽度为TX_ADR_WIDTH
  SPI_Write_Buf(WRITE_REG+RX_ADDR_P0,TX_ADDRESS,TX_ADR_WIDTH);
  //给接收寄存器写入地址,宽度也为TX_ADR_WIDTH
  //SPI_Read_Buf(RX_ADDR_P0,rx_buf,TX_ADR_WIDTH);
  SPI_Write_Buf(WR_TX_PLOAD,tx_buf,TX_PLOAD_WIDTH);
  //向发送寄存器写入TX_PLOAD_WIDTH宽度的数据,
  //SPI_RW_Reg(WRITE_REG+CONFIG,0X0E);
  //SPI_Read(CONFIG);
  //配置为PWR_UP位,使能CRC,16位校验,发送模式
  P1OUT|=BIT1;   // CE 管脚置高
  delay_ms(1.5);
  //P1OUT&=~BIT1;//CE置低
}
//***********nRF24L01的配置函数*************************
void nRF24L01_Config()
{
  P1OUT&=~BIT1;//CE为低,待机
  P1OUT|=BIT2;//CSN置高,SPI复位
  delay_ms(1.5);
SPI_RW_Reg(WRITE_REG+STATUS,0X7E);
  SPI_RW_Reg(WRITE_REG+CONFIG,0X0F);
  SPI_Read(CONFIG);
  //数据通道0自动应答
  SPI_RW_Reg(WRITE_REG+EN_AA,0X01);
//数据通道0自动应答
SPI_RW_Reg(WRITE_REG+EN_RXADDR,0X01);
//通道0允许
  SPI_RW_Reg(WRITE_REG+SETUP_AW,0X03);
//设置地址宽度为5字节
  SPI_RW_Reg(WRITE_REG+SETUP_RETR,0X0A);  
//建立自动重发,500+86us,10次重发
  SPI_RW_Reg(WRITE_REG+RF_CH,0x02);
//设置工作通道频率
  SPI_RW_Reg(WRITE_REG+RF_SETUP,0X07);
//设置工作通道传输速率为1Mbps,发射功率为0dBm
  SPI_RW_Reg(WRITE_REG+RX_PW_P0,TX_PLOAD_WIDTH);
//SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH);   
// 写本地地址       
SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS,TX_ADR_WIDTH);
SPI_Write_Buf(WRITE_REG + RX_ADDR_P1, TX_ADDRESS,TX_ADR_WIDTH);
// 写接收端地址
}
//***********中断***************
#pragma vector=PORT1_VECTOR
__interrupt void  PORT1_ISR(void)
{
   //P1OUT&=~BIT1;//CE为低,待机
    sta=SPI_Read(STATUS);
  int i;
    if(sta&0x40)
    {
      nRF24L01_RxPacket(rx_buf);
      for(i=0;i<5;i++)
      {
        receive=rx_buf;
    }
    }
    if (sta&0x10)
    {
      while(1);
      cfcs++;
    }
    if (sta&0x20)
    {
    }
    //while(1);
    P1IFG&=~BIT0;   
}  


发送
#include "msp430x14x.h"
#include"api.h"
#define TX_ADR_WIDTH    5   // 5 bytes TX(RX) 地址长度
#define TX_PLOAD_WIDTH  5  // 20 bytes TX 有效载荷
//********延时段***************
#define CPU_F ((double)6000000)
#define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0))
#define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))
//**********************************数据的定义*********************************************
typedef unsigned char uchar; //数据类型
typedef unsigned int  uint;
uchar  TX_ADDRESS[TX_ADR_WIDTH]  = {0x34,0x43,0x10,0x10,0x01}; // Define a static TX address
uchar  TEST[TX_ADR_WIDTH];
uchar rx_buf[TX_PLOAD_WIDTH]; //接收缓存数组
uchar tx_buf[TX_PLOAD_WIDTH]={0x01,0x02,0x03,0x04,0x05};//发送缓存数组
uchar flag;  //
uchar sta;//状态寄存器
uchar cfcs=0;
uchar faci=0;
uchar receive[5];
uchar data[5]={0x01,0x02,0x02,0x01,0x01};
//********************************按键定义*************************
#define CSN_HIGH P1OUT|=BIT2//P1.2控制SPI使能
#define CSN_LOW P1OUT&=~BIT2
#define CE_HIGH P1OUT|=BIT1//P1.1控制芯片发射使能
#define CE_LOW P1OUT&=~BIT1
#define IRQ P1IN&BIT0//读取P1.0的值*/
//*****************************声明子函数**************************************************
void int_clk();//初始化时钟
void int_spi0();//初始化SPI接口
void init_io();//初始化IO
//uchar delay_us(uint i);//延时
uchar SPI_RW(uchar byte);//通过SPI往nRF24L01写一个字节数据,接收nRF24L01的状态寄存器的值
uchar SPI_RW_Reg(uchar reg,uchar value);//通过SPI往nRF24L01将一个字节数据”value“写到寄存器”reg“里
uchar SPI_Read(uchar reg);//读nRF24L01 中寄存器”reg“里的值
uchar SPI_Read_Buf(uchar reg, uchar *pBuf, uchar bytes);//从寄存器”reg“读取“bytes”个字节数据存放在数组pBuf里
uchar SPI_Write_Buf(uchar reg, uchar *pBuf, uchar bytes);//将存放在数组pBuf里“bytes”个字节数据写到寄存器”reg“中
uchar nRF24L01_RxPacket(uchar *rx_buf);//初始化nRF24L01为接收模式
uchar  nRF24L01_TxPacket(uchar *tx_buf);//初始化nRF24L01为发送模式
void nRF24L01_Config();//nRF24L01配置
//*********************************主函数**********************************************
int main( void )
{
  WDTCTL=WDTPW+WDTHOLD;
  delay_us(10);
  int_clk();
  init_io();
  int_spi0();
  nRF24L01_Config();
  _EINT();
  while(1)
  {
  SPI_RW_Reg(WRITE_REG+STATUS,0X1E);
  nRF24L01_TxPacket(data);
  //sta=SPI_Read(STATUS);
  while(P1IN&BIT0)
  {flag=SPI_Read(CONFIG);
  //cfcs=SPI_Read(OBSERVE_TX);
  delay_ms(10);
  }
  //while(1);
  /*while(1)
  {
    SPI_RW_Reg(WRITE_REG+STATUS,0x0E);
  while(sta&0x10);
  delay_us(10000);
  }*/
  }
}

/***********************************延时********************************************
uchar delay_us(uint i)
{
  while(i--)
    _NOP();
}*/
//***********************************初始化时钟********************************************
void int_clk()//MCLK=6MHZ,SMCLK=3MHZ,//ACLK=32768HZ,
{
  uchar i;
  //P5SEL=0X70;
  BCSCTL1&=~XT2OFF;//开高晶振
  BCSCTL2|=SELM1+SELS+DIVS0;
  do
  {
    IFG1&=~OFIFG;
    for(i=0xFF;i>0;i--);
  }
  while((IFG1&OFIFG)!=0);
  IFG1&=~OFIFG;
}
//*************************初始化io端口******************************************
void init_io()
{
  P1SEL=0X00;
  P1DIR|=BIT1+BIT2;//单片机对nRF24L01的控制管脚P1.0(IRQ)P1.1(CE)P1.2(CSN)
   P1OUT&=~BIT1;//CE低
   P1OUT|=BIT2;//CSN高
   P1IE|=BIT0;
   P1IES|=BIT0;
  // P1IE|=BIT0;
  //P5SEL=0X70;//时钟信号检测口
}
//********************************初始化SPI0***********************************************
void int_spi0()//6;1;N;9600
{
  P3SEL|=0X0E;
  P3DIR|=BIT1+BIT3;
  U0CTL|=SWRST;
  U0CTL|=CHAR+SYNC+MM;
  U0TCTL|=SSEL1+STC;
  U0TCTL|=CKPH;
  U0TCTL&=~CKPL;
  U0BR0 = 0X38;
  U0BR1 = 0X01;
  U0MCTL = 0X40;
  ME1|=USPIE0;
  U0CTL&=~SWRST;
  IE1&=~UTXIE0;
  IE1&=~URXIE0;//禁止中断

}
//***********使用命令字*****************************
uchar SPI_WORD(uchar word)
{
  P1OUT&=~BIT2;
      U0TXBUF=word;
    while(IFG1&URXIFG0);
while((IFG1&UTXIFG0)==0);
   IFG1&=~UTXIFG0;
   delay_us(1500);
   return(U0RXBUF);  
  P1OUT|=BIT2;
}
  

//*******************************SPI发送一个字节数据,**************************************************
uchar SPI_RW(uchar byte)      //
{
    U0TXBUF=byte;
// 输出 'byte',从高位到低位
    while(IFG1&URXIFG0);
while((IFG1&UTXIFG0)==0);
   IFG1&=~UTXIFG0;
    delay_us(1500);
   return(U0RXBUF);       // 返回接收的状态字节
}
//*************************往寄存器reg中写值'value',返回状态寄存器值*******************************************************
uchar SPI_RW_Reg(uchar reg,uchar value)
{
        uchar status;

          P1OUT&=~BIT2;                   // CSN 低, 初始化SPI通信
          status = SPI_RW(reg);      // 选择寄存器
          SPI_RW(value);             // 写值.
          P1OUT|=BIT2; // CSN 高
        delay_us(1);
          return(status);            // 返回nRF24L01状态值
}
//*****************************读寄存器的值****************************************************
uchar SPI_Read(uchar reg)
{
        char reg_val;
        
          P1OUT&=~BIT2;               //  CSN 低, 初始化SPI通信
          SPI_RW(reg);            // 选择寄存器
          reg_val=SPI_RW(0x00);    // 写寄存器
          P1OUT|=BIT2;                // CSN 高, 停止通信
        delay_us(1);
          return(reg_val);        // 返回寄存器值
}
//********************************读出byte字节数据*************************************************
uchar SPI_Read_Buf(uchar reg, uchar *pBuf, uchar bytes)
{
        uchar status,byte_ctr;

          P1OUT&=~BIT2;               // P1.2 CSN 低, 初始化SPI通信
          status = SPI_RW(reg);               // 选择寄存器去读,并且读状态寄存器的值

          for(byte_ctr=0;byte_ctr<bytes;byte_ctr++)
            pBuf[byte_ctr] = SPI_RW(0x00);    // 从 nRF24L01读字节

          P1OUT|=BIT2;                // CSN 高, 停止通信
         delay_us(1);
          return(status);                    // 返回NRF24L01的状态值
}
//*******************************写入BYTE字节数**************************************************
uchar SPI_Write_Buf(uchar reg, uchar *pBuf, uchar bytes)
{
        uchar status,byte_ctr;

          P1OUT&=~BIT2;           // P1.2 CSN 低, 初始化SPI通信
          status = SPI_RW(reg);    // 选择寄存器去写,并且读状态寄存器的值
          for(byte_ctr=0; byte_ctr<bytes; byte_ctr++) // 将字几个节写到 buffer(*pBuf)
            SPI_RW(*pBuf++);
          P1OUT|=BIT2;  // CSN 高, 停止通信
        delay_us(1);
          return(status);          // 返回NRF24L01的状态值
}
//*********************************************************************************
//接收函数,接收返回1表示有数据收到
uchar nRF24L01_RxPacket(uchar *rx_buf)
{
  uchar sta;
  uchar revale=0;
  SPI_RW_Reg(WRITE_REG+CONFIG,0X0F);
  P1OUT|=BIT1;   // CE 管脚置高去使能接收设备
  delay_us(130);
  sta=SPI_Read(READ_REG+STATUS);
  while(sta&0x40)
  {
    P1OUT&=~BIT1;
   //CE_LOW进入闲置模式
    SPI_Read_Buf(RD_RX_PLOAD,rx_buf,TX_PLOAD_WIDTH);/*数据宽度未定义*/
    //RD_RX_PLOAD=指令字读RX中有效数据,完成后清空FIFO
    //完成后SPIrxbuff里是RX到得数据
  //  revale="0xff";//如果有数据收到,则点亮led
  }
  SPI_RW_Reg(WRITE_REG+STATUS,sta);
  return revale;
}
//************************发送函数******************************
uchar  nRF24L01_TxPacket(uchar *tx_buf)
{
  P1OUT&=~BIT1;//CE置低
    SPI_RW_Reg(WRITE_REG+CONFIG,0X0E);
    SPI_WORD(FLUSH_TX);//清空TXFIFO
  SPI_Write_Buf(WRITE_REG+TX_ADDR,TX_ADDRESS,TX_ADR_WIDTH);
  //给发送寄存器写入地址,宽度为TX_ADR_WIDTH
  SPI_Write_Buf(WRITE_REG+RX_ADDR_P0,TX_ADDRESS,TX_ADR_WIDTH);
  //给接收寄存器写入地址,宽度也为TX_ADR_WIDTH
  SPI_Write_Buf(WR_TX_PLOAD,tx_buf,TX_PLOAD_WIDTH);
  //向发送寄存器写入TX_PLOAD_WIDTH宽度的数据,
  //配置为PWR_UP位,使能CRC,16位校验,发送模式
  P1OUT|=BIT1;   // CE 管脚置高
  delay_ms(1.5);
}
//***********nRF24L01的配置函数*************************
void nRF24L01_Config()
{
  P1OUT&=~BIT1;//CE为低,待机
  P1OUT|=BIT2;//CSN置高,SPI复位
  delay_ms(1.5);
//SPI_RW_Reg(WRITE_REG+STATUS,0X7E);
SPI_RW_Reg(WRITE_REG+CONFIG,0X0E);
  SPI_RW_Reg(WRITE_REG+EN_AA,0X01);
//数据通道0自动应答
SPI_RW_Reg(WRITE_REG+EN_RXADDR,0X01);
//通道0允许
  SPI_RW_Reg(WRITE_REG+SETUP_AW,0X03);
//设置地址宽度为5字节
  SPI_RW_Reg(WRITE_REG+SETUP_RETR,0X1A);  
//建立自动重发,500+86us,10次重发
  SPI_RW_Reg(WRITE_REG+RF_CH,0x02);
//设置工作通道频率
  SPI_RW_Reg(WRITE_REG+RF_SETUP,0X07);
//设置工作通道传输速率为1Mbps,发射功率为0dBm
  SPI_RW_Reg(WRITE_REG+RX_PW_P0,TX_PLOAD_WIDTH);
}
//***********中断***************
#pragma vector=PORT1_VECTOR
__interrupt void  PORT1_ISR(void)
{
  P1OUT&=~BIT1;//CE为低,待机
  sta=SPI_Read(STATUS);
    if(sta&0x10)
    {
     cfcs++;
    }
    else if(sta&0x20)
    {
      faci++;
    }
    P1IFG&=~BIT0;
}

出0入0汤圆

发表于 2010-1-11 15:00:46 | 显示全部楼层
关注

出0入0汤圆

发表于 2010-11-26 11:19:35 | 显示全部楼层
请问楼主的问题解决了么,我也在用MSP连24L01能读写寄存器,但是通信实现不了啊…………

出0入0汤圆

发表于 2011-9-13 22:03:28 | 显示全部楼层
我也是出现丢包问题,lz解决了吗?怎么解决的?

出0入34汤圆

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

本版积分规则

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

GMT+8, 2024-5-2 11:00

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

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