




已阅读5页,还剩3页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第一次使用无线通信的芯片,第一次接触SPI总线时序,第一次遇到芯片有问题,很多的第一次,所以最后成功了我觉得很有意义,收获了很多,有必要用寥寥数字来记录一下。 最开始老板给的是一个NRF401的芯片,后来网上一查,这玩意早停产了,不过发现其操作和硬件接口非常简单,编程应该也非常简单,于是乎三下两下的接好电路,编好程序,上电一跑,晕了!完全没反应,一开始还怀疑自己的程序或者硬件电路哪里错了,DEBUG,查资料搞了好几天,最后确定自己没有搞错。于是乎,又把401拿掉,直接用2根导线把两块板子的串行口接好,然后奇迹出现了,如同我设想的那样运行。好吧,终于可以确定这2块不知放了多少年布满飞尘的401是坏的了。 然后上网继续寻找替代品,淘宝上一搜人气最高的是NRF24L01,本来还想买905的,不过哥相信群众,于是买了2块NRF24L01回来。这个芯片的接口是SPI的接口,的确让我郁闷了一阵,以前从来没接触过这个玩意,而且一般的单片机哪有SPI接口,身边的一块ARM板倒是有不过只有一块啊,于是又硬着头皮去看如何用普通IO口模拟出SPI的时序来操作NRF24L01,等搞明白了芯片也寄到了,又是一阵捣鼓,接好线,相当多的线,编好程序,相对401来说很长的程序。一上电,又晕了,还是没反应。然后就是无止境的调试,修改程序,整整花了一周多时间后终于遇到了曙光啊!一个网上的高手帮我用他那边的示波器分析了一下我的程序波形,说没有问题啊,然后另一个高手告诉我应该怎样来一步一步地调试这些芯片,比如先给芯片寄存器写一个值然后马上读出来,看是否写操作正确,等等。这个经验之谈真是犹如黑夜里的一盏明灯啊,让我豁然开朗,马上照高手指点的一搞,结果出来了。2块NRF24L01的其中一块根本写不进去数据,完全是坏的,哎!人品啦!(我承认是我太傻太天真了,以为老板发货的时候都会先帮我检查一遍)马上和淘宝上的老板沟通了一下,让我把坏的寄过去他检查如果确实是他们的原因他们负责再给我寄一个过来,同时包邮费。好吧,我又等,等了一周老板来电话了通知我确实是他们的问题给我寄了一块坏的芯片,并给我重新寄来了一块好的。然后继续等啊等,又是一周,东西终于来了。这次哥颤抖着以迅雷不及掩耳盗铃儿响叮当之势再一次接好线,下好以前写好的程序,谢天谢地谢亚龙啊,这次总算测试通过,两块芯片都是好的了。 今天自己又写了一个发送与接收单工通信的测试程序,跑了一下。恩,效果不错,看到接收端不停得把收到的数据显示在电脑上时内牛满面啊!这其中也有个小插曲,一开始接收的数组被我定义在了code段,结果发送端都能正确收到接收的应答信号,但接收端就是不能把数据写进接收数组里面,程序编译也通过。后来一想才明白CODE内的代码是下载到flash中的,是修改不了的。最后改成data修饰,终于能正常运行了。当初我曾请一个调出来的网友把他的程序借我参考下,但他说这是公司的商业机密,不能给,哎,为了以后的同仁少走弯路,我把我调好的测试程序放上来。#include #include #define MODE 0 /MODE=1时 为发送代码 MODE=0时 为接收代码typedef unsigned char uchar;/*IO端口定义*sbit MISO =P23;sbit MOSI =P22;sbit SCK =P21;sbit CE =P25;sbit CSN =P20;sbit IRQ =P32;sbit led = P12;/*uchar bdata sta; /状态标志sbit RX_DR =sta6;sbit TX_DS =sta5;sbit MAX_RT =sta4;/*NRF24L01*#define TX_ADR_WIDTH 5 / 5 uints TX address width#define RX_ADR_WIDTH 5 / 5 uints RX address width#define TX_PLOAD_WIDTH 32 / 32 uints TX payload#define RX_PLOAD_WIDTH 32 / 32 uints TX payloaduchar const TX_ADDRESSTX_ADR_WIDTH= 0x34,0x43,0x10,0x10,0x01; /本地地址uchar const RX_ADDRESSRX_ADR_WIDTH= 0x34,0x43,0x10,0x10,0x01; /接收地址uchar code Tx_BufTX_PLOAD_WIDTH=0xff,0xee,0x11,0x22,0x33,0xaa,0xbb,0x11,0x22,0x33,0xaa,0xbb,0x11,0x22,0x33,0xaa,0xbb,0x11,0x22,0x33,0xaa,0xbb,0x11,0x22,0x33,0xaa,0xbb,0x11,0x22,0x33,0xee,0xff;/发送数据uchar Rx_BufRX_PLOAD_WIDTH;/接收数据/*NRF24L01寄存器指令*#define READ_REG 0x00 / 读寄存器指令#define WRITE_REG 0x20 / 写寄存器指令#define RD_RX_PLOAD 0x61 / 读取接收数据指令#define WR_TX_PLOAD 0xA0 / 写待发数据指令#define FLUSH_TX 0xE1 / 冲洗发送 FIFO指令#define FLUSH_RX 0xE2 / 冲洗接收 FIFO指令#define REUSE_TX_PL 0xE3 / 定义重复装载数据指令#define NOP 0xFF / 保留/*SPI(nRF24L01)寄存器地址*#define CONFIG 0x00 / 配置收发状态,CRC校验模式以及收发状态响应方式#define EN_AA 0x01 / 自动应答功能设置#define EN_RXADDR 0x02 / 可用信道设置#define SETUP_AW 0x03 / 收发地址宽度设置#define SETUP_RETR 0x04 / 自动重发功能设置#define RF_CH 0x05 / 工作频率设置#define RF_SETUP 0x06 / 发射速率、功耗功能设置#define STATUS 0x07 / 状态寄存器#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 / 接收频道0接收数据长度#define RX_PW_P1 0x12 / 接收频道0接收数据长度#define RX_PW_P2 0x13 / 接收频道0接收数据长度#define RX_PW_P3 0x14 / 接收频道0接收数据长度#define RX_PW_P4 0x15 / 接收频道0接收数据长度#define RX_PW_P5 0x16 / 接收频道0接收数据长度#define FIFO_STATUS 0x17 / FIFO栈入栈出状态寄存器设置/*延时函数*/长延时void Delay(unsigned int s) unsigned int i,j;for(i=0;i1000;i+)for(j=0;js;j+);/短延时void delay_ms(unsigned int x) unsigned int i,j; i=0; for(i=0;ix;i+) j=108; while(j-); /*IO 口模拟SPI总线 代码*/uchar SPI_RW(uchar byte) uchar bit_ctr; for(bit_ctr=0;bit_ctr8;bit_ctr+) MOSI=(byte&0x80); byte=(byte1); SCK=1; byte|=MISO; /led=MISO;Delay(150); SCK=0; return(byte);uchar SPI_RW_Reg (uchar reg,uchar value) / 向寄存器REG写一个字节,同时返回状态字节 uchar status; CSN=0; status=SPI_RW(reg); SPI_RW(value); CSN=1; return(status);uchar SPI_Read (uchar reg ) uchar reg_val; CSN=0; SPI_RW(reg); reg_val=SPI_RW(0); CSN=1; return(reg_val);uchar SPI_Write_Buf(uchar reg, uchar *pBuf, uchar bytes) uchar status,byte_ctr; CSN = 0; / Set CSN low, init SPI tranaction status = SPI_RW(reg); / Select register to write to and read status byte for(byte_ctr=0; byte_ctrbytes; byte_ctr+) / then write all byte in buffer(*pBuf) SPI_RW(*pBuf+); CSN = 1; / Set CSN high again return(status); / return nRF24L01 status byte#if MODE /*发*送*模*式*代*码*/void TX_Mode(void) CE=0; SPI_RW_Reg(FLUSH_TX,0x00); SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH); / Writes TX_Address to nRF24L01 SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); / RX_Addr0 same as TX_Adr for Auto.Ack SPI_RW_Reg(WRITE_REG + EN_AA, 0x01); / Enable Auto.Ack:Pipe0 SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01); / Enable Pipe0 SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x1a); / 500us + 86us, 10 retrans.1a SPI_RW_Reg(WRITE_REG + RF_CH, 40); / Select RF channel 40 SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07); / TX_PWR:0dBm, Datarate:1Mbps, LNA:HCURR SPI_RW_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH); /设置接收数据长度,本次设置为2字节 SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e); CE=1; delay_ms(100);void Transmit(unsigned char * tx_buf) CE=0; /StandBy I模式 SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); / 装载接收端地址 SPI_RW_Reg(FLUSH_TX,0x00); SPI_Write_Buf(WR_TX_PLOAD, tx_buf, TX_PLOAD_WIDTH); / 装载数据 SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e); / IRQ收发完成中断响应,16位CRC,主发送 CE=1; /置高CE,激发数据发送 delay_ms(150);#else /*接*收*模*式*代*码*/uchar SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars) uchar status,uchar_ctr; CSN = 0; / Set CSN low, init SPI tranaction status = SPI_RW(reg); / Select register to write to and read status uchar for(uchar_ctr=0;uchar_ctruchars;uchar_ctr+) pBufuchar_ctr = SPI_RW(0); / CSN = 1; return(status); / return nRF24L01 status uchar/*/*函数:unsigned char nRF24L01_RxPacket(unsigned char* rx_buf)/*功能:数据读取后放如rx_buf接收缓冲区中/*/unsigned char nRF24L01_RxPacket(unsigned char* rx_buf) unsigned char revale=0; sta=SPI_Read(STATUS); / 读取状态寄存其来判断数据接收状况 if(RX_DR) / 判断是否接收到数据 /CE = 0; /SPI使能 SPI_Read_Buf(RD_RX_PLOAD,rx_buf,RX_PLOAD_WIDTH);/ read receive payload from RX_FIFO buffer revale =1; /读取数据完成标志 /Delay(100); SPI_RW_Reg(WRITE_REG+STATUS,sta); /接收到数据后RX_DR,TX_DS,MAX_PT都置高为1,通过写1来清楚中断标志 return revale;/*/*函数:void RX_Mode(void)/*功能:数据接收配置 /*/void RX_Mode(void) CE=0; SPI_RW_Reg(FLUSH_RX,0x00); /SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH); / Writes TX_Address to nRF24L01 SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); / RX_Addr0 same as TX_Adr for Auto.Ack SPI_RW_Reg(WRITE_REG + EN_AA, 0x01); / Enable Auto.Ack:Pipe0 SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01); / Enable Pipe0 /SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x1a); / 500us + 86us, 10 retrans.1a SPI_RW_Reg(WRITE_REG + RF_CH, 40); / Select RF channel 40 SPI_RW_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH); /设置接收数据长度,本次设置为2字节 SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07); / TX_PWR:0dBm, Datarate:1Mbps, LNA:HCURR SPI_RW_Reg(WRITE_REG + CONFIG, 0x0F); CE=1; delay_ms
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025至2030年中国卧式中浓压力筛浆机行业投资前景及策略咨询报告
- 2025至2030年中国华夫格全棉冷气毯行业投资前景及策略咨询报告
- 2025至2030年中国内外螺纹陶瓷阀行业投资前景及策略咨询报告
- 2025至2030年中国不锈钢水塔封行业投资前景及策略咨询报告
- 门诊手术室管理制度
- 阅读分享室管理制度
- 零售业用工管理制度
- 非牟利组织管理制度
- 面向游戏评论文本的方面级情感分析方法研究
- 餐厅垂直型管理制度
- 特许经营管理手册范本(餐饮)
- 计算机应用基础-终结性考试试题国开要求
- 2023年全国统一高考真题物理试卷(新课标ⅰ)(含答案及解析)
- 2023年05月四川省广安市司法局公开招考2名劳务派遣制司法行政辅助人员笔试题库含答案解析
- 《安装条》浙江省建筑设备安装工程提高质量的若干意见
- 安全宣传咨询日活动知识手册
- 压力弹簧力度计算器及计算公式
- 运动员简历模板
- 宴会设计智慧树知到答案章节测试2023年黑龙江旅游职业技术学院
- 2023-2024学年湖北省恩施市小学数学四年级下册期末点睛提升考试题
- 广州市人力资源和社会保障局事业单位招聘工作人员模拟检测试卷【共500题含答案解析】
评论
0/150
提交评论