历史上的今天
返回首页

历史上的今天

今天是:2024年10月15日(星期二)

正在发生

2019年10月15日 | AVR单片机nrf24l01驱动程序

2019-10-15 来源:eefocus

avr单片机源程序如下:


//ICC-AVR application builder : 2018/6/1 21:34:07

// Target : M16

// Crystal: 8.0000Mhz


#include

#include

#include "SPI.h"

#include"key.h"

#define uint  unsigned int

#define uchar unsigned char 


#define IRQ  0   //输入

#define MISO 1   //输入

#define MOSI 2   //输出

#define SCK 3    //输出

#define CSN  4   //输出

#define CE   5   //输出

//================== NRF24L01的接收和发送地址 ===================

#define TX_ADR_WIDTH    5   // 5个字节的TX地址长度

#define RX_ADR_WIDTH    5   // 5个字节的RX地址长度

#define PLOAD_WIDTH     12            // 1-32 字节 数据设定长度

#define TX_PLOAD_WIDTH  32  // ?个字节的TX数据长度

#define RX_PLOAD_WIDTH  32  // ?个字节的RX数据长度

//================== 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栈入栈出状态寄存器设置


//uchar TX_ADDRESS[TX_ADR_WIDTH] = {0x34,0x43,0x10,0x10,0x01};  // 定义一个静态发送地址


uchar TX_ADDRESS[5]={0x00,0x00,0x00,0x00,0xA2};//接收本机 地址

uchar RX_ADDRESS[5]={0x00,0x00,0x00,0x00,0xA1};//发送目标 地址


uchar TX_ADDRESS1[5]={0x00,0x00,0x00,0x00,0xA1};//接收本机 地址

uchar RX_ADDRESS1[5]={0x00,0x00,0x00,0x00,0xA2};//发送目标 地址


uchar RX_BUF[RX_ADR_WIDTH]={0x00,0x00,0x00,0x00,0x00};        //接收数据存放数组

uchar TX_BUF[TX_ADR_WIDTH]={0x00,0x01,0x02,0x03,0x04};        //发送的数据

uchar flag=0;

//US

void delayus(uint i)

{

uchar j;

while(i)

{

for(j=0;j<=7;j++)

{

NOP();

}

i--;

}

}

void delay_ms(uint i)

{

while(i--)

{

unsigned int j;

for(j=1;j<=1332;j++);

}

}

// 这个函数设置nRF24L01为接收模式,等待接收发送设备的数据包

/**************************************************/

void RX_Mode(void)

{

        RET_CE;  


          SPI_RW_Reg(WRITE_REG + EN_AA, 0x01);               // 使能接收通道0自动应答

          SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01);           // 使能接收通道0

          SPI_RW_Reg(WRITE_REG + RF_CH, 0x40);                 // 选择射频通道0x40

          SPI_RW_Reg(WRITE_REG + RX_PW_P0, RX_ADR_WIDTH);  // 接收通道0选择和发送通道相同有效数据宽度

          SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07);            // 数据传输率1Mbps,发射功率0dBm,低噪声放大器增益

          SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f);              // CRC使能,16位CRC校验,上电,接收模式

          EST_CE;                                            // 拉高CE启动接收设备

                                    

}


//这个函数设置nRF24L01为发送模式,(CE=1持续至少10us),

//130us后启动发射,数据发送结束后,发送模块自动转入接收模式等待应答信号。

/**************************************************/

void TX_Mode(uchar * BUF)

{

        RET_CE; 


          SPI_Write_Buf(WR_TX_PLOAD, BUF, TX_ADR_WIDTH);                  // 写数据包到TX FIFO

          SPI_RW_Reg(WRITE_REG + EN_AA, 0x01);       // 使能接收通道0自动应答

          SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01);   // 使能接收通道0

          SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x0a);  // 自动重发延时等待250us+86us,自动重发10次

          SPI_RW_Reg(WRITE_REG + RF_CH, 0x40);         // 选择射频通道0x40

          SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07);    // 数据传输率1Mbps,发射功率0dBm,低噪声放大器增益

          SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e);      // CRC使能,16位CRC校验,上电

        EST_CE; 


}

/*

void main(void)

{

uchar s=0x00;

DDRB=0xff;

DDRC=0xff;

PORTB=0x00;

PORTC=0x00;

ioinit();

delay_ms(10);

SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS1, TX_ADR_WIDTH);     // 写入发送地址

SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, RX_ADDRESS1, TX_ADR_WIDTH);  // 接收设备接收通道0使用和发送设备相同的发送地址

RX_Mode();

while(1)

{

if(!(PINA&0x01))

{EST_IRQ ; s=SPI_Read(READ_REG + STATUS);

if(s&0x40)                                             //接收到数据标志

{

SPI_Read_Buf(RD_RX_PLOAD, RX_BUF, RX_ADR_WIDTH);

SPI_RW_Reg(WRITE_REG + STATUS, s);  

}}

if((RX_BUF[0]==0x00)&&(RX_BUF[1]==0x01)&&(RX_BUF[2]==0x02)&&(RX_BUF[3]==0x03)&&(RX_BUF[4]==0x04))

PORTB=0xff;

if((RX_BUF[0]==0x01)&&(RX_BUF[1]==0x01)&&(RX_BUF[2]==0x02)&&(RX_BUF[3]==0x03)&&(RX_BUF[4]==0x04))

PORTB=0x00;

}

}

*/

//按键修改发送数组的值SPI_Write_Buf(WR_TX_PLOAD, TxBuf, PLOAD_WIDTH);

void anjian(void)

{

switch(key())

{

case 1: break;

case 2: TX_BUF[0]=0x00;SPI_Write_Buf(WR_TX_PLOAD, TX_BUF, TX_ADR_WIDTH);break;// 更新数据包到TX FIFO

case 3: TX_BUF[0]=0x01;PORTB=0xff;SPI_Write_Buf(WR_TX_PLOAD, TX_BUF, TX_ADR_WIDTH);break;// 更新数据包到TX FIFO

}

}

  void main(void)

{

        unsigned char HXout,HGout,FYout;//控制参数输出值 0~128~255

        unsigned char HangXiang=128,HengGun=128,FuYang=128;//微调变量

   uchar s=0x00;

   DDRD&=0x1f;

   PORTD|=0xe0;//按键初始化

   DDRB=0xff;

   DDRC=0xff;

   PORTB=0x00;

   TCCR0=0x0b;//CTC工作模式   64分频

   TCNT0=0x00;

   TIMSK=0x02;//比较匹配中断允许

   TIFR=0x02;//写1清0

   OCR0=0xfa;//定时2ms

   SEI();//开启总中断    to初始化

   ioinit(); 

……………………


推荐阅读

史海拾趣

爱特姆(ATOM)公司的发展小趣事

在快速发展的同时,爱特姆也积极履行企业社会责任。公司始终坚持绿色生产、环保经营的理念,通过采用环保材料和节能技术,降低生产过程中的能耗和排放。此外,爱特姆还积极参与社会公益事业,为社会的可持续发展贡献自己的力量。

这五个故事从不同角度展现了爱特姆(ATOM)在电子行业发展的历程和成就。通过持续创新、市场拓展、人才引进和社会责任等方面的努力,爱特姆逐渐成长为一家具有全球影响力的电子企业。

FOX [Fox Electronics]公司的发展小趣事

进入21世纪后,Fox Electronics意识到全球化对于企业发展的重要性。为了更好地服务全球客户,公司开始在全球范围内布局生产基地和销售网络。通过在亚洲、欧洲和北美等地设立分厂和办事处,Fox Electronics不仅缩短了交货周期,还降低了生产成本,提高了市场竞争力。同时,公司还加强了与全球供应链伙伴的合作,通过优化供应链管理,确保产品质量和交货期的稳定性。

FUJITSU(富士通)公司的发展小趣事

进入21世纪后,Fox Electronics意识到全球化对于企业发展的重要性。为了更好地服务全球客户,公司开始在全球范围内布局生产基地和销售网络。通过在亚洲、欧洲和北美等地设立分厂和办事处,Fox Electronics不仅缩短了交货周期,还降低了生产成本,提高了市场竞争力。同时,公司还加强了与全球供应链伙伴的合作,通过优化供应链管理,确保产品质量和交货期的稳定性。

Dell公司的发展小趣事

进入21世纪后,Fox Electronics意识到全球化对于企业发展的重要性。为了更好地服务全球客户,公司开始在全球范围内布局生产基地和销售网络。通过在亚洲、欧洲和北美等地设立分厂和办事处,Fox Electronics不仅缩短了交货周期,还降低了生产成本,提高了市场竞争力。同时,公司还加强了与全球供应链伙伴的合作,通过优化供应链管理,确保产品质量和交货期的稳定性。

Eris Technology Corp公司的发展小趣事

在汽车电子市场取得成功后,Eris Tech开始将目光投向工业控制领域。通过深入了解工业控制市场的需求和技术特点,公司成功开发出多款适用于工业控制领域的半导体产品。这些产品不仅具有高性能、高可靠性等特点,还能满足工业控制领域对实时性、安全性等方面的要求。随着工业控制领域的不断拓展,Eris Tech在该领域的市场份额也逐渐增加。

ERNI公司的发展小趣事

1947年,瑞士工程师Ernst Rudolf Erni和他的妻子Elsa在瑞士那提空(Nänikon)共同创立了“ERNI & CO.”公司。他们的首个订单是为苏黎世克洛腾机场开发地雷探测器和机场导航灯。这个起点虽小,但为ERNI日后在电子行业的辉煌奠定了基础。随着订单的增多,公司逐渐扩大了生产规模,并开始涉足继电器、电气设备等领域。

问答坊 | AI 解惑

请高手帮助分析这个电路,

file:///C:/Documents%20and%20Settings/Administrator/桌面电路输入为峰峰值为500mv左右的正旋波频率是70Hz左右(分E1E2两路),E0为接地端,在E1出输入正弦波,经过几级放大(U3用的是LM258P,U4用的是LM119)后在E7最右端(经上拉电阻后接单片机 ...…

查看全部问答>

如何区分系统中扩展的存储器是程序存储器还是数据存储器

如何区分系统中扩展的存储器是程序存储器还是数据存储器…

查看全部问答>

关于AT^SCFG命令问题,望高手指点

AT^SCFG中可以进行URC destination interface 设置。以下为发送命令格式: Write Command Configure URC destination interface: AT^SCFG=\"URC/DstIfc\"[, ] Response(s) ^SCFG: \"URC/DstIfc\", OK ERROR +CME ERROR URC destination i ...…

查看全部问答>

一个奇怪的问题,关于ADS里程序的运行速度,以及RAM,FLASH中的运行速度

我用的是三星的44b0,最近在调系统响应时间的时候发现怪问题 同样一段普通循环程序在三种情况下的运行时间不一样,我的44b0主频为64M,程序大致如下 开定时器 for(i=0;i…

查看全部问答>

基于AD7280A的电池管理系统(DIY完成)

   为时两个多月的ADI实验室电路DIY已经过去大半了,只剩下最后的几天时间了,我的《基于AD7280A的电池管理系统》也接近尾声,在这两个月的时间里,我从了解adi实验电路到最终制作pcb和调试,都得到了EEWORLD网友和版主的大力支持,尤其 ...…

查看全部问答>

电路设计漫谈之你练到了第几层?

小熊在一些网站上发现了一些比较好的博文,比方说:电路设计漫谈就是一个比较好的博文,笔者收集的电路设计漫谈共有10篇,笔者会陆续定期推出每一篇,暂定为每周至少有一篇,有兴趣而且觉得对自己有意义的就可以坚持看笔者的博文。现在开始进入我们 ...…

查看全部问答>

磁卡的工作原理和其识别的原理是怎么样的

本帖最后由 jameswangsynnex 于 2015-3-3 20:00 编辑 磁卡的工作原理和其识别的原理是怎么样的 前些天对磁卡产生了好奇,在网上搜索相关的识别原理图以及控制电路图似乎没找到什么。请问哪位能指点指点?假如对商品条码的识别相关的条码扫描器 ...…

查看全部问答>

好资料分享,FRAM深度科普贴!!!

  这几天在用FRAM(富士通的一款内置2K FRAM的RFID芯片MB89R118C),对FRAM初次接触,学习了不少皮毛,Google了一些资料顺便分享给大家,抛砖引玉,有用过的大牛也给小弟一些指导哈(特别是目前主流器件关键性能的比较)!   铁电存储器 ...…

查看全部问答>

【课程推荐】开关电源设计——PCB热管理

EEworld大学堂上线了一门新的电源课程:《PCB 热管理》。本课程介绍了电源设计中的一个重要环节:PCB热设计。介绍了PCB热设计中常见的概念,术语和半导体器件中常用热参数的含义。着重介绍了管理热性能的方法,并以实例的方式给出了设计指引和建议 ...…

查看全部问答>