极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 13030|回复: 6

论坛有没有用spi库实现nrf905传输的例子?

[复制链接]
发表于 2013-1-3 22:46:06 | 显示全部楼层 |阅读模式
不懂啊,买了两个nrf905想试试无线传输,貌似完全没有参考,spi库也不是很懂啊。大家有没有实验过的,或者有写思路给我个参考,不胜感激
回复

使用道具 举报

发表于 2013-4-9 10:54:04 | 显示全部楼层
用spi库不难,直接调用就可以了。关键是nrf905传输协议和接线别接错就可以了。我就是卡在发送与接收模式上,用spi读写寄存器,读写都没问题,就是收不到数据。
回复 支持 反对

使用道具 举报

发表于 2013-4-11 21:32:03 | 显示全部楼层
现在能收到数据了,新问题是接收很不稳定,有时甚至要晃晃天线才能接收到,丢包很多,真奇怪。
回复 支持 反对

使用道具 举报

发表于 2013-5-23 01:37:22 | 显示全部楼层
applesof 发表于 2013-4-11 21:32
现在能收到数据了,新问题是接收很不稳定,有时甚至要晃晃天线才能接收到,丢包很多,真奇怪。

能不能贴个代码的例子出来, 学习下.

最近我也在搞 NRF905.

[email protected]
回复 支持 反对

使用道具 举报

发表于 2013-6-14 11:49:26 | 显示全部楼层
本帖最后由 applesof 于 2013-6-14 12:14 编辑

#include <SPI.h>
#include "api.h"
//ss=10,mosi=11,miso=12,sck=13
//TxEN(4in),ce(8in),pwr(5in),cd(6out),am(7out),dr(out3),ss=10

//(csn),mosi=11,miso=12,sck=13,ce(9)

bool fglab=true;
uint8_t len=1;


uint8_t words[32];//transmit array
uint8_t value[8*32*32];//receive array 8kbyte array
uint8_t address[4];//transmit address

uint8_t cePin = 9;
uint8_t csnPin = 10;
uint8_t DrPin=3;
uint8_t TxENPin = 4;
uint8_t pwrPin = 5;
uint8_t cdPin = 6;
uint8_t amPin = 7;



// uint8_t payload = 16;
RFConfig RxTxConf =
{
10,
0x80, 0x00, 0x44, 0x20, 0x20, 0xdd, 0xdd, 0xdd,0xdd, 0xd8
};

void setup(){
pinMode (cePin, OUTPUT);
pinMode (csnPin, OUTPUT);
pinMode (TxENPin, OUTPUT);
pinMode (pwrPin, OUTPUT);
pinMode (cdPin, INPUT);
pinMode (amPin, INPUT);
pinMode (DrPin, INPUT);
Serial.begin(9600);
SPI.begin();
configRegister(WC,RxTxConf);                                   //开始
     
}

void loop(){

Serial.print("The ");
Serial.print(len);
Serial.println(" NRF905 test start");

if(fglab) {
for(int i=0;i<32;i++){
  words=i+1;

}
for(int i=0;i<4;i++){
  address=0xdd;

}

  
fglab=false;
}
else
;



/*
readRegister(RC,value,10)  ;
   
for(int i=0;i<10;i++){
Serial.println(value,HEX);
}*/

/*while(len<254)
{
transmitRF(words,address);
setTxMode();
delay(1);

for(int i=0;i<32;i++){
  words=len+i+1;
}

len++;
}
ceLow();//standby mode
*/

/*
setRxMode();
receiveRF(value);
while(AMcheck()==0);
ceLow();//standby mode
*/


for(int i=0;i<32;i++){
Serial.println(value,HEX);
}
delay(1000);
Serial.print("The ");
Serial.print(len);
Serial.println(" NRF905 test succeed");
//len++;
}











void  readRegister(uint8_t reg1,uint8_t * value1, uint8_t len1)
// Reads from NRF registers.
{
    csnLow();//hi-low spi valid
     powerUpTx();
    ceLow();
   
    SPI.transfer(reg1);
    delay(1);
    for(int i=0;i<len1;i++)
    {
    value1= SPI.transfer(0x00);
    }
   
    delay(1);
    csnHi();//hi-low spi valid,then need to high
}


void  configRegister(uint8_t reg1,RFConfig RTConf)
// Configure the NRF registers.
{
    csnLow();//hi-low spi valid
     powerUpTx();
    ceLow();

    SPI.transfer(reg1);
   
    for(int i=0;i<RTConf.n;i++)
    {
     SPI.transfer(RTConf.buf);
    }
  
   
    csnHi();//hi-low spi valid,then need to high
}

void  transmitRF(uint8_t * value,uint8_t * address)
// transmit data
{
    csnLow();//hi-low spi valid
    powerUpTx();
    ceLow();
   //output data
    SPI.transfer(WTP);
    delay(1);
    for(int i=0;i<32;i++)
    {
     SPI.transfer(value);
    }
  
    delay(1);
    csnHi();//hi-low spi valid,then need to high
//set target address
    csnLow();
    SPI.transfer(WTA);
    for (int i=0;i<4;i++){
    SPI.transfer(address);
    }
    csnHi();//spi finish
   
}



void  receiveRF(uint8_t * value)
// transmit data
{
   while(DRcheck()==0);//data not ready,wait until dr=1,go out of while recycle

    csnLow();//hi-low spi valid
    powerUpTx();
    ceLow();//standby mode
   
    SPI.transfer(RRP);
    delay(1);
//read data from register
    for(int i=0;i<32;i++)
    {
     value=SPI.transfer(0x00);
    }
  
    delay(1);
    csnHi();
   
  }

}




void  ceHi(){
        digitalWrite(cePin,HIGH);
}

void  ceLow(){
        digitalWrite(cePin,LOW);
}

void  csnHi(){
        digitalWrite(csnPin,HIGH);
}

void  csnLow(){
        digitalWrite(csnPin,LOW);
}


void  TxENHi(){
        digitalWrite(TxENPin,HIGH);
}

void  TxENLow(){
        digitalWrite(TxENPin,LOW);
}


void  powerUpTx(){
        digitalWrite(pwrPin,HIGH);
}
void  powerDown(){
       
        digitalWrite(pwrPin,LOW);
}

int DRcheck(){
int lb;lb=digitalRead(DrPin);
return lb;

}

int AMcheck(){
int lb;
lb=digitalRead(amPin);
return lb;

}


int CDcheck(){
int lb;
lb=digitalRead(cdPin);
return lb;

}

void setTxMode(){
    powerUpTx();
    ceHi();//start shockburst tx mode
    TxENHi();
    delay(1);//wait for transmit finish
}

void setRxMode(){
    powerUpTx();
    ceHi();//start shockburst rx mode
    TxENLow();
    delay(1);//wait for receive finish
}
回复 支持 反对

使用道具 举报

发表于 2013-6-14 11:50:58 | 显示全部楼层
//api.h

// BYTE type definition
#ifndef API_H
#define API_H
//****************************************************
// SPI(nRF905) commands
#define WC              0x00  // Define read command to register
#define RC              0x10  // Define write command to register
#define WTP             0x20  // Define RX payload register address
#define RTP             0x21  // Define TX payload register address
#define WTA             0x22  // Define flush TX register command
#define RTA             0x23  // Define flush RX register command
#define RRP             0x24  // Define reuse TX payload register command

#define PWRUP    0x05
#define CD       0x06
#define AM       0x07

typedef struct RFConfig
{  
char n;
byte buf[10];
}RFConfig;
//************************************************
#endif


回复 支持 反对

使用道具 举报

发表于 2013-6-14 11:51:59 | 显示全部楼层
154691780 发表于 2013-5-23 01:37
能不能贴个代码的例子出来, 学习下.

最近我也在搞 NRF905.

代码如上。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-5 23:15 , Processed in 0.035764 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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