设为首页 加入收藏

TOP

nRF2401无线模块接收_FPGA实现~~(一)
2017-10-09 14:07:57 】 浏览:2014
Tags:nRF2401 无线 模块 接收 _FPGA 实现

    最近胶囊内窥镜项目中用到了业界常用的无线收发模块,即恩智浦公司nRF系列无线收发模块,该模块当前有好几种选择,比如nRF24L01只有无线收发模块,需要外部MCU进行驱动及数据收发,还有nRF24LE1自带单片机内核,即单片机集成在收发模块内。另外还有nRF24xx+USB模块,这种模块使用起来更方便,数据收发后直接跟上位机通信。nRF系列常用模块有nRF24L01、nRF24LE1,当前项目架构是内部胶囊使用的是nRF24LE1无线模块,而外部接收仪(fpga做主控)使用的是nRF24L01模块。这两种无线模块的寄存器配置完全兼容。

    下面针对nRF24L01的驱动及数据收发的FPGA实现进行总结。

    首先本人之前从未用过nRF2401,因此先看起nRF2401的数据手册。英文手册的特点是内容详实,想查的内容手册里肯定全有,当然也有特殊情况,比如在调试OV公司的相机模块时,OV公司的datasheet真的是shit,反复查找资料结合中文资料以及调试推断才搞清楚出图的几个最重要寄存器的配置。据说咨询OV的FAE需要付费。

    闲话少说,继续2401的FPGA驱动配置。英文手册内容详实,但缺点是零散分散,想快速找到配置方式,需要反复阅读,并结合调试进行确认。比如我需要快速对2401进行初始化并将2401配置到接收模式,如果看英文手册你会云里雾里好一会儿,另外FPGA在配置时对各个控制信号的时序需要详细说明,而手册上只有SPI的时序图及相关参数,不能一下子看出各个信号之间的时序要求。因此本人首先结合中文资料理清了nRF2401的初始化流程和接收模式的配置要求(即寄存器配置相关参数),然后结合单片机代码和英文手册确认每一个寄存器的配置,最后将200行的单片机c代码转换成我需要的verilog代码。(ps:HDL玩转嵌套循环真是累啊,C代码轻松几个函数,verilog需要兜兜转转一大圈)

    下面首先粘贴上单片机C代码:

    

#include <reg52.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
#define TX_ADDR_WITDH 5 //发送地址宽度设置为5个字节
#define RX_ADDR_WITDH 5 //接收地址宽度设置为5个字节
#define TX_DATA_WITDH 2 //发送数据宽度
#define RX_DATA_WITDH 2 //接收数据宽度

//以下为命令寄存器
#define R_REGISTER 0x00 // 读寄存器
#define W_REGISTER 0x20 // 写寄存器
#define R_RX_PLOAD 0x61 // 读RX FIFO有效数据,1-32字节,当读数据完成后,数据被清除,应用于接收模式
#define W_TX_PLOAD 0xA0 // 写TX FIFO有效数据,1-32字节,写操作从字节0开始,应用于发射模式
#define FLUSH_TX 0xE1 // 清除TX FIFO寄存器,应用于发射模式
#define FLUSH_RX 0xE2 // 清除RX FIFO寄存器,应用于接收模式
#define REUSE_TX_PL 0xE3 // 重新使用上一包有效数据,当CE为高过程中,数据包被不断的重新发射
#define NOP 0xFF // 空操作,可以用来读状态寄存器

//以下为寄存器地址
#define CONFIG 0x00 // 配置寄存器
#define EN_AA 0x01 // “自动应答”功能寄存
#define EN_RX_ADDR 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 // 数据通道1有效数据宽度设置寄存器
#define RX_PW_P2 0x13 // 数据通道2有效数据宽度设置寄存器
#define RX_PW_P3 0x14 // 数据通道3有效数据宽度设置寄存器
#define RX_PW_P4 0x15 // 数据通道4有效数据宽度设置寄存器
#define RX_PW_P5 0x16 // 数据通道5有效数据宽度设置寄存器
#define FIFO_STATUS 0x17 // FIFO状态寄存器

uchar bdata sta; // 状态变量
#define RX_DR (sta & 0x40) // 接收成功中断标志 0100 0000(sta^6)
#define TX_DS (sta & 0x20) // 发射成功中断标志 0010 0000 (sta^5)
#define MAX_RT (sta & 0x10) // 重发溢出中断标志 0001 0000 (sta^4)


//nRF24L01引脚定义
sbit MISO=P2^3;
sbit IRQ=P2^2;
sbit SCK=P2^4;
sbit MOSI=P2^1;
sbit CE=P2^5;
sbit CSN=P2^0;

//外围引脚定义
sbit LED=P3^7;

uchar code TX_Addr[TX_ADDR_WITDH]={0x34,0x43,0x10,0x10,0x01};
uchar code RX_Addr[RX_ADDR_WITDH]={0x34,0x43,0x10,0x10,0x01};
uchar RX_Buffer[RX_DATA_WITDH]={0};
uchar m=0;
void _delay_us(int x)
{
    int i,j;
    for (j=0;j<x;j++)
    for (i=0;i<12;i++);
}
void _delay_ms(int x)
{
    int i,j;
    for (j=0;j<x;j++)
    for (i=0;i<120;i++);
}


//SPI时序函数(1)
uchar SPI_RW(uchar byte)
{
    uchar i;
    for(i=0;i<8;i++)
    {
        if(byte&0
首页 上一页 1 2 3 下一页 尾页 1/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇FPGA基础知识(一)查找表LUT和编.. 下一篇FPGA基础知识(三)典型FPGA开发..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目