




已阅读5页,还剩46页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
NRF905 程序参考教程。本资料主要是将程序中各部分子程序的功能与 NRF905 的手册相关联,使得各位同仁在每个子程序为什么这么写都在手册中找到具体的体现,特别是寄存器配置。内涵完整参考程序,是 100%可用程序。硬件的连接方法在参考程序之后,并介绍原理。本人最后只是为了提供给大家一个入门的资料或是引子罢了,至于如何应用的巧妙那是后期编程巧妙的结果,目前只是给刚进门的人士一个可以快速理解和掌握的浅显易懂的教程罢了。本人疏忽之处还请见谅。按照惯例先展示作品抛砖引玉:四路 AD 采集+温度采集彩屏显示信息数据 GSM 手机电话最近做的,音频功放四路电机控制大功率 led 控制,不解释。以前做的,舵机和摄像头,不解释。更早先的,VGA 显示,不解释。已发送为例子。1.通过 spi 接口把寄存器相应的值写到 905 中2.把要发的数据写到 905 中3.把状态设置成发送4.数据被发出那么操作 905 就主要是前三步的问题,那么请带个这前三个问题深入理解下面的相关解释了。无线通信模块的三个要素:Nrf905 模式的配置Nrf905 通过寄存器配置Nrf905 需要 spi 通信配置寄存器先看模式配置:程序加解释PWR_UP TRX_CE TX_EN 操作模式 0 X X 断电和SPI编程 1 0 X 待机和SPI编程 1 1 0 射频接收模式 1 1 1 射频发送模式 根据这个图表,我们发觉有四种模式。捡重点的说实现收发功能有两种模式。这两种模式在程序段中的实现是:设置成接受模式,程序中没写 PWR_UP,如果他是低电平就变成断电,所以个程序段默认 PWR_UP 为高电平。void SetRxMode(void)TXEN=0;TRX_CE=1;Delay(1); / delay for mode 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=0;TXEN=0;这三个,在待机 spi 模式中 TXEN=x;即可以为任何值。说明现在是待机且 spi 编程模式。程序段中其他引脚功能罗列下:Csn:spi 的有效与否的引脚,低电平有效。如果只是单纯的设置模式,该引脚并没用处,只是后期程序的编写,所以做下配置。Sck:spi 的时钟,现在只是设置模式,还没开始 spi 通信,所以付个低电平。DR:数据是否准备好,现在没有什么可准备的。AD,CD 也是一样,等到 spi 通信的时候才需关系。这里做个引子吧。void nRF905Init(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_NO 9 和 HFREQ_PLL 一起进行平率设置 (默认值= 001101100b = 108d). fRF = ( 422.4 + CH_NOd /10)*(1+HFREQ_PLLd) MHz 于是乎相关的就引出以下这个寄存器HFREQ_ PLL 1 使 PLL工作于 433 或 868/915 MHz 模式 (默认值 = 0). 0 工作于 433MHz 频段 1 工作于 868 or 915 MHz频段 在这里给出个表格,如需更改该值可以参照:工作频率 HFREQ_PLL CH_NO 430.0 MHz 0 001001100 433.1 MHz 0 001101011 433.2 MHz 0 001101100 434.7 MHz 0 001111011 862.0 MHz 1 001010110 868.2 MHz 1 001110101 868.4 MHz 1 001110110 869.8 MHz 1 001111101 902.2 MHz 1 100011111 902.4 MHz 1 100100000 927.8 MHz 1 110011111 0x0c, /输出功率为 10db,不重发,节电为正常模式这里做下说明:我们拆分看看这段话。输出功率为 10db不重发节电为正常模式输出功率为 10db,这个对于的寄存器是:如下表,二进制 10db 应该是 11PA_PWR 2 输出功率(默认值 = 00). “00”10dBm “01”2dBm “10”+6dBm “11” +10dBm 不重发,针对的寄存器是:不管怎么说,部分都不自动重发(一般情况) ,故 二进制是 0AUTO_ RETRAN 1 如果TRX_CE 和 TXEN为高时,自动重发 (默认值 = 0). 0 不重发 1 数据包重发 节电为正常模式,针对的寄存器是:如下表,要是正常模式则二进制是 0RX_RED_ PWR 1 接收方式节能,工作电流1.6mA.灵敏度降低 (默认值 = 0). 0 正常工作 1 节能模式 那么如下结论:输出功率为 10db-11不重发-0节电为正常模式-0按顺序写则是:1100-0000 11000x0C0x44, /地址宽度设置,为 4 字节如下面两个表:收地址宽度:4 字节的 2 进制是 100RX_AFW 3 接收地址宽度 (默认值 = 100). 001 1 byte RX 地址 100 4 byte RX 地址 发地址宽度:4 字节的 2 进制是 100TX_AFW 3 发送地址宽度(default = 100) . 001 1 byte TX 地址 100 4 byte TX地址 于是乎:100 并上 100, 可认为是 0100 并上 0100,可认为是 4 并上 4,则可认为是 0x44.0x04,0x04, /接收发送有效数据长度为 32 字节这条命令是我擅自更改的,更改前是 2 字节,如是 0x04 这是 32字节。这样可以使 905 在一个数据包内传输更多信息。那么我给出两个寄存器。RX_PW 6 接收数据宽度(默认 = 100000).000001 1 byte 接收数据宽度 000010 2 byte 接收数据宽度 100000 32 byte 接收数据宽度 TX_PW 6 发送数据宽度(默认 = 100000).000001 1 byte 发送数据宽度 000010 2 byte 发送数据宽度. 100000 32 byte 发送数据宽度 这里要把码补全,10 00000010 00000x40 这里实际是 0x40 一点没错但是程序中写的是 0x04,仔细想想,也没什么特别的问题。这里我水平有限,不做说明了。0xCC,0xCC,0xCC,0xCC, /接收地址一看就知道,地址被从新改了下,默认地址是 E7 这种。RX_ ADDRESS 32 发送地址标识,使用字节取决于 RX_AFW (默认值 = E7E7E7E7h). 0x58, /CRC 充许,8 位 CRC 校验,外部时钟信号不使能,16M晶振CRC_EN 1 CRC 校验可用 (默认值 = 1). 0 不可用 1 可用 CRC_ MODE 1 CRC 模式选择端 (默认值 = 1).0 8 位 1 16 位 UP_CLK_ EN 1 输出时钟可用 (默认值 = 1) 0 外面没有可用的时钟信号 1 外面有可用的时钟信号 XOF 3 晶振频率端,必须与外部的晶振频率相对应(默认值 = 100). 000 4MHz 001 8MHz 010 12MHz 011 16MHz 100 20MHz 这块看着有点乱的话,请继续往后看。我们既然把相关寄存器的配置解释了一边,但是如果对于一个编程序的人,或者程序开发来说,这样的罗列虽然我们能弄懂每个寄存器是咋回事,但是实际编程并自己配置寄存器的话,难度是很大的。幸好,开发手册解决一切问题,下面是一个表,表的后面我有解释。寄存器内容 射频器配置寄存器(R/W) 字节 位内容7:0,最高有效 位7 初始值 0 CH_NO7:0 0110_1100 1 bit7:6 not used, AUTO_RETRAN, RX_RED_PWR, PA_PWR1:0, HFREQ_PLL, CH_NO8 0000_0000 2 bit7 not used, TX_AFW2:0 , bit3 not used, RX_AFW2:0 0100_0100 3 bit7:6 not used, RX_PW5:0 0010_0000 4 bit7:6 not used, TX_PW5:0 0010_0000 5 RX_ADDRESS (device identity) byte 0 E7 6 RX_ADDRESS (device identity) byte 1 E7 7 RX_ADDRESS (device identity) byte 2 E7 8 RX_ADDRESS (device identity) byte 3 E7 9 CRC_MODE,CRC_EN, XOF2:0, UP_CLK_EN, UP_CLK_FREQ1:0 1110_0111 解释:这是手册中的一张表,假设寄存器的配置值是如图给的这些。那么他的传输是从 0 字节开始到 9 字节截止,按顺序把 16 进制码传进去,你的工作就完成了。而你需要对那个寄存器进行微小的改动,只需找到手册相关寄存器的说明进行改动就可以了。我们从上表中摘出一个小表看,小表如下:bit7 not used, TX_AFW2:0 , bit3 not used, RX_AFW2:0 0100_0100 bit7就是该值得第七位,第七位没用上。TXAFW【2:0】意思是有三位被这个寄存器用了。等等。 。通过这种字节的划分,将寄存器的配置变成了传多个 2 位十六进制数,使得寄存器的配置变得博大精深,新手上手困难。不过对于驱动其他芯片也一样,配置寄存器就是这样配置的。像是某些器件如 saa7113 等芯片,配置寄存器时,前面还有地址,弄得更加复杂。所以大家要通过学习 nrf905 了解芯片的驱动方法这才是关键。spi 通信:如何实现 spi 通信,在这个问题上,如果说正常学习应该是,先知晓 spi 的协议,spi 的时序,spi 写和读的时序和协议。但是如果将其看成程序的话就比较方便。咱们用程序谈这件事情。该程序段式 spi 的写程序:从 MOSI=(bit)(b 我们分析下。假设 b=abcdefgh那 b 这个语句等同于 b=b1;意思是 b 左移一位的新值付给b,比如 b=abcdefgh 左移一位,那么 b=bcdefgh0,再左移一位,那么 b=cdefgh00,以此类推左移 8 次之后 b=00000000.因为每移出一位,就代表着移进一位,移进的是 0。那么观察一下 0x801000 0000 这个数 1000 0000 与上 abcdefgh 之后会提取出 a左移之后,再次进行与运算,就会提取出 b,循环往复 abcdefgh 就都提取出来了。并在每一次都把这个值付给了 mosi。我想通过梳理,大家应该能看懂了,至于 spi 的通信协议,大家可以参考下网上资料,我想看懂了程序,再看看资料应该能彻底明白了。void SpiWrite(uchar b)uchar i=8;while(i-)Delay(10);SCK=0;MOSI=(bit)(b 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 WC 0x00#define RC 0x10#define WTP 0x20#define RTP 0x21#define WTA 0x22#define RTA 0x23#define RRP 0x24如下是 wc 的解释:在讲解配置寄存器是有个值我没有讲解先在我告诉大家指令名称 指令格式 操作 W_CONFIG (WC) 0000 AAAA 写配置寄存器 AAAA 指明哪个字节 。 写操作从哪个字节开始取决于地址AAAA unsigned char idata RFConf11=0x00, /配置命令/。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。0x00, /配置命令/ 这就意味着 wc=0x00,意思就是从0 字节开始进行写操作。举个例子看下,0 字节代表的是哪个寄存器,寄存器内容 射频器配置寄存器(R/W) 字节 位内容7:0,最高有效 位7 初始值 0 CH_NO7:0 0110_1100 写之后的操作就是开始写 1 字节,这点上没什么问题最后写到第九字节。前面有这个 表的完整版,大家可以翻着看。#define RC 0x10 的解释如下:这个看表就知道不做解释了跟 wc 意思差不多。R_CONFIG (RC) 0001 AAAA 读配置寄存器 AAAA 指明哪个字节 。 读操作从哪个字节开始取决于地址AAAA 后几个命令都好理解我就都列出来大家自己吸收下:那么到此,命令部分就说完了,能用的就这几个命令。向 905 装入待发送数据:向 905 装入数据这件事情和刚才的命令结合着说。先看以下程序段:SpiWrite(WTP); / Write payload commandfor (i=0;i4;i+)SpiWrite(TxRxBufi); / Write 32 bytes Tx data先传了 wtp 命令,之后把 txrxbuf 数组中的前 4 字节传了进去。那么执行外这条之后,数据就被传到 905 中了(还没有进行发送) 。观察此函数,发现调用了 spiwrite 这个函数,说明装入命令和装入数据都是通过 spi 通信进行传输的。观察以下程序段:SpiWrite(WTA); / Write address commandfor (i=0;i4;i+) / Write 4 bytes addressSpiWrite(TxAddressi);TxAddressi和 SpiWrite(WTA); 是其中的要素,wta 是写地址命令,那么 TxAddressi就是地址咯,地址前面说过了,程序中除了那个 config 数组中有地址的说法,另外在程序段中被单独列出的地方是 code TxAddress4=0xcc,0xcc,0xcc,0xcc;那么通过这个程序段,功能就是把地址写进去。以上的两个程序段完成了数据和地址的写入,这时只要设置成发送状态,数据就可以被发出了。那么从现在开始是重点部分,就是以上两段程序的组合,并加以延伸。仔细看下面这段程序,主要关注红字部分。程序之后有我的相关解释。void TxPacket(uchar *TxRxBuf)uchar i;/Config905();CSN=0;SpiWrite(WTP); / Write payload commandfor (i=0;i4;i+)SpiWrite(TxRxBufi); / Write 32 bytes Tx data/ Spi enable for write a spi commandCSN=1;Delay(1); / Spi disableCSN=0; / Spi enable for write a spi commandSpiWrite(WTA); / Write address commandfor (i=0;i4;i+) / Write 4 bytes addressSpiWrite(TxAddressi);CSN=1; / Spi disableTRX_CE=1; / Set TRX_CE high,start Tx data transmissionDelay(1); / while (DR!=1);TRX_CE=0; / Set TRX_CE low上面这段程序,如果被 main 调用了之后,出现的效果是将txrxbuf 数组中的数无线传输出去。也就是说这段程序看懂了,905 就能发数了。我们看下,这个程序有两个大段的红色字体和两个小段。大段的红色字体前面已经做过解释,小段的红色字体解释为。在开头的几页提到过这个函数:void SetTxMode(void)其中有两个引脚的电平为:TRX_CE=0;TXEN=1;(PWR_UP 默认高电平) ,且开头我给我一个表格,那么我把它再拿出来说下。PWR_UP TRX_CE TX_EN 操作模式 0 X X 断电和SPI编程 1 0 X 待机和SPI编程 1 1 0 射频接收模式 1 1 1 射频发送模式 如此图发射模式,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 接收程序而言也是一样,先要有相关命令,相关地址,并且用 s
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 太平洋保险老来福幸福安康(2018年2月)
- 4.1光的直线传播 说课稿 2025年初中 人教版 物理八年级上册
- 2025年党员领导干部廉洁自律知识考试题库及答案(共260题)
- 运动会校长致辞
- 前厅月工作计划
- 《深度学习项目案例开发》课件-任务八:使用BERT预训练医学语言模型
- 《跨境电商》课件-5.速卖通平台发布产品
- 机械设备海运合同参考模板
- 人力资源管理绩效评估体系构建与实践操作要点
- 全国集中式光伏发电项目
- 医学专题血管麻痹综合征(刘德昭)
- SF∕T 0111-2021 法医临床检验规范
- 未筛分碎石施工方案
- 美国德克萨斯州驾驶考试模拟题及相关资料中英对照
- GB∕T 10836-2021 船用多功能焚烧炉
- 【告知牌】有限空间作业安全告知牌及警示标志
- 个人劳动仲裁申请书
- 特种设备现场安全监督检查记录(共1页)
- 福德正神真经
- 溢流堰稳定计算
- 宝钢的集中一贯管理体制考察
评论
0/150
提交评论