NRF905参考程序参考教程包含多个实例和解释

上传人:痛*** 文档编号:64487032 上传时间:2022-03-21 格式:DOC 页数:66 大小:846.50KB
返回 下载 相关 举报
NRF905参考程序参考教程包含多个实例和解释_第1页
第1页 / 共66页
NRF905参考程序参考教程包含多个实例和解释_第2页
第2页 / 共66页
NRF905参考程序参考教程包含多个实例和解释_第3页
第3页 / 共66页
点击查看更多>>
资源描述
NRF905程序参考教程。本资料主要是将程序中各部分子程序的功 能与NRF905的手册相关联,使得各位同仁 在每个子程序为什么这么写都在手册中找 到具体的体现,特别是寄存器配置。内涵完整参考程序,是100%可用程序。 硬件的连接方法在参考程序之后,并介绍原 理。本人最后只是为了提供给大家一个入门的 资料或是引子罢了,至于如何应用的巧妙那 是后期编程巧妙的结果,目前只是给刚进门 的人士一个可以快速理解和掌握的浅显易 懂的教程罢了。本人疏忽之处还请见谅。按照惯例先展示作品抛砖引玉:四路AD采集+温度采集彩屏显示信息数据 GSM手机电话最近做的,音频功放四路电机控制大功率led控制,不解释以前做的,舵机和摄像头,不解释更早先的,VGA显示,不解释已发送为例子。1. 通过spi接口把寄存器相应的值写到905中2. 把要发的数据写到 905中3. 把状态设置成发送4. 数据被发出那么操作905就主要是前三步的问题,那么请带个这前三个问题深入理解下面的相关解释了。无线通信模块的三个要素:Nrf905模式的配置Nrf905通过寄存器配置Nrf905需要spi通信配置寄存器先看模式配置:程序加解释PWR UPTRX CETX EN操作模式0XX断电和SPI编程10X待机和SPI 编程110射频接收模 式111射频发送模 式根据这个图表,我们发觉有 四种模式。捡重点的说实现收发功能有两种模式。这两种模式在程序段中的实现是:PWR_UP,如果他是低电平PWR_UP为高电平。delay for mode设置成接受模式,程序中没写 就变成断电,所以个程序段默认void SetRxMode(void)TXEN=0;TRX_CE=1;Delay(1);/change(=650us)设置发送模式,这里会有疑问,在于TRX_CE=0;。这里给出的解释是,如果我们直接写TRX_CE=1这样模块立即将其内部所写好的数据发送出去。而对于编程的人员来说编出的程序五花八门,就比如说这条,改 程序员的意图并不想让设置发送模式时,数据就被立即发出,所以 写了 TRX_CE=0。如果看后面的完整程序,你会发现在发送时,有TRX_CE=1这一步。所以说,刚才那个图表没有问题。 这里可以认 为是准备发送模式,而不是发送模式,一旦 TRX_CE=1 那么数据立 即被发送。void SetTxMode(void)TRX_CE=0;TXEN=1;Delay(1);/ delay for mode change(=650us)关于图表中前两种模式中,实例程序所应用的是第二种,即待机spi编程模式。不管应用两种的哪一种,都是为了spi编程(通过spi通信配置905寄存器)。那么给出这个模式的应用程序段:有这么做引脚赋予各种电平先不用管他,我们看到PWR=1;TRX_CE=O;TXEN=0;三个,在待机 spi 模式中 TXEN=x即可 以为任何值。说明现在是待机且spi编程模式。程序段中其他引脚功能罗列下:Csn: spi的有效与否的引脚,低电平有效。如果只是单纯的设置模式,该引脚并没用处,只是后期程序的编写,所以做下配置。Sck: spi的时钟,现在只是设置模式,还没开始spi通信,所以付个低电平DR数据是否准备好,现在没有什么可准备的。AD, CD也是一样,等到spi通信的时候才需关系。这里做个引子 吧。void nRF905lnit(void)CSN=1;/ Spi disableSCK=0;/ Spi clock line init lowDR=0;/ Init DR for inputAM=0;/ Init AM for inputCD=0;/ Init CD for inputPWR=1;/ nRF905 power onTRX_CE=0;/ Set nRF905 in standby modeTXEN=0;/ set radio in Rx modeNrf905寄存器的配置配置905寄存器的意思是,通过 spi传输一个值,放入 905的寄 存器中,这个值可以让905传输数据时,产生各种你想要的效果,类似于你用手调节耳机音量,你的手就相当于配置耳机的寄存器。那么我先给出主要需配置的寄存器然后再解释如下面这个程序段:unsigned char idata RFConf11=0x00,/配置命令/0x4c,CH_NO,配置频段在 430MHZ0x0c,/输出功率为10db,不重发,节电为正常模式0x44,/地址宽度设置,为 4字节0x04,0x04,/接收发送有效数据长度为32字节0xCC,0xCC,0xCC,0xCC, / 接收地址0x58, /CRC 充许,8位CRC校验,外部时钟信号不使能,16M晶振;0x00, /配置命令/后面的讲解中会说,所以大家从第二个开 始看。CH_NO的意思如下,通过以下解释设置不同的值,可以让 905工作在不同频段,这个需 要的话再做详解,不需要,可以照搬默认值,或者程序。CH_NO9禾口 HFREQ_PLL 起进 行平率设置(默认值二 001101100b = 108d). fRF =(422.4 + CH_NOd /10)*(1+HFREQ_PLLd) MHz于是乎相关的就引出以下这个寄存器HFREQ_ PLL1使PLL工作于433或 868/915 MHz 模式(默 认值=0).0-工作于433MHz频 段1-工作于 868 or 915MHz频段在这里给出个表格,如需更改该值可以参照:工作频率HFREQ PLLCH NO430.0 MHz0001001100433.1 MHz0001101011433.2 MHz0001101100434.7 MHz0001111011862.0 MHz1001010110868.2 MHz1001110101868.4 MHz1001110110869.8 MHz1001111101902.2 MHz1100011111902.4 MHz1100100000927.8 MHz1110011111OxOc, /输出功率为10db,不重发,节电为正常模式这里做下说明:我们拆分看看这段话。砂出功率为10db不重发砂电为正常模式输出功率为10db,这个对于的寄存器是:如下表,二进制 10db应该是11PA_PWR2输出功率(默认值二00).00” 10dBm0T 2dBm 10”+6dBmA A11+10dBm不重发,针对的寄存器是:不管怎么说,部分都不自动重发(一般情况),故 二进制是0AUTO_ RETRAN1如果 TRX_CE 禾口 TXEN 为咼时,自动重发(默认 值二 0).0-不重发1-数据包 重发节电为正常模式,针对的寄存器是:如下表,要是正常模式则二进制是0RX_RED_ PWR1接收方式节能,工作电流1.6mA.灵敏度降低(默认 值二 0).0-正常工作1-节能 模式那么如下结论:输出功率为10db11不重发0节电为正常模式0按顺序写则是:1100-0000 11000x0C0x44,/地址宽度设置,为 4字节如下面两个表:收地址宽度:4字节的2进制是100RX_AFW3接收地址宽度 (默认值=100).001 -1 byteRX地址100 -4 byteRX地址发地址宽度:4字节的2进制是100TX_AFW3发送地址宽度(default = 100).001 -1 byteTX地址100 -4 byteTX地址于是乎:100并上100, 可认为是0100并上0100,可认为是 4并上4,则 可认为是0x44.0x04,0x04,/接收发送有效数据长度为32字节这条命令是我擅自更改的,更改前是2字节,如是0x04这是32字节。这样可以使 905在一个数据包内传输更多信息。那么我给出两个寄存器。RX_PW6接收数据宽度(默认=100000).000001 -1 byte接收数据宽度000010 -2byte接收数据 宽度100000 -32 byte接收数据 宽度TX_PW6发送数据宽度(默认= 100000).000001 -1 byte 发送数据宽度000010 -2 byte发送数据 宽度100000 -32 byte发送数据 宽度这里要把码补全,10 0000 0010 0000 0x40这里实际是0x40 点没错但是程序中写的是0x04,仔细想想,也没什么特别的问题。这里我水平有限,不做说明了。0xCC,0xCC,0xCC,0xCC, / 接收地址一看就知道,地址被从新改了下,默认地址是E7这种RX_ADDRESS32发送地址标识,使用字 节取决于RX_AFW (默 认值二 E7E7E7E7h).0x58, /CRC充许,8位CRC校验,外部时钟信号不使能,16M晶振CRC_EN1CRC校验可用 (默认值=1).O-不可用1-可用CRC_ MODE1CRC模式选择 端(默认值二1).0 -8 位1-16位UP_CLK_ EN1输出时钟可用(默认值 =1)0-外面没有可用的时 钟信号1-外面有可用的时钟 信号XOF3晶振频率端,必须与外部 的晶振频率相对应(默认 值二 100).000 -4MHZ 001-8MHz 010 -12MHz011 -16MHz 100-20MHz这块看着有点乱的话,请继续往后看。我们既然把相关寄存器的配置解释了一边,但是如果对于一个编 程序的人,或者程序开发来说,这样的罗列虽然我们能弄懂每个寄 存器是咋回事,但是 实际编程并自己配置寄存器的话,难度是很大 的。幸好,开发手册解决一切问题,下面是一个表,表的后面我有 解释。寄存器内容射频器配置寄存器(R/W字节位内容7:0,最咼有效 位初始值0CH NO7:00110 11001bit7:6 not used, AUTO_RETRAN, RX RED PWR,0000_0000PA_PWR1:0, HFREQ_PLL, CH_N082bit7notused,TX_AFW2:0 , bit3 not used, RX AFW2:00100_01003bit7:6 not used, RX PW5:00010_00004bit7:6 not used, TX PW5:00010_00005RX_ADDRESS (device ide ntity) byte 0E76RX_ADDRESS (device ide ntity) byte 1E77RX_ADDRESS (device ide ntity) byte 2E78RX_ADDRESS (device ide ntity) byte 3E79CRC_MODE,CRC_EN, XOF2:0, UP_CLK_EN, UP CLK FREQ1:01110_0111解释:这是手册中的一张表,假设寄存器的配置值是如图给的这 些。那么他的传输是从 0字节开始到9字节截止,按顺序把16进制 码传进去,你的工作就完成了。而你需要对那个寄存器进行微小的改动,只需找到手册相关寄存 器的说明进行改动就可以了。我们从上表中摘出一个小表看,小表 如下:bit7notused,TX_AFW2:0 , bit3 not used, RX AFW2:00100_0100bit7就是该值得第七位,第七位没用上。TX AFV【2:0】意思是有三位被这个寄存器用了通过这种字节的划分,将寄存器的配置变成了传多个2位十六进制数,使得寄存器的配置变得博大精深,新手上手困难。不过对于驱动其他芯片也一样,配置寄存器就是这样配置的。像 是某些器件如saa7113等芯片,配置寄存器时,前面还有地址,弄 得更加复杂。所以大家要通过学习 nrf905 了解芯片的驱动方法这才是关键。spi通信:如何实现spi通信,在这个问题上,如果说正常学习应该是,先知晓spi的协议,spi的时序,spi写和读的时序和协议。但是如果将其看成程序的话就比较方便。咱们用程序谈这件事情。该程序段式spi的写程序:从 MOSI=(bit)(b & 0x80); 我们分析下。假设 b=abcdefgh那b & 0x80 就是abcdefgh&10000000 可以想象a被提取了出来。至于bit,其实可以没有,这里可以参考c51语言关于与有两个做法,一个是&,另一个是&,即位与和整个值得与。之后我们观察sck的变化,sck是spi的时钟,我们发现从 0到1然 后回到0,这是sck的变化。在sck变到1之前,mosi已经有了一个值, 那么当sck=1 ;的时候,也就是所谓的上升沿,mosi被写入,这里可以认为是写入905的内部了。b=1;这个语句等同于b=b1 ;意思是b左移一位的新值付给 b, 比如b=abcdefgh 左移一位,那么 b=bcdefgh0,再左移一位,那么 b=cdefgh00,以此类推左移8次之后b=00000000.因为每移出一位,就代表着移进一位,移进的是0。那么观察一下 0x80 1000 0000这个数1000 0000 与上abcdefgh 之后会提取出 a左移之后,再次进行与运算,就会提取出b,循环往复abcdefgh就都提取出来了。并在每一次都把这个值付给了mosi。我想通过梳理,大家应该能看懂了,至于spi的通信协议,大家可以参考下网上资料,我想看懂了程序,再看看资料应该能彻底明白了。void SpiWrite(uchar b)uchar i=8;while(i-)Delay(10);SCK=O;MOSI=(bit)(b & 0x80);b=1;Delay(10);SCK=1;Delay(10);SCK=0;读Spi程序段:_nop_();_nop_();是延时,延时是一个指令周期的时间。说白了,就 是延时一段时间。uchar ddata=0;这条语句意味着 ddata是完全为0的。且注意一个事 情ddata的定义是uchar,那么他的值最大能到 0xff。ddata|=MISO;等同于 ddata=ddata|miso; miso 是一个引脚的电 平。经过这条语句后 ddata的最低位就是 miso当时的电平了,这时左 移再次提取新的miso电平,当八个电平都提取之后,ddata的值就提取完成了。同样sck是spi时钟,想提取下一个 miso的值必须让时钟波动一次。uchar SpiRead(void)uchar i=8;uchar ddata=0;while(i-)ddata=1;SCK=0;_nop_();_nop_();ddata|=MISO;SCK=1;_nop_();_nop_();SCK=0;return ddata;到此为止,905的基本问题讲完了。那么我们把它串联在一起。我们先宏观的看下。以发送流程为例905现处于待机spi编程状态向905中传送寄存器值成功发将905的状态设置为发送状态出-待机状态如果想再发个数据,那么他的流程将变成将905的状态设置为发送状态 成功发出待机状态由此看来对同一个对象进行发送,如果大家的设置都没改的话,寄存 器的值只需设置一次。剩下的就是重复发送到待机这个环节了。那么在之前的问题,大家都了解了,剩下的就是到把数据发 送这一块了。这里我分为三个部分说这件事情。向905传输一个命令向905装入待发送的数据、把数据发出去向905传输命令:这里定义了这些命令,先在语法上说下#define WC 0x00的意思等价于 wc=0x00 ;那么我们先解释下这几个命令,大家理解下。#define WC0x00#define RC0x10#define WTP0x20#defi ne RTP0x21#defi ne WTA0x22#defi ne RTA0x23#defi ne RRP0x24如下是wc的解释:在讲解配置寄存器是有个值我没有讲解先在我告诉大家指令名称指令格式操作W_CONFIG (WC)0000 AAAA写配置寄存器AAAA指 明哪个字节。写操作从哪个字节开始 取决于地址AAAAunsigned char idata RFConf11=0x00,/配置命令/ooooooooooooooooooooooooooooooooooooooo0x00, / 配置命令/这就意味着wc=0x00,意思就是从0字节开始进行写操作。举个例子看下,0字节代表的是哪个寄存器,寄存器内容射频器配置寄存器(R/W字节位内容7:0,最咼有效 位初始值0CH NO7:00110 1100写之后的操作就是开始写 1字节,这点上没什么问题最后写到第九字节。前面有这个 表的完整版,大家可以翻着看#define RC0x10的解释如下:这个看表就知道不做解释了跟wc意思差不多。R_CONFIG(RC)0001 AAAA读配置寄存器AAAA指 明哪个字节。读操作从哪个字节开始 取决于地址AAAA后几个命令都好理解我就都列出来大家自己吸收下:W_TX_ PAYLOAD (WTP)0010 0000丐仃效文射负荷:1 32字节。写操示从字 节0开始R_TX_PAYLOAD (RTP)0010 0001谀仃效发射负荷:1-32字节谀操作从字 节0开始W _TX_ADDRESS (WTA)0010 0010写发:射地址;14字节、写操作从字节0开 始R_TX_ ADDRESS (RTA)00100011逑发肘地址:14字节。遼操作从字节0开 始R_RX_PAYLOAD (RRP)0010 0100读有效接收负荷:1-32字节。读操作从字 阮丿始1那么到此,命令部分就说完了,能用的就这几个命令向905装入待发送数据:向905装入数据这件事情和刚才的命令结合着说。先看以下程 序段:SpiWrite(WTP);/ Write payload comma ndfor (i=0;i4;i+)SpiWrite(TxRxBufi); / Write 32 bytes Tx data先传了 wtp命令,之后把txrxbuf数组中的前4字节传了进去。 那么执行外这条之后,数据就被传到905中了(还没有进行发送)。观察此函数,发现调用了 spiwrite这个函数,说明装入命 令和装入数据都是通过 spi通信进行传输的。观察以下程序段:SpiWrite(WTA);/ Write address comma ndfor (i=0;i4;i+)II Write 4 bytes addressSpiWrite(TxAddressi);TxAddressi和SpiWrite(WTA);是其中的要素,wta是写地址命 令,那么TxAddressi就是地址咯,地址前面说过了,程序中 除了那个config数组中有地址的说法,另外在程序段中被单独 列出的地方是 code TxAddress4=0xcc,0xcc,0xcc,0xcc;那么通过这个程序段,功能就是把地址写进去。以上的两个程序段完成了数据和地址的写入,这时只要设置成发送状态,数据就可以被发出了。那么从现在开始是重点部分,就是以上两段程序的组合,并加以延伸。仔细看下面这段程序,主要关注红字部分。程序之后有我的相关解释。void TxPacket(uchar *TxRxBuf)uchar i;/Con fig905();CSN=0;/ Write payload comma ndSpiWrite(WTP);for (i=0;i4;i+)SpiWrite(TxRxBufi); / Write 32 bytes Tx data/ Spi en able for write a spi comma ndCSN=1;Delay(1);CSN=0; comma ndSpiWrite(WTA);for (i=0;i4;i+)/ Spi disable/ Spi enable for write a/ Write address comma nd/ Write 4 bytes addressspiSpiWrite(TxAddressi);CSN=1;/ Spi disableTRX_CE=1;/ Set TRX_CE high,start Tx datatran smissi on/ while (DR!=1);/ Set TRX_CE lowDelay(1);TRX_CE=0;上面这段程序,如果被ma in调用了之后,出现的效果是将txrxbuf数组中的数无线传输出去。也就是说这段程序看懂了, 905就能发数了。我们看下,这个程序有两个大段的红色字体和 两个小段。大段的红色字体前面已经做过解释,小段的红色字体解释为。在开头的几页提到过这个函数: void SetTxMode(void) 其中有两个 引脚的电平为:TRX_CE=0;TXEN=(PWR_U默认高电平),且开头我 给我一个表格,那么我把它再拿出来说下。PWR UPTRX CETX EN操作模式0XX断电和SPI编程10X待机和SPI 编程110射频接收模 式111射频发送模 式如此图发射模式,TRX_CE和TX_EN全为1是发送状态但是在 void SetTxMode(void) 中TRX_CE=0所以他不属于发送也不 属于接收状态,但只要 TRX_CE=1也就是全为1,那么就实 现了发送状态,数据就被发送了。而在程序void TxPacket(uchar *TxRxBuf) 就是上面那段大程序,中恰好两个小 段红字阐明。所以小红字加上void SetTxMode(void)的完整功 能就是将905从准备发射到发射的流程。至于在大段程序中 CSN的值,注释中已经写了 spi是否有效的 管脚。所以理解起来很容易,我就不解释了。综上所述,如果把我上面所讲的所有东西全融合在一起,那么就是响当当的905发送数据的程序了。而对于905接收程序而言也是一样,先要有相关命令,相关地 址,并且用spi总线传输相关命令,并且用 spi读取接收到的数 据。这里我就不在多说什么了,因为跟发送的区别不大,下面我给出程序:这个函数不像刚才的那个函数含有状态的设置,我后面会说的。 那么程序的其他部分自己琢磨下。void RxPacket(void)uchar i;Delay(1);/ TRX_CE=0;/ Set nRF905 in standby modeDelay(100);/ Spi enable for write a spiTRX_CE=0;CSN=0;comma ndDelay(1);SpiWrite(RRP);for (i = 0 ;i 4 ;i+)TxRxBufi=SpiRead();/ Read data and save tobufferCSN=1;Delay(10);TRX_CE=1;那么这样就完成了发送和接收, 但是我们目前面临着一个很有意 义的问题,比如我现在发了一个数据, 那么无线电波在空气中传 播的速度是光速,我们可以认为对面的905瞬间得到了一个值, 于是我们就将它读取。但是当我们发送数据时,对面的905正由于mcu正在干别的事, 或者用更通俗的话说,不是任何时候都能用接收函数接到数据,只有当数据被发送且传到另一个905上,另一个905接收到了,这时我们读接收到的数据才能读出来。幸好存在一个功能,当接收到数据后,905的DR会产生电平变化。所以当dr产生变化的时候我们就开始提取数据,其他时候 我们可以干别的。所以就有以下这个函数:void RX(void)SetRxMode();/ Set nRF905 in Rx modewhile (CheckDR()=0);Delay(10);RxPacket();我们看见三个子函数在其中,有两个我已经说过了,但是我还想再说一下,首先你想让905接收数据,那么必须先让其处于接收状态。当接收到数据,那么dr会变化,当确实变化了我们才执行RxPacket();这个函数提取数据。这个与发送函数的一个很大的区别在与状态设置,发送状态是一个很果断的状态,就像你想什么时候说话都可以,别人是否能听得见都可以说话。但是接收状态就像你的耳朵一样, 你不知道何时对方会说话, 那 么你就必须长期处于接收状态,否则你就听不到说话,除非你知 道他什么时候会说话,听不到说话的含义就是数据丢失。长期处于接收状态,并不是说单片机不能干别的事, 而是说905 不能干别的事。原因是单片机可以用中断的方式得到 DR引脚的 变化。而这里为了程序的简单,我们直接用while等待也没什么问题,特此注明。如有中断需要,请自己改动。那么如何使用这些函数,也就是宏观上程序如何控制905的,我们看下主函数:void mai n(void)n RF905I nit();Co nfig905();while(1)if(KE YO =O)TxRxBufO=Ox11;if(KE YO =1)TxRxBuf0=0x22;if(KE Y1 =O)TxRxBuf1=Ox11;if(KE Y1 =1)TxRxBuf1=0x22;SetTxMode(); Set nRF905 in Tx modeTxPacket(TxRxBuf);/ Send data by nRF905前面的两个红字子函数是 905的初始化和寄存器配置。而在while内部有两个红字子函数,这两个函数就实现了数据的发送。而while中的if语句中key是按键,当key的按下与不按 都会使TXRXBUF数组的前两个字节产生一组值,这里你可以认为咱们向TXRXBUF中写入了数据。那么这样,并在外面加了 while语句就实现了循环发送按键值的 功能。那么我们再看下接收端的主函数是什么样子。接收部分只有三个子函数,且我都讲过了相关功能,这里就不赘述了。void mai n(void)n RF905I nit();Con fig905();while(1)RX();if(TxRxBuf0=0x22) in 1=1;i n2=1;if(TxRxBuf0=0x33) in 1=1;i n2=0;if(TxRxBuf1=0x22)i n3=1;i n4=1;if(TxRxBuf1=0x33)i n3=1;i n4=0;上面所讲的一切就能实现905的收发了,那我把示例给大家。其中子函数在收发程序中都是编写的一模一样所以我就给出一份接收函数,如想得到接收函数,把刚才讲的发送主函数粘上就成了。#in elude #i nclude #i nclude vintrin s.h#in elude /#defi ne uint un sig ned int #defi ne uchar un sig ned char /#defi ne BYTE._BIT00x01#defi ne BYTE._BIT10x02#defi ne BYTE._BIT20x04#defi ne BYTE._BIT30x08#defi ne BYTE._BIT40x10#defi ne BYTE._BIT50x20#defi ne BYTE._BIT60x40#defi ne BYTEBIT70x80/bdata un sig ned char DATA_BUF;#defi ne DATA7#defi ne DATA0(DATA_BUF&BY TE_BIT7) != 0)(DATA_BUF&BY TE_BIT0) != 0)sbit flag=DATA_BUFA7;sbit flagl =DATA_BUF八0;/缓 冲 区-发 送 数 据#defi ne TxRxBuf_Le n 4un sig ned char TxRxBufTxRxBuf_Le n= 0x29,0x30,0x31,0x32,;/NRF905控IOsbitTXEN=PM0;sbitTRX_CE=P3A2;sbitPWR=P1A1;/NRF905SPI接口sbitMISO=P1A6;sbit M0SI=P1八5;sbit SCK=P1八7;sbit CSN=P1A3;/n rf905状态标志sbitAM=PM4;sbit DR=P3A3;sbit CD=P1A2;/sbitin 4=P3A4;sbitin 3=P3A5;sbitin 2=P3A6;sbitin仁 P3A7;/nrf905#defi ne WC0x00#defi ne RC0x10#defi ne WTP0x20#defi ne RTP0x21#defi ne WTA0x22#defi ne RTA0x23#defi ne RRP0x24/-NRF905寄存un sig ned char idata RFCon f11=0x00,0x4c,430MHZ0x0c,重发,节电为正常模式0x44,/配置命令/CH_NO,配置频段在/输出功率为10db,不/地址宽度设置,为 4字节/接收发送有效数据0x04,0x04,长度为32字节0xCC,0xCC,0xCC,0xCC,/ 接收地址0x58,/CRC 充许,8 位 CRC校验,外部时钟信号不使能,16M晶振;code TxAddress4=0xcc,0xcc,0xcc,0xcc;char tf;/ static void Delay(uchar n) uint i;while(n-)for(i=0;i80;i+); /SPIun sig ned char SpiRead(void)un sig ned char j;for (j=0;j8;j+)DATA_BUF=DATA_BUF1;SCK=1;if (MISO) /读取最高位,保存至最末尾,通过左移位完成 整个字节DATA_BUF|=B YTE_BIT0;elseDATA_BUF&二BY TE_BIT0;SCK=0;return DATA_BUF;/ -SPIvoid SpiWrite( un sig ned char send)un sig ned char i;DATA_BUF=se nd;for (i=0;i8;i+)if (DATA7)/总是发送最高位M0SI=1;elseMOSI=0;SCK=1;DATA_BUF=DATA_BUF1;SCK=0; /nRF905 void n RF905I ni t(void)CSN=1;/ SpidisableSCK=0;/ Spi clock line init lowDR=0;/ Init DR for in putAM=0;/Init AM for in putCD=0;/Init CD for in putPWR=1;/ nRF905 power onTRX_CE=0;/ Set nRF905 in sta ndby modeTXEN=0;/ set radio in Rx mode-初始化寄存/器void Co nfig905(void) uchar i;/ Spi enable for write a spiCSN=0;comma nd/SpiWrite(WC);/ Write config comma nd 写放配置命令for (i=0;i11;i+)/ Write configration words写放配置字SpiWrite(RFCo nfi);CSN=1;/ Disable Spi/发 送 数 据 打 包void TxPacket(uchar *TxRxBuf)uchar i;/Con fig905();CSN=0;SpiWrite(WTP);/ Write payload comma ndfor (i=0;i4;i+)SpiWrite(TxRxBufi);/ Write 32 bytes Tx data/ Spi en able for write a spi comma ndCSN=1;Delay(1);CSN=0; comma ndSpiWrite(WTA);for (i=0;i=650us)/-设置发送void SetRxMode(void)TXEN=0;TRX_CE=1;Delay(1);/ delaycha nge(=650us)/- 判 断 数 据 接unsigned char CheckDR(void)/检查是否有新数据传入Data Readyif (DR=1 &TRX_CE=1 & TXEN=O)/ Delay(50) ;return 1;elsereturn 0;/读 NRF905接 收 数void RxPacket(void) uchar i;/ Set nRF905 in sta ndby modeDelay(1);/ TRX_CE=0;Delay(100);CSN=0;TRX_CE=0;/ Spi enable for write a spicomma ndDelay(1);SpiWrite(RRP);for (i = 0 ;i 4 ;i+)TxRxBufi=SpiRead();/ Read data and save tobufferCSN=1;Delay(10);TRX_CE=1;/数据接收void RX(void)SetRxMode();/ Set nRF905 in Rx modewhile (CheckDR()=0);Delay(10);RxPacket();/ void mai n(void)n RF905I nit();Co nfig905();while(1)RX();if(TxRxBuf0=0x22) in 1=1;i n2=1;if(TxRxBuf0=0x33) in 1=1;i n2=0;if(TxRxBuf1=0x22)i n3=1;i n4=1;if(TxRxBuf1=0x33)i n3=1;i n4=0;硬件的连接方法:对于芯片来说电平是有很多种的有5V也有3.3V也有别的比如2.85V。对于单片机来说,单片机电平有5V的也有3.3V的。如果是3.3V 的单片机那么就可以直接与 NRf905模块相连接了。如果是 5V 的单片机一般我采用两种方式解决这个问题:我们知道905是可以接受3,3V电平的,那么我们可以用在 5V 单片机io串联电阻接在905io的方式使得实现安全通信。我们也可以在单片机容许范围内降低单片机供电电压比如用3.3V给单片机供电。比如 STC89C52RC 单片机,在进行下载 程序时候,如果用3,3V供电则会造成下载中断或者不稳定的下 载。而3.3V此单片机可以稳定工作,这在STC手册上有据可查, 所以我们可以用降低供电电压的方式实现单片机io直接与905相连。通常我在调试 FPGA时候也是采用直接用 FPGA板上给 的3.3V电源进行调试,明显要比在单片机10焊接电阻,然后再 接FPGA简单,更利于调试。最有教育意义905连接方式:我们经常连接一些模拟器件,但是我们不能用芯片直接接电机, 不能用芯片接电灯,我们虽然见到单片机可以接LED,但这也是小功率led。如果是FPGA,可能容许这种灌电流的值更为严 谨了,所以从通用性上说单片机接灯是不太好的。同样5V直接跟3.3V连接也是不好的,假设你用的是一款电平 为2.85V的FPGA想控制L298电机芯片,结果逻辑电平最少也 要4.5V,于是乎你就会陷入尴尬。于是很多人想到光耦,但仔 细想来还是很尴尬。所以说,能在不同电压中灵活实现通信很有意义, 单纯的串接电 阻,降低电压只能是土办法,应该用电平转换芯片,像是MAX232 这种芯片。那么5V和3.3V电平转换芯片其实是很多的。那么我推荐一款芯片,74LVX4245.此芯片10较少应用简单,美 中不足是个贴片的,不过相信大家在得到此款芯片的帮助下, 能 让大家的设计更为合理。串接电阻的905图:U2VCCX2RST%EA31PSEN29Al FXTALI3TAL2P0 (VADO PO 3/AD I P0.2/AD2 P0.J/AD3PQ 4/AD4PO 5/ADP0.6/ADSPO 7/AD739 PAO g FA1 幻FA2 号 6 FA3PA4FA5 KuDR TRX CFPD2Ito+3.3V NRF905R$TEA/VPP PSENALEPlO/RxD P3.1iTxD P3.2IFiTJ P3.3/INTIP3 4/T0P3.5/T1P3.6/WRP3.7/RD*PDO roT roT丽TO5Pl.cm pi.irr2ExP3.2Pl.3Pl.4Pl.5Pl.Pl.7pgrFB21PBTPB4弋FB7_TRH_CF NCAM MTSO_SCK GND1234567Z91011121314HeadersupVSSP2.0/A3P2.1/ASIP2.2/A10P2.3/AHP2.4/A12P2.5/A13P2.6/A14P2.7/A15FCOfcTrrcTfTTPcPC6rasTcP80C51SFPNTX巨陰 PWR UP CDCSN AMMOS1TX ENCDURMOSI CSNGND如上图是905的接线图,这个图是完全正确的,大家可以放心。这里要说的是:+ 3 3VNRFP05匚1irTX ENtrxTT1口jiTxVJFCpNCJcdAsr工oT規DrMISOainMOSIS( K?JU11 “CSNG5DE 1Idi tti jGND如上图3.3V电压如何得到,这里比较常用的是 AMS1117系列 的3.3V稳压器,该稳压器可以从大于 4V的电压稳定得到3.3V,可以将小于20V的电压稳压到3.3V,大于20V,稳压器将处于 闭锁(就是不工作的意思)。那么此类稳压器的封装为:这是贴片的封装,具体可以自己查阅资料得知。稳压器是很有用的东西可以搭建稳压电路和恒流源可以实现各 类功能,也可以做小功率变压器,我曾经拆过变压器,除了线圈和整流桥和电容就剩他了,所以稳压器是很好的东西。那么ams1117稳压器的实验接法是:+5VINOUTGNDOUT+ RE&曲朋lOOpF该图引脚标号与上图pcb封装引脚标号一一对应。图中两个电容的大小具体可按0.3u和0.1u,不过一般情况就接两个小电容 就可以,甚至不接也可以(不推荐)。希望大家像牛蛙样学习,虽然我不知道牛蛙是怎么学习的
展开阅读全文
相关资源
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 成人自考


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!