请教nRF905数据发送的问题

2019-03-24 20:49发布

最近调试一对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);     // 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); // 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);     // 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=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);   } }    此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
5条回答
liaogao2
2019-03-24 22:55
我也调过。调了很久一直没出来,后来才发现是插座有问题,闹心死了

一周热门 更多>