关于NRF24l01的调试_第1页
关于NRF24l01的调试_第2页
关于NRF24l01的调试_第3页
关于NRF24l01的调试_第4页
关于NRF24l01的调试_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、NRF24l01的调试过程与方法小结心得体会:最近老板给了几块nrf24l01模块我,初次上手难免走了许多的弯路,经过近一周的时间的不断调试,模块之间终于可以相互收发数据了。这样下来终于松了一口气。其间的各种辛苦与艰辛难于言表。上网大致看了一下,网上基于51的调试比较多,但是我们实验室用的是DSP2812,由于nrf24l01是SPI接口,2812上刚好有SPI的接口,这样貌似给使用带来了方便,但是51之类的芯片虽然没有SPI口,但是例程也最多,关于他的讨论比较多。最开始我的想法也比较混乱,想直接用SPI来调试,把底层函数稍微修改了一下,发现并没有结果,这个东西就像一个黑匣子一样,即看不见也摸

2、不着,后来我慢慢改变了思路。既然网上基于IO口模拟的SPI的例程最多,我决定另外走一条路,先用2812的IO口模拟SPI再用自带的SPI口去调试。这样一来我就有了两条可以走的路。第一条:底层SPI时序用IO口模拟去写。第二条:底层直接用2812的SPI去操作。虽然这样一来,路好走了一点,有各类的程序可以参考,但是这样带来最大的一个问题,这也是后来我才发现的,nrf24l01的最大读写速率是有限制的,2812在150M运行时很显然是太大了一点,由于nrf24l01对时序的要求很高,端口的读写速率和时序都有严格的要求,所以我们才看到,在网上一般是15M左右的单片机来模拟IO口,没有谁用150M的D

3、SP来模拟IO口的,当然既然确定了这样的方法后来也发现了问题,我还是继续走下去了。很重要的一点是系统的时钟频率。当然时序的要求也很高,这也就是为什么,网上说这个模块不好调试的原因,既然是调试,当然我们既然是调试,肯定有一个思路和方法。那么方法是什么呢? 开始的时候我是一股脑将发送和接收的程序都写进去,然后啥现象也没有,然后就傻眼了。在网上看了看,于是有了一点思路。方法是将发送和接收的调试分开来调试,以读取nrf24l01内部的寄存器为手段,先调试发送方,发送方调试没有问题以后,让发送方不断的发送数据,然后再来调试接收方,直到接收方也没有问题,再接着望下面去做。秉着这样的一个想法,我开始了调试。

4、这里我只对一对一的调试进行说明,后续的一对多,以及调频之类虽然我有了想法,但是还没有开始实施。在开始调试之前建议将NRF24l01说明书读个三遍。模块的外部端口XL24LD01 是采用挪威 N O R D I C 公司的 n r f 2 4 L 0 1 2.4G 无线收发 IC 设计的一款高性能 2.4G无线收发模块,采用 GFSK 调制,工作在 24002483M 的国际通用 ISM 频段,最高调制速率可达 2MBPS。 XL24L01-D01 集成了所有与 RF 协议相关的高速信号处理部分,如:自动重发丢失数据包和自动产生应答信号等, 模块的 SPI 接口可以利用单片机的硬件 SPI 口连

5、接或用单片机的 I/O 口进行模拟,内部有 FIFO 可以与各种高低速微处理器接口,便于使用低成本单片机。在连线的时候要特别注意电源线不要弄反过来了,要注意电源的最大值不能超过3.6V,这个电压直接影响了模块的端口的输出电压值,由于我们的DSP端口的高电平在3.3V,一般将电压设置在这个附近左右。只有在硬件没有问题的基础上才能开始调试软件,否者会出现很多的问题。还有一个,工作模式的问题,要注意在待机和掉电的模式下才能够进行寄存器的写操作。模块内部的寄存器在调试中对寄存器的读取操作是一个非常有效的验证方法。对芯片资料中给出的23个寄存器内容请看手册。对应的寄存器在头文件里面。用IO口模拟SPI的

6、方法头文件如下:#ifndef _NRF24L01_H_#define _NRF24L01_H_#define CPU_RATE 6.667L / for a 150MHz CPU clock speed (SYSCLKOUT)/ DO NOT MODIFY THIS LINE.#define DELAY_US(A) DSP28x_usDelay(long double) A * 1000.0L) / (long double)CPU_RATE) - 9.0L) / 5.0L)/这个函数是在150M下的us级延时函数/*/#define TX_ADDR_WITDH 5/发送地址宽度设置为5个字

7、节#define RX_ADDR_WITDH 5/接收地址宽度设置为5个字节#define TX_DATA_WITDH 1/发送数据宽度1个字节#define RX_DATA_WITDH 1/接收数据宽度1个字节/*命令寄存器*/#define R_REGISTER 0x00/读取配置寄存器#define W_REGISTER 0x20/写配置寄存器#define R_RX_PAYLOAD 0x61/读取RX有效数据#define W_TX_PAYLOAD 0xa0/写TX有效数据#define FLUSH_TX 0xe1/清除TXFIFO寄存器#define FLUSH_RX 0xe2/清除

8、RXFIFO寄存器#define REUSE_TX_PL 0xe3/重新使用上一包有效数据#define NOP 0xff/空操作/*寄存器地址*/#define CONFIG 0x00/配置寄存器#define EN_AA 0x01/使能自动应答#define EN_RXADDR 0x02/接收通道使能0-5个通道#define SETUP_AW 0x03/设置数据通道地址宽度3-5#define SETUP_RETR 0x04/建立自动重发#define RF_CH 0x05/射频通道设置#define RF_SETUP 0x06/射频寄存器#define STATUS 0x07/状态寄存

9、器#define OBSERVE_TX 0x08/发送检测寄存器#define CD 0x09/载波#define RX_ADDR_P0 0x0a/数据通道0接收地址#define RX_ADDR_P1 0x0b/数据通道1接收地址#define RX_ADDR_P2 0x0c/数据通道2接收地址#define RX_ADDR_P3 0x0d/数据通道3接收地址#define RX_ADDR_P4 0x0e/数据通道4接收地址#define RX_ADDR_P5 0x0f/数据通道5接收地址#define TX_ADDR 0x10/发送地址#define RX_PW_P0 0x11/P0通道数

10、据宽度设置#define RX_PW_P1 0x12/P1通道数据宽度设置#define RX_PW_P2 0x13/P2通道数据宽度设置#define RX_PW_P3 0x14/P3通道数据宽度设置#define RX_PW_P4 0x15/P4通道数据宽度设置#define RX_PW_P5 0x16/P5通道数据宽度设置#define FIFO_STATUS 0x17/FIFO状态寄存器/*相关函数声明*/unchar NRFACK();unchar NRFSPI(unchar date);unchar NRFReadReg(unchar RegAddr);unchar NRFWrit

11、eReg(unchar RegAddr,unchar date);unchar NRFReadRxDate(unchar RegAddr,unchar *RxDate,unchar DateLen);unchar NRFWriteTxDate(unchar RegAddr,unchar *TxDate,unchar DateLen);unchar NRFRevDate(unchar *RevDate);void NRFSetTxMode(unchar *TxDate);void NRF24L01Int();void NRFSetRXMode();unchar CheckACK();/*nrf2

12、4l01状态寄存器的申明*/struct STA_BITS / bit description Uint16 TX_FULL:1; / 0 FIFO寄存器满标志 Uint16 RX_P_NO:3; / 1:3 接收通道号 Uint16 MAX_RT:1; / 4 最大重发次数 Uint16 TX_DS:1; / 5 数据发送完成标志 Uint16 RX_DR:1; / 6 接收数据中断 Uint16 rsvd:1; / 7 reserved; union STA_REG Uint16 all; struct STA_BITS bit;struct LOOK_BITS / bit descrip

13、tion Uint16 bit0:1; / 0 Uint16 bit1:1; / 1 Uint16 bit2:1; / 2 Uint16 bit3:1; / 3 Uint16 bit4:1; / 4 Uint16 bit5:1; / 5 Uint16 bit6:1; / 6 Uint16 bit7:1; / 7; union LOOK_REG Uint16 all; struct LOOK_BITS bit;/*/#endif函数的底层如下:/*创建:那是星期天*时间:2015.4.15*功能:NRF24L01射频模块C文件*/#include DSP28_Device.h#include N

14、RF24L01.h/nrf24l01的射频模块的头文件unchar TxAddr=0x34,0x43,0x10,0x10,0x01;/发送地址union STA_REG sta=0;/*SPI时序函数* */unchar NRFSPI(unchar data)unchar i; for(i=0;i8;i+) / 循环8次 if(data&0x80)GpioDataRegs.GPADAT.bit.GPIOA3=1;/MOSIelseGpioDataRegs.GPADAT.bit.GPIOA3=0;/ byte最高位输出到MISOdata=1; / 低一位移位到最高位GpioDataRegs.GP

15、ADAT.bit.GPIOA1=1;/SCLK=1if(GpioDataRegs.GPADAT.bit.GPIOA2)/MISOdata|=0x01;GpioDataRegs.GPADAT.bit.GPIOA1=0;/SCLK=0 data=data&0x00ff; return(data);/返回读出的一个字节/*NRF24L01初始化函数*/void NRF24L01Int()DELAY_US(2);/延时2us/让系统什么都不干GpioDataRegs.GPADAT.bit.GPIOA5=0; /ce=0待机模式1 GpioDataRegs.GPADAT.bit.GPIOA0=1; /C

16、SN=1; GpioDataRegs.GPADAT.bit.GPIOA1=0;/SCLK=0;GpioDataRegs.GPADAT.bit.GPIOA4=1;/IRQ=1; /*SPI读寄存器一字节函数*/unchar NRFReadReg(unchar RegAddr) unchar BackDate; GpioDataRegs.GPADAT.bit.GPIOA0=0; /CSN=0启动时序 NRFSPI(RegAddr);/写寄存器地址 BackDate=NRFSPI(0x00);/写入读寄存器指令 GpioDataRegs.GPADAT.bit.GPIOA0=1;/ CSN=1 ret

17、urn(BackDate); /返回状态/*SPI写寄存器一字节函数*/unchar NRFWriteReg(unchar RegAddr,unchar date) unchar BackDate; GpioDataRegs.GPADAT.bit.GPIOA0=0; /CSN=0启动时序 BackDate=NRFSPI(RegAddr);/写入地址 NRFSPI(date);/写入值 GpioDataRegs.GPADAT.bit.GPIOA0=1;/ CSN=1 return(BackDate);/*SPI读取RXFIFO寄存器的值*/unchar NRFReadRxDate(unchar

18、RegAddr,unchar *RxDate,unchar DateLen) /寄存器地址/读取数据存放变量/读取数据长度/用于接收 unchar BackDate,i; GpioDataRegs.GPADAT.bit.GPIOA0=0; /CSN=0启动时序BackDate=NRFSPI(RegAddr);/写入要读取的寄存器地址for(i=0;iDateLen;i+) /读取数据 RxDatei=NRFSPI(0); GpioDataRegs.GPADAT.bit.GPIOA0=1;/ CSN=1 return(BackDate); /*SPI写入TXFIFO寄存器的值*/unchar N

19、RFWriteTxDate(unchar RegAddr,unchar *TxDate,unchar DateLen) /寄存器地址/写入数据存放变量/读取数据长度/用于发送 unchar BackDate,i; GpioDataRegs.GPADAT.bit.GPIOA0=0; /CSN=0启动时序 BackDate=NRFSPI(RegAddr);/写入要写入寄存器的地址 for(i=0;iDateLen;i+)/写入数据 NRFSPI(*TxDate+); GpioDataRegs.GPADAT.bit.GPIOA0=1;/ CSN=1 return(BackDate);/*NRF设置为

20、发送模式并发送数据*/void NRFSetTxMode(unchar *TxDate)/发送模式 GpioDataRegs.GPADAT.bit.GPIOA5=0; /CE=0 NRFWriteReg(W_REGISTER+CONFIG,0x00);/在掉电模式中配置寄存器NRFWriteReg(W_REGISTER+FLUSH_TX,0x00);/清除TX FIFO寄存器NRFWriteReg(W_REGISTER+SETUP_AW,0x03);/设置发射地址的宽度为5位 NRFWriteTxDate(W_REGISTER+TX_ADDR,TxAddr,TX_ADDR_WITDH);/写寄

21、存器指令+接收地址使能指令+接收地址+地址宽度NRFWriteTxDate(W_REGISTER+RX_ADDR_P0,TxAddr,TX_ADDR_WITDH);/为了应答接收设备,接收通道0地址和发送地址相同NRFWriteTxDate(W_TX_PAYLOAD,TxDate,TX_DATA_WITDH);/写入数据 /*下面有关寄存器配置*/ NRFWriteReg(W_REGISTER+EN_AA,0x00);/NRFWriteReg(W_REGISTER+EN_AA,0x01); / 使能接收通道0自动应答 NRFWriteReg(W_REGISTER+EN_RXADDR,0x00)

22、;/NRFWriteReg(W_REGISTER+EN_RXADDR,0x01); / 使能接收通道0 NRFWriteReg(W_REGISTER+SETUP_RETR,0x00);/NRFWriteReg(W_REGISTER+SETUP_RETR,0x0a); / 自动重发延时等待250us+86us,自动重发10次 NRFWriteReg(W_REGISTER+RF_CH,0x40); / 选择射频通道0x40 NRFWriteReg(W_REGISTER+RF_SETUP,0x07); / 数据传输率1Mbps,发射功率0dBm,低噪声放大器增益NRFWriteReg(W_REGIS

23、TER+CONFIG,0x0e); / CRC使能,16位CRC校验,上电 GpioDataRegs.GPADAT.bit.GPIOA5=1;/CE=1DELAY_US(10);/保持10us以上/*NRF设置为接收模式并接收数据*/主要接收模式void NRFSetRXMode() GpioDataRegs.GPADAT.bit.GPIOA5=0;/CE=0; NRFWriteReg(W_REGISTER+CONFIG,0x00);/在掉电模式中配置寄存器NRFWriteReg(W_REGISTER+FLUSH_RX,0x00);/清除TX FIFO寄存器NRFWriteReg(W_REGI

24、STER+SETUP_AW,0x03);/设置发射地址的宽度为5位 NRFWriteTxDate(W_REGISTER+RX_ADDR_P0,TxAddr,TX_ADDR_WITDH); / 接收设备接收通道0使用和发送设备相同的发送地址 NRFWriteReg(W_REGISTER+EN_AA,0x01); / 使能接收通道0自动应答 NRFWriteReg(W_REGISTER+EN_RXADDR,0x01); / 使能接收通道0 NRFWriteReg(W_REGISTER+RF_CH,0x40); / 选择射频通道0x40 NRFWriteReg(W_REGISTER+RX_PW_P0

25、,TX_DATA_WITDH); / 接收通道0选择和发送通道相同有效数据宽度 NRFWriteReg(W_REGISTER+RF_SETUP,0x07); / 数据传输率1Mbps,发射功率0dBm,低噪声放大器增益*/ NRFWriteReg(W_REGISTER+CONFIG,0x0f); / CRC使能,16位CRC校验,上电,接收模式 GpioDataRegs.GPADAT.bit.GPIOA5=1;/ CE = 1; DELAY_US(10);/保持10us以上 /*检测应答信号*/unchar CheckACK() /用于发射sta.all=NRFReadReg(R_REGIST

26、ER+STATUS); / 返回状态寄存器/sta.all=NRFReadReg(R_REGISTER+0x17);if(sta.bit.TX_DS|sta.bit.MAX_RT) /发送完毕中断 NRFWriteReg(W_REGISTER+STATUS,0xff); / 清除TX_DS或MAX_RT中断标志 GpioDataRegs.GPADAT.bit.GPIOA0=0;/ CSN=0; NRFSPI(FLUSH_TX);/用于清空FIFO !关键!不然会出现意想不到的后果!大家记住! GpioDataRegs.GPADAT.bit.GPIOA0=1;/ CSN=1; return(0)

27、;else return(1);/*判断是否接收收到数据,接到就从RX取出*/用于接收模式unchar NRFRevDate(unchar *RevDate) unchar RevFlags=0; sta.all=NRFReadReg(R_REGISTER+STATUS);/发送数据后读取状态寄存器 if(sta.bit.RX_DR)/ 判断是否接收到数据 GpioDataRegs.GPADAT.bit.GPIOA5=0; / CE=0; /SPI使能NRFReadRxDate(R_RX_PAYLOAD,RevDate,RX_DATA_WITDH);/ 从RXFIFO读取数据RevFlags=

28、1; /读取数据完成标志 NRFWriteReg(W_REGISTER+STATUS,0xff); /接收到数据后RX_DR,TX_DS,MAX_PT都置高为1,通过写1来清楚中断标 return(RevFlags);void InitGpio(void) EALLOW; /设置SPI口外设功能 GpioMuxRegs.GPAMUX.bit.PWM1_GPIOA0=0;/CSN GpioMuxRegs.GPAMUX.bit.PWM2_GPIOA1=0;/sck GpioMuxRegs.GPAMUX.bit.PWM3_GPIOA2=0;/MISO GpioMuxRegs.GPAMUX.bit.P

29、WM4_GPIOA3=0;/MOSI GpioMuxRegs.GPAMUX.bit.PWM5_GPIOA4=0;/IRQ GpioMuxRegs.GPAMUX.bit.PWM6_GPIOA5=0;/CE GpioMuxRegs.GPADIR.bit.GPIOA0=1; GpioMuxRegs.GPADIR.bit.GPIOA1=1; GpioMuxRegs.GPADIR.bit.GPIOA2=0; /MISO为输入 GpioMuxRegs.GPADIR.bit.GPIOA3=1; GpioMuxRegs.GPADIR.bit.GPIOA4=1; GpioMuxRegs.GPADIR.bit.G

30、PIOA5=1; EDIS;主函数中包涵了调试的内容:#include DSP28_Device.h#include NRF24L01.hvoid WriteLED(unchar data);/点亮LED2函数unchar TxDate4;union LOOK_REG look0=0;union LOOK_REG look1=0;union LOOK_REG look2=0;union LOOK_REG look3=0;union LOOK_REG look4=0;union LOOK_REG look5=0;union LOOK_REG look6=0;union LOOK_REG look

31、7=0;union LOOK_REG look8=0;union LOOK_REG look9=0;union LOOK_REG look10=0;union LOOK_REG look11=0;union LOOK_REG look12=0;union LOOK_REG look13=0;union LOOK_REG look14=0;union LOOK_REG look15=0;union LOOK_REG look16=0;union LOOK_REG look17=0;union LOOK_REG look18=0;union LOOK_REG look19=0;union LOOK

32、_REG look20=0;union LOOK_REG look21=0;union LOOK_REG look22=0;union LOOK_REG look23=0;void main(void) /*初始化系统*/InitSysCtrl();/* 关中断 */DINT;IER = 0x0000;IFR = 0x0000;/* 初始化PIE控制寄存器 */InitPieCtrl();/* 初始化PIE参数表 */InitPieVectTable();/* 初始化外设寄存器 */InitGpio();InitSpi(); /*设置CPU*/EINT; / 开全局中断ERTM; / 开实时中

33、断NRF24L01Int();while(1) int ReadTempDate=6; TxDate0=ReadTempDate;/ TxDate1=0; /TxDate2=0; /TxDate3=0; NRFSetTxMode(TxDate);/发数据 while(CheckACK();/检测是否发送完毕/GpioDataRegs.GPADAT.bit.GPIOA0=1; look0.all=NRFReadReg(R_REGISTER+0x00); look1.all=NRFReadReg(R_REGISTER+0x01); look2.all=NRFReadReg(R_REGISTER+0

34、x02); look3.all=NRFReadReg(R_REGISTER+0x03); look4.all=NRFReadReg(R_REGISTER+0x04); look5.all=NRFReadReg(R_REGISTER+0x05); look6.all=NRFReadReg(R_REGISTER+0x06); look7.all=NRFReadReg(R_REGISTER+0x07); look8.all=NRFReadReg(R_REGISTER+0x08); look9.all=NRFReadReg(R_REGISTER+0x09); look10.all=NRFReadReg

35、(R_REGISTER+0x0a); look11.all=NRFReadReg(R_REGISTER+0x0b); look12.all=NRFReadReg(R_REGISTER+0x0c); look13.all=NRFReadReg(R_REGISTER+0x0d); look14.all=NRFReadReg(R_REGISTER+0x0e); look15.all=NRFReadReg(R_REGISTER+0x0f); look16.all=NRFReadReg(R_REGISTER+0x10); look17.all=NRFReadReg(R_REGISTER+0x11); l

36、ook18.all=NRFReadReg(R_REGISTER+0x12); look19.all=NRFReadReg(R_REGISTER+0x13); look20.all=NRFReadReg(R_REGISTER+0x14); look21.all=NRFReadReg(R_REGISTER+0x15); look22.all=NRFReadReg(R_REGISTER+0x16); look23.all=NRFReadReg(R_REGISTER+0x17); TxDate0=ReadTempDate; /*名 称:WriteLED()*功 能:接收到的数据点亮LED*入口参数:c

37、har data,需要发送的数据*出口参数:无*/void WriteLED(unchar data) int n,j; for(n=0;ndata;n+) GpioDataRegs.GPFDAT.bit.GPIOF8=1;for(j=0;j10000;j+);GpioDataRegs.GPFDAT.bit.GPIOF8=0; for(j=0;j10000;j+); SPI接口直接调试的方法DSP2812的SPI的调试是nrf24l01的第一步,2812的spi在读写nrf24l01过程中会出现写入数据的错误,这个也是后来我用示波器观测的时候发现的现象,一切的调试都是建立在SPI的底层函数上,

38、SPI有问题那么对24l01的操作就会出现问题,在我的调试过程中就发现这样的问题,我不知道这种问题是不是共性,但是SPI的调试出现问题无线收发模块就有问题。究其原因是因为在2812的时钟发射的上升沿发出数据,在时钟的下降沿时这种电平会保持到下一个时钟的上升沿才会改变,这样的改变对2812没有什么影响但是对24l01模块来说却是致命的,这样就会造成数据的混叠,我的解决方法很直接,直接将输出口改为普通的IO口模式,使其在该高的地方高,在该底的地方底,这样数据的读写就不存在障碍了。对于SPI的调试我的初始化函数是对寄存器一个一个的给这样就方便找出问题。void InitSpi(void) SpiaR

39、egs.SPICCR.bit.RESET = 0; / 软件复位SPI SpiaRegs.SPICCR.bit.CLKPOLARITY = 0; / 上降沿输出数据 SpiaRegs.SPICCR.bit.SPILBK = 0; / 禁止环路自测模式 SpiaRegs.SPICCR.bit.SPICHAR = 0; / 1位字符长度 SpiaRegs.SPICTL.bit.OVERRUN = 0; / 禁止溢出中断使能 SpiaRegs.SPICTL.bit.CLK_PHASE = 0; / 信号无延时 SpiaRegs.SPICTL.bit.MASTER_SLAVE = 1; / 主机模式

40、SpiaRegs.SPICTL.bit.TALK = 1; / 使能发送 SpiaRegs.SPICTL.bit.SPIINTENA = 0; / 禁止发送、接收中断 SpiaRegs.SPIBRR = 49; / SPI波特率 = LSPCLK/(SPIBRR+1) = 37.5MHz/(49+1) = 750KHz SpiaRegs.SPICCR.bit.RESET = 1; / 退出 软件复位SPI然后在程序里面让发送的引脚发数据,接收脚接收数据,然后比较发送的数据和接收的数据。我在程序里面是只给一位数据,方便我后面实现想要的时序,但是在调试SPI的时候当然是可以一次给更多的位的,因为是

41、2812自己读写所以时序不存在问题,这里要注意的是在程序中只有给了SPITXBUF数据时钟才开始工作。当调试SPI没有问题的时候再开始下面的工作,写NRF的SPI底层函数,这里的时序是按照自己的逻辑来的,验证没有问题。/*SPI时序函数* */unchar NRFSPI(unchar data) unchar i;for(i=0;i8;i+)if(data&0x80) SpiaRegs.SPITXBUF=0x8000; GpioDataRegs.GPFDAT.bit.GPIOF0=1; else SpiaRegs.SPITXBUF=0x0000; GpioDataRegs.GPFDAT.bit

42、.GPIOF0=0;data=1; while(SpiaRegs.SPISTS.all&0x0040) != 0x0040); GpioDataRegs.GPFDAT.bit.GPIOF0=0;/这里要加否则时序不正确!if(SpiaRegs.SPIRXBUF&0x0001) data|=0x0001;/这个函数的高两位的写入是有问题的,在这里用不到所以不深究 return(data&0x00ff);/返回读出的一个字节其他的变动和用IO口模拟基本上一样,没有什么本质的区别,然后就可以用这条新写的SPI去操作NRF24L01的寄存器了,思路很简单,先对其中的一个寄存器实现写某个数据的操作,然后

43、实现对这个寄存器的读的操作,比较这两个数据,就可以验证SPI时序的正确性了。我对寄存器的读写操作时用以上函数发现8位数据的前两位写不正确,不知道是不是寄存器问题,但是其他的位是没有问题的,因为对寄存器用不到对高位的操作,所以这里不影响。后续的验证思路和用IO口模拟的一模一样就是对寄存器逐个的验证,这里不用修改CPU的时钟频率,因为时钟引脚可以自己调整。然后就是CD载波的验证,如果通过,那么就可以尝试着发送一个数据点个数码管什么的。到这里基本上一对一的发送和接收的操作就完成了,我讲程序的代码贴到下面。对于发送:#include DSP28_Device.h#include NRF24L01.hu

44、nchar TxDate4;union LOOK_REG look0=0;union LOOK_REG look1=0;union LOOK_REG look2=0;union LOOK_REG look3=0;union LOOK_REG look4=0;union LOOK_REG look5=0;union LOOK_REG look6=0;union LOOK_REG look7=0;union LOOK_REG look8=0;union LOOK_REG look9=0;union LOOK_REG look10=0;union LOOK_REG look11=0;union LO

45、OK_REG look12=0;union LOOK_REG look13=0;union LOOK_REG look14=0;union LOOK_REG look15=0;union LOOK_REG look16=0;union LOOK_REG look17=0;union LOOK_REG look18=0;union LOOK_REG look19=0;union LOOK_REG look20=0;union LOOK_REG look21=0;union LOOK_REG look22=0;union LOOK_REG look23=0;void main(void) Init

46、SysCtrl();DINT;IER = 0x0000;IFR = 0x0000;InitPieCtrl();InitPieVectTable();InitGpio();InitSpi(); EINT; / 开全局中断ERTM; / 开实时中断NRF24L01Int();while(1) int ReadTempDate=169; TxDate0=ReadTempDate; TxDate1=0; TxDate2=0; TxDate3=0; NRFSetTxMode(TxDate);/发数据 while(CheckACK();/检测是否发送完毕 GpioDataRegs.GPFDAT.bit.G

47、PIOF14=0; /CE=0 look0.all=NRFReadReg(R_REGISTER+0x00); look1.all=NRFReadReg(R_REGISTER+0x01); look2.all=NRFReadReg(R_REGISTER+0x02); look3.all=NRFReadReg(R_REGISTER+0x03); look4.all=NRFReadReg(R_REGISTER+0x04); look5.all=NRFReadReg(R_REGISTER+0x05); look6.all=NRFReadReg(R_REGISTER+0x06); look7.all=NRFReadReg(R_REGISTER+0x07); look8.all=NRFReadReg(R_REGISTER+0x08); look9.all=NRFReadReg(R_REGISTER+0x09); look10.all=NRFReadReg(R_REGISTER+0x0a); look11.all=NRFReadReg(R_REGISTER+0x0b); look12.all=NRFReadReg(R_REGISTER+0x0c)

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论