搜索
bottom↓
回复: 53

开源项目带LCD的无线串口之一步一步教你调试nRF905(原创)

[复制链接]

出0入0汤圆

发表于 2011-8-7 00:49:13 | 显示全部楼层 |阅读模式
最近有意做个无线串口的开源项目,为加大透传距离,所以采用Nordic公司NRF905来完成。

注:这次想要申酷帖了,另外本着开源的精神,请用CC2430等无线,MCU一体的大神们勿喷。

最后上几张项目的图片,这是手工焊接的原始版本,等调试无误的时候,再做 PCB.                          
下面来说说图片中模块拟要实现的功能,以及各个接口的说明。
◆  通讯速率  ≧  9600bps
◆  Nokia5110 LCD 按照用户的方式显示当前的数据,以及其他附加功能( 比如提取帧进行绘图 )。
◆  整个模块以 可接电压范围 5V-12V.
◆  配备两个按键,以及拨码开关和用户实现交互。
紧接着从熟悉芯片开始入手:

(原文件名:RF905.jpg)
关于芯片的详细介绍,大家自己可以去看Datasheet,我这里只是说几个重要的地方。

采用SPI四线制接口,外加3个 Input 口进行控制,4个 Output 口进行匹配反馈 。

除电源 VCC 和接地端,其余脚都可以直接和普通的 5V 单片机IO 口直接相连(建议在3个输出口串上2-5.1K的电阻分压,输出必须小于10mA)。当然对 3V 左右的单片机更加适用了。

引脚介绍:
引脚说明
VCC          3.3 - 3.6V
TX_EN          1:TX模式  0:RX模式
TRX_CE          芯片使能
PWR_UP          芯片上电
uCLK          NC
CD          载波检测
AM          地址匹配
DR          接受或发送数据完成(可接中断)
MISO         
MOSI         
SCK         
CSN         
GND         
GND       

nRF905 一共有4种工作模式:

ShockBurst Tx  ShockBurst Rx  掉电模式  StandBy模式

这四种模式由TRX_CE、TX_EN、PWR_UP 的设置来设定。

PWR_UP  TRX_CE   TX_EN
     0           X           X                掉电和SPI 编程
     1           0           X                Standby 和SPI 编程
     1           1           0                ShockBurst RX
     1           1           1                ShockBurst TX

调试无线模块,无非就是寄存器配置,而905一共要配置5个寄存器,分别是

1. 状态寄存器

包含数据就绪DR 和 地址匹配AM的状态。   

2. 射频寄存器

包含收发器的频率,输出功率等配置信息,有效数据位数,地址位数。

3. 发送地址寄存器

包含目标器件地址。

4. 发送数据寄存器

存放待发送数据的数据包

5. 接收数据寄存器

存放接收的数据包,在寄存器中的有效数据由DR引脚指示。

下面我根据官方的发送框图写一个发送流程图:

1. TX_EN =  1;

    PWR_UP = 1;

    TRX_CE = 1;

2. SPI时序操作,向寄存器写地址ADDR 和 待发送的数据 PLAYLOAD

    当切换模式时需要重写配置寄存器;

3. 再次判断 TRX_CE 是否为高电平;

          是——》 4

          否——》 配置为高电平,并再次执行 3

4. 开始传输,nRF905进入 ShockBurstTX模式,芯片内部自动添加前导码和CRC校验码

    当数据打包发送完毕 DR = 1;

5.  判断 TRX_CE 是否为高电平;

     是——》 判断 AUTO_RETRAN 是否配置为 1 ——》 DR = 0;被置为低电平——》4

               (这是个不断重发的过程,直到 TRX_CE = 0;)

     否——》 回到状态1,仅仅发送一次

用户需要写入的数据帧:  地址 + 数据

芯片内部数据帧格式 :前导码 + 地址 + 数据 + CRC检验码



下面是接受流程图,这个我不再机械的翻译而是自己组织下:

       当配置TRX_CE为高,而TX_EN为低以及 PWR_UP 的时候,芯片会在650us之后进入接收模式,当nRF905检测

到与其相同频率的载波时,CD( Carrier Detect)将会置高,当一个匹配的地址被检测到,AM(Address Match)将

会被置高,当一个匹配的数据包被检测到(CRC校验正确),芯片会自动去除包头,包尾,同时 DR (Data Ready)

置高,此时MCU将 TRX_CE置低,nRF905 进入StandBy模式 。然后MCU通过SPI时序将数据读出,一旦数据被读出,

AM和DR会自动置低。

       到此,这个接收过程完毕。

补充下:

       当在接收过程中,配置TRX_CE为高,TX_EN也为高的时候,芯片会立即进入TX模式,并且数据会丢失掉,但是

这里如果在改变模式之前,MCU已经检测到AM置高的话,这里可以由MCU自己决定,是哪怕丢失数据也要切换模式,

还是等DR=1;把数据读回来再切换模式。

大家可以自己对照框图,再来理解我的话。

     关于地址配置,官方建议使用24bits以上并且不要相同,原因之一是防止误匹配,二是地址过短,会导致地址混入接受的数据中,造成乱码。

Power Down Mode

掉电模式,低功耗模式,此时芯片无任何作用。小于2.5uA。

Standby Mode

待机模式,是发送完毕进入的模式,同时也是接收完毕进入的模式。

关于降低功耗的提示:1 .我们可以在芯片进入Power Down Mode时,对芯片进行配置。

                    2 .使用uclk引脚,现在模块好像已经不将这个引脚引出来了。


未插LCD (原文件名:1.png)


背面 (原文件名:2.png)


整体 (原文件名:4.png)

官方文档ourdev_665148OADP6P.pdf(文件大小:710K) (原文件名:Product_Specification_nRF905_v1.5.pdf)
翻译的中文文档ourdev_665149L57X65.pdf(文件大小:1.00M) (原文件名:nRF905_CN.pdf)

本手记到此为止,下一篇,开始写905程序了。

修改原因:增加5个寄存器的介绍。

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

 楼主| 发表于 2011-8-7 00:50:01 | 显示全部楼层
占位一楼后续更新用

出0入0汤圆

 楼主| 发表于 2011-8-7 00:50:13 | 显示全部楼层
占位二楼后续更新用

出0入0汤圆

 楼主| 发表于 2011-8-7 00:50:26 | 显示全部楼层
占位三楼后续更新用

出0入0汤圆

发表于 2011-8-7 01:11:18 | 显示全部楼层
占楼没有用,好像过若干小时后,就不能修改了。

出0入131汤圆

发表于 2011-8-8 20:15:29 | 显示全部楼层
好东西。

出0入0汤圆

 楼主| 发表于 2011-8-8 23:11:37 | 显示全部楼层
好像不可以修改回复了啊,真是遗憾,那我继续吧。

无线串口调试手记(二)——MCS-51串口和LCD5510

  学过51好久了,好多知识都忘记了,比如在配置串口时,如何计算波特率,串口的几种工作方式,顺便了解到定时器的几种工作方式。

        最大的感受是:学什么东西,在一开始的时候不可能什么都懂的,等你隔上一段时间,当然这段时间里面你应该仍然提高,而不是停滞不前,回过头再看看你当时学的东西,会有种大彻大悟的感受,原来也就是那么回事,还记得当初学习51单片机的时候,什么寄存器配置都不懂,只是跟着视频把代码抄下来,根本就不求甚解,只是知道,这样做就行了,直到调试nRF24L01的时候,才明白寄存器配置具体是怎么回事。

       后来接触飞思卡尔,430这类单片机时又巩固了下。

       所以呢,不管学什么,第一遍不懂没关系,关键不能放弃,当你到达另一个高度,再回来看看,看书已不是煎熬,而是享受知识了。

先来进行串口的配置,为了保证数据的稳定数传,先配置为 9600bps ,

这里先来详细解释下波特率的概念:

波特率:每秒钟传输二进制代码的位数;

9600bps,意思就是每秒钟传送9600个比特(bit),因为算上1个起始位,1个停止位,8个数据位,所以完整完成一个字节(byte)的传输需要10位,也就是每秒钟960个字节,1s=1000ms,所以传输一个字节的时间为:

1000/9600=0.1042s=1.042ms


(原文件名:5.jpg)

显然我们这里选第2种工作方式。
然后采用定时器,作为波特率的发生器,这里给出计算公式:

(原文件名:6.jpg)

根据计算,可以算出当  TH1 = TL1 = 0xFD;



void Uart_Init(void)

{

    TMOD = 0x20;

    SCON = 0x50;

    TH1 = 0xFD;

    TL1 = TH1;

    PCON = 0x00;

    EA = 1;

    ES = 1;

    TR1 = 1;

}
好,串口及定时器差不多就到这里,下面就是LCD5110,这个屏网上的驱动是在很多,然后我整理下资料,写出了一个还算差强人意的驱动程序出来。
点击此处下载 ourdev_665699EETUP9.rar(文件大小:3K) (原文件名:LCD5110 for 51.rar)

调试手记二就写到这里,明天开始第三篇。

出0入0汤圆

发表于 2011-8-8 23:16:48 | 显示全部楼层
不错

出0入0汤圆

 楼主| 发表于 2011-8-8 23:19:36 | 显示全部楼层
感觉 好没人气啊

出0入0汤圆

发表于 2011-8-9 02:44:02 | 显示全部楼层
你要把标题名改成:XX项目共享,肯定一堆人进来mark。

出0入0汤圆

 楼主| 发表于 2011-8-9 04:29:56 | 显示全部楼层
好像已经不能修改了  呜呜

出0入0汤圆

发表于 2011-8-9 07:17:06 | 显示全部楼层
mark,不知道这个无线串口的波特率是怎样来修改的,人工改一次保存一次?还是自适应系统的串口,自己修改?

出0入0汤圆

发表于 2011-8-9 07:30:42 | 显示全部楼层
正在用的一个无线wifi串口,


串口设置页面 (原文件名:无线wifi串口.jpg)

就是每次修改波特率 都要在这个设置页面修改保存一下。

出0入0汤圆

发表于 2011-8-9 07:40:06 | 显示全部楼层
我先顶顶

出0入0汤圆

发表于 2011-8-9 08:47:02 | 显示全部楼层
学习。谢谢楼主分享。

出0入0汤圆

 楼主| 发表于 2011-8-9 13:03:07 | 显示全部楼层
顶一个 继续努力

出0入0汤圆

发表于 2011-8-12 17:18:03 | 显示全部楼层
楼主好样的!!!

出0入0汤圆

发表于 2011-8-12 19:48:14 | 显示全部楼层
在一个博客文章看到的分享一下,这几天也在搞这个。
#include <iom16.h>
#include <macros.h>
#include"delay.h"
#include"lcd_init.h"
#pragma interrupt_handler timer0_ovf_isr:10
#define uint unsigned int
#define uchar unsigned char
#define DATA7 (DATA_BUF&BIT(7))!= 0
#define DATA0   (DATA_BUF&BIT(0))!= 0
//---------------------------------------------------配置口定义---------------------------------------------------
#define TXEN_1   (PORTB|=BIT(0))
#define TXEN_0   (PORTB&=~BIT(0))
#define TRX_CE_1 (PORTB|=BIT(1))
#define TRX_CE_0 (PORTB&=~BIT(1))
#define PWR_1    (PORTB|=BIT(2))
#define PWR_0   (PORTB&=~BIT(2))
#define MISO   (PINB&BIT(3))
#define MOSI_1   (PORTB|=BIT(4))
#define MOSI_0   (PORTB&=~BIT(4))
#define SCK_1   (PORTB|=BIT(5))
#define SCK_0   (PORTB&=~BIT(5))
#define CSN_1   (PORTB|=BIT(6))
#define CSN_0   (PORTB&=~BIT(6))
//---------------------------------------------------NRF905状态IO----------------------------------------------------
#define AM PINA&BIT(0)
#define DR PINA&BIT(1)
#define CD PINA&BIT(2)
//-------------------------------------------------------nrf905控制指令-------------------------------------------
#define WC  0x00
#define RC  0x10
#define WTP  0x20
#define RTP  0x21
#define WTA  0x22
#define RTA  0x23
#define RRP  0x24
unsigned  char DATA_BUF;
uint cnt=0,miao=0;
//---------------------------------------------------发送数据缓冲区-------------------------------------------------
unsigned char TxRxBuf[5]=
{
0x00
};
unsigned char TxRxBuf1[]={"fuck u!"};


//------------------------------------------------NRF905寄存器配置------------------------------------------------
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晶振
};
uchar TxAddress[4]={0xcc,0xcc,0xcc,0xcc};
//------------------------------------------------延时------------------------------------------------------------
//---------------------------------------------------SPI读函数-----------------------------------------------------
unsigned char SpiRead(void)
{
unsigned char j;
for (j=0;j<8;j++)
{
        DATA_BUF=DATA_BUF<<1;
  SCK_1;
  if (MISO) //读取最高位,保存至最末尾,通过左移位完成整个字节
  {
   DATA_BUF|=BIT(0);
  }
  else
  {
   DATA_BUF&=~BIT(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;
}
}
//------------------------------------------------------初始化nRF905---------------------------------------------
void nRF905Init(void)
{
    CSN_1;      // Spi  disable
SCK_0;      // Spi clock line init low

DDRA=0XFF;
PORTA=0XFF;
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)
{
uchar i;
CSN_0;      // Spi enable for write a spi command
//SpiWrite(WC);    // Write config command写放配置命令
for (i=0;i<11;i++) // Write configration words  写放配置字
{
    SpiWrite(RFConf);
}
CSN_1;     // Disable Spi
}
//-----------------------------------------------------发送数据打包---------------------------------------------------
void TxPacket(uchar *TxRxBuf)
{
uchar i;
//Config905();
CSN_0;
SpiWrite(WTP);    // Write payload command
for (i=0;i<4;i++)
{
  SpiWrite(TxRxBuf);  // Write 32 bytes Tx data
}// 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);
}
CSN_1;      // Spi disable
TRX_CE_1;     // Set TRX_CE high,start Tx data transmission
delay_ms(1); //    // while (DR!=1);
TRX_CE_0;     // Set TRX_CE low
}
//----------------------------------------------------------设置发送状态---------------------------------------------
void SetTxMode(void)
{
TRX_CE_0;
TXEN_1;
delay_ms(1);      // delay for mode change(>=650us)
}
//-----------------------------------------------设置发送状态---------------------------------------------------
void SetRxMode(void)
{
TXEN_0;
TRX_CE_1;
delay_ms(1);      // delay for mode change(>=650us)
}
//-------------------------------------------------判断数据接收状态-----------------------------------------------------
unsigned char CheckDR(void)  //检查是否有新数据传入 Data Ready
{
DDRB=((0<<PB0)|(0<<PB1));//先置为输入读状态
if(DR==1 && PINB&BIT(1)==1 && PINB&BIT(0)==0)
{
       // Delay(50)  ;
  return 1;
}
else
{
  return 0;
}
DDRB=((1<<PB0)|(1<<PB1));//重置为输出
}
//----------------------------------------------------读NRF905接收数据------------------------------------------------------------
void RxPacket(void)      
{
uchar i;
    delay_ms(1);
// TRX_CE=0;     // Set nRF905 in standby mode
    delay_ms(100);
    TRX_CE_0;
CSN_0;      // Spi enable for write a spi command
    delay_ms(1);
SpiWrite(RRP);
for (i = 0 ;i < 4 ;i++)
{
  TxRxBuf=SpiRead();  // Read data and save to buffer      
}
CSN_1;
    delay_ms(10);
TRX_CE_1;      
}
//--------------------------------------------------------数据接收------------------------------------------------
void  RX(void)
{
          SetRxMode();   // Set nRF905 in Rx mode
          while (CheckDR()==0);
    delay_ms(10);
      RxPacket();
  
}
unsigned char CheckCD(void)  //Pin->检查是否已存在同频率载波
{
if (CD==1)
{
  return 1;
}
else
{
  return 0;
}
}

void timer0_init(void)
{     
TCNT0 = 0x83;   //1ms
TCCR0 = 0x03;  //64
TIMSK = 0x01;   
}
void timer0_ovf_isr(void)
{      
TCNT0 = 0x83;  
cnt++;
if(cnt==1000)
{
   miao++;
   cnt=0;
   if(miao>59)
   {
     miao=0;
   }
}

}
//-----------------------------------------------------------------------------------------------------------------
void main(void)
{
      uchar i;
      DDRB=0XF7;
    DDRA=0X00;
    timer0_init();
    SREG=0X80;
      nRF905Init();
      Config905();
    LCD_init();
   
        while(1)
     {
       TxRxBuf[0]=miao/10;
    TxRxBuf[1]=miao%10;
    TxRxBuf[2]=cnt/100;
    TxRxBuf[3]=cnt/10%10;
    TxRxBuf[4]=cnt%10;
    LCD_write_char(0,0,num1[TxRxBuf[0]]);
    LCD_write_char(1,0,num1[TxRxBuf[1]]);
    LCD_write_char(2,0,':');
    LCD_write_char(3,0,num1[TxRxBuf[2]]);
    LCD_write_char(4,0,num1[TxRxBuf[3]]);
   
    LCD_write_char(5,0,num1[TxRxBuf[4]]);
    LCD_write_string(0,1,TxRxBuf1);
    SetTxMode();// Set nRF905 in Tx mode
       TxPacket(TxRxBuf);// Send data by nRF905
    //TxPacket(TxRxBuf1);
       }
}


接收:
#include <iom16.h>
#include <macros.h>
#include"delay.h"
#include"lcd_init.h"
//---------------------------------------------------配置口定义---------------------------------------------------
#define DATA7 (DATA_BUF&BIT(7))!= 0
#define DATA0   (DATA_BUF&BIT(0))!= 0
#define uint unsigned int
#define uchar unsigned char
#define TXEN_1   (PORTB|=BIT(0))
#define TXEN_0   (PORTB&=~BIT(0))
#define TRX_CE_1 (PORTB|=BIT(1))
#define TRX_CE_0 (PORTB&=~BIT(1))
#define PWR_1    (PORTB|=BIT(2))
#define PWR_0   (PORTB&=~BIT(2))
#define MISO   (PINB&BIT(3))
#define MOSI_1   (PORTB|=BIT(4))
#define MOSI_0   (PORTB&=~BIT(4))
#define SCK_1   (PORTB|=BIT(5))
#define SCK_0   (PORTB&=~BIT(5))
#define CSN_1   (PORTB|=BIT(6))
#define CSN_0   (PORTB&=~BIT(6))
//---------------------------------------------------NRF905状态IO----------------------------------------------------
#define AM PINA&BIT(0)
#define DR PINA&BIT(1)
#define CD PINA&BIT(2)
//-------------------------------------------------------nrf905控制指令-------------------------------------------
#define WC  0x00
#define RC  0x10
#define WTP  0x20
#define RTP  0x21
#define WTA  0x22
#define RTA  0x23
#define RRP  0x24
unsigned  char DATA_BUF;

//---------------------------------------------------发送数据缓冲区-------------------------------------------------
unsigned char TxRxBuf[5];
unsigned char TxRxBuf1[];

//------------------------------------------------NRF905寄存器配置------------------------------------------------
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晶振
};
uchar TxAddress[4]={0xcc,0xcc,0xcc,0xcc};
char tf;
//------------------------------------------------延时------------------------------------------------------------
//---------------------------------------------------SPI读函数-----------------------------------------------------
unsigned char SpiRead(void)
{
unsigned char j;
for (j=0;j<8;j++)
{
        DATA_BUF=DATA_BUF<<1;
  SCK_1;
  if (MISO) //读取最高位,保存至最末尾,通过左移位完成整个字节
  {
   DATA_BUF|=BIT(0);
  }
  else
  {
   DATA_BUF&=~BIT(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;
}
}
//------------------------------------------------------初始化nRF905---------------------------------------------
void nRF905Init(void)
{
    CSN_1;      // Spi  disable
SCK_0;      // Spi clock line init low

DDRA=0XFF;
PORTA=0XFF;
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)
{
uchar i;
CSN_0;      // Spi enable for write a spi command
//SpiWrite(WC);    // Write config command写放配置命令
for (i=0;i<11;i++) // Write configration words  写放配置字
{
    SpiWrite(RFConf);
}
CSN_1;     // Disable Spi
}
//-----------------------------------------------------发送数据打包---------------------------------------------------
void TxPacket(uchar *TxRxBuf)
{
uchar i;
//Config905();
CSN_0;
SpiWrite(WTP);    // Write payload command
for (i=0;i<4;i++)
{
  SpiWrite(TxRxBuf);  // Write 32 bytes Tx data
}// 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);
}
CSN_1;      // Spi disable
TRX_CE_1;     // Set TRX_CE high,start Tx data transmission
delay_ms(1); //    // while (DR!=1);
TRX_CE_0;     // Set TRX_CE low
}
//----------------------------------------------------------设置发送状态---------------------------------------------
void SetTxMode(void)
{
TRX_CE_0;
TXEN_1;
delay_ms(1);      // delay for mode change(>=650us)
}
//-----------------------------------------------设置发送状态---------------------------------------------------
void SetRxMode(void)
{
TXEN_0;
TRX_CE_1;
delay_ms(1);      // delay for mode change(>=650us)
}
//-------------------------------------------------判断数据接收状态-----------------------------------------------------
unsigned char CheckDR(void)  //检查是否有新数据传入 Data Ready
{
DDRB=((0<<PB0)|(0<<PB1));//先置为输入读状态
if(DR==1 && PINB&BIT(1)==1 && PINB&BIT(0)==0)
{
       // Delay(50)  ;
  return 1;
}
else
{
  return 0;
}
DDRB=((1<<PB0)|(1<<PB1));//重置为输出
}
//----------------------------------------------------读NRF905接收数据------------------------------------------------------------
void RxPacket(void)      
{
    uchar i;
    delay_ms(1);
// TRX_CE=0;     // Set nRF905 in standby mode
    delay_ms(100);
    TRX_CE_0;
    CSN_0;      // Spi enable for write a spi command
    delay_ms(1);
    SpiWrite(RRP);
  for (i = 0 ;i < 4 ;i++)
  {
    TxRxBuf=SpiRead();  // Read data and save to buffer      
    }
  
  CSN_1;
    delay_ms(10);
  TRX_CE_1;      
}
//--------------------------------------------------------数据接收------------------------------------------------
void  RX(void)
{
      SetRxMode();   // Set nRF905 in Rx mode
    //while (CheckDR()==0);
    delay_ms(10);
      RxPacket();
    delay_ms(10);
  
}
unsigned char CheckCD(void)  //Pin->检查是否已存在同频率载波
{
if (CD==1)
{
  return 1;
}
else
{
  return 0;
}
}
//-----------------------------------------------------------------------------------------------------------------
void main(void)
{
      uchar i;
      DDRB=0XF7;
    DDRA=0X00;
    DDRC=0XfF;   
    nRF905Init();
      Config905();
    LCD_init();
   
        while(1)
  {
            RX();
    LCD_write_char(0,0,num1[TxRxBuf[0]]);
    w_12864(1,num1[TxRxBuf[1]]);
    w_12864(1,':');
    w_12864(1,num1[TxRxBuf[2]]);
    w_12864(1,num1[TxRxBuf[3]]);   
    w_12864(1,num1[TxRxBuf[4]]);
    //LCD_write_string(0,1,TxRxBuf1);
    //CSN_1;
    delay_ms(1);
      
    }
}

出0入0汤圆

发表于 2011-8-19 01:46:54 | 显示全部楼层
怎么就不更新啦      好东西啊  mark!!!!!!!!!!

出0入0汤圆

 楼主| 发表于 2011-8-20 16:32:20 | 显示全部楼层
无线串口调试手记(三)——两种平台的源程序

这几天 楼主 回家种地了  现在才到学校,经过两天的 辛苦调试,终于在此刻有了最终的成果,
这次给大家带来的代码是两个单片机平台的 分别是 STC89C58RD+ 以及飞思卡尔的Freescale XS128
平台的,这样参加飞思卡尔智能车比赛的同学也有福了,可以拿过去直接用了。
同时我也相信,这应该是ourdev上最完美的 nRF905 的驱动,大家自己看看。
一点说明: 这里所放出的两份源代码都是最简单的,没有附加任何东西,只是单纯的收和发,旨在为了
大家,更好的理解。

点击此处下载 ourdev_669466PCXJ0B.rar(文件大小:76K) (原文件名:MCS-51.rar)
点击此处下载 ourdev_669467TF0ZA7.rar(文件大小:234K) (原文件名:WirelessSP-Xs128mma.rar)

等再隔几天,我会上传最终的无线串口的程序。
假以时日。。。。

出0入0汤圆

 楼主| 发表于 2011-8-20 20:56:07 | 显示全部楼层
我不知道 为什么 这么好的帖子没有人顶 没有人帮我至酷。。。
好难受啊

出0入0汤圆

发表于 2011-8-20 21:26:01 | 显示全部楼层
以前也玩过,我记得可以实现多个模块组网

出0入0汤圆

 楼主| 发表于 2011-8-20 22:34:56 | 显示全部楼层
我真是伤心透了。。。。

出0入0汤圆

发表于 2011-8-21 11:15:12 | 显示全部楼层
标记

出0入0汤圆

发表于 2011-8-21 13:27:42 | 显示全部楼层
ding.................
我也在弄nrf905,还不会,来跟楼主学习

出0入0汤圆

发表于 2011-9-2 00:06:28 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-9-13 14:02:11 | 显示全部楼层
有点骚了,淡定啊,阿莫来看看才是关键

出0入0汤圆

发表于 2011-9-13 15:53:07 | 显示全部楼层
刚好要学学nrf905.很实用。

出0入0汤圆

发表于 2011-9-26 11:45:16 | 显示全部楼层
最近也在搞NRF905,用的是51单片机,STC12LE5A60S2晶振采用22.1184M
我也希望做一个协议。
希望有兴趣的,有相关经验的朋友进来讨论啊。
QQ群:58163037
加入时候说明:来自OURDEV。

出0入0汤圆

发表于 2011-10-9 14:56:16 | 显示全部楼层
请问在建筑里面能传多远呢?能穿透多少墙?我最近也在做无线通信,买了个nRF905模块调试,传的距离太近了。

出0入0汤圆

发表于 2011-10-23 18:21:56 | 显示全部楼层
顶起!

出0入0汤圆

发表于 2012-5-30 18:49:59 | 显示全部楼层
资料不能下载,还是要顶一下

出0入0汤圆

发表于 2012-7-19 23:09:53 | 显示全部楼层
顶顶,学习啦

出0入0汤圆

发表于 2012-8-3 11:41:49 | 显示全部楼层
学习中,望有更多内容。

出0入0汤圆

发表于 2012-8-13 15:22:15 | 显示全部楼层
mark and mark

出0入0汤圆

发表于 2012-8-16 20:44:52 | 显示全部楼层
楼主,你好,最近在搞nrf905,请问这模块能不能发送汉字,然后在1602显示出来?请问在程序的哪里改?小弟是菜鸟,问得不好不要见怪!

出0入0汤圆

发表于 2012-8-22 16:47:09 | 显示全部楼层
....学习了。。。

出0入0汤圆

发表于 2012-8-22 17:02:57 | 显示全部楼层
winfisher 发表于 2011-8-9 02:44
你要把标题名改成:XX项目共享,肯定一堆人进来mark。

哈哈,这位兄弟说的有道理

出0入0汤圆

发表于 2012-11-9 23:17:40 | 显示全部楼层
楼主没有坚持自己啊!!

出0入0汤圆

发表于 2012-11-11 22:36:57 | 显示全部楼层
必须的肯定顶,留着以后学习i一下!

出0入0汤圆

发表于 2013-3-13 12:33:09 | 显示全部楼层
mark下,感觉很有用处.

出0入0汤圆

发表于 2013-5-7 21:23:07 | 显示全部楼层
好东西,学习一下无线知识。。。。

出0入0汤圆

发表于 2013-5-8 12:12:17 | 显示全部楼层
最近在搞NRF905,目前只能实现发射接收,参考一下资料。。。,谢谢

出0入0汤圆

发表于 2013-5-29 21:40:47 | 显示全部楼层
几年后重新拿起这个

出0入0汤圆

发表于 2013-5-29 22:01:02 | 显示全部楼层
不错,顶下

出0入0汤圆

发表于 2013-11-1 12:57:19 | 显示全部楼层
。。。学习了

出0入0汤圆

发表于 2013-11-28 20:43:23 | 显示全部楼层
也正在学习,mark!

出0入0汤圆

发表于 2013-12-9 17:18:33 | 显示全部楼层

学习。谢谢楼主分享。

出0入0汤圆

发表于 2014-2-13 22:39:44 | 显示全部楼层
非常好的教程

出0入0汤圆

发表于 2014-2-14 09:19:09 | 显示全部楼层
楼主莫伤心,我来支持你。请继续吧。

出0入0汤圆

发表于 2014-11-4 14:10:07 | 显示全部楼层
开源项目 支持楼主

出0入0汤圆

发表于 2014-11-6 14:52:31 | 显示全部楼层
无线串口之 一步一步教你 调试 nRF905

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-7-23 09:18

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

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