历史上的今天
今天是: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(); ……………………
史海拾趣
|
file:///C:/Documents%20and%20Settings/Administrator/桌面电路输入为峰峰值为500mv左右的正旋波频率是70Hz左右(分E1E2两路),E0为接地端,在E1出输入正弦波,经过几级放大(U3用的是LM258P,U4用的是LM119)后在E7最右端(经上拉电阻后接单片机 ...… 查看全部问答> |
|
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… 查看全部问答> |
|
为时两个多月的ADI实验室电路DIY已经过去大半了,只剩下最后的几天时间了,我的《基于AD7280A的电池管理系统》也接近尾声,在这两个月的时间里,我从了解adi实验电路到最终制作pcb和调试,都得到了EEWORLD网友和版主的大力支持,尤其 ...… 查看全部问答> |
|
小熊在一些网站上发现了一些比较好的博文,比方说:电路设计漫谈就是一个比较好的博文,笔者收集的电路设计漫谈共有10篇,笔者会陆续定期推出每一篇,暂定为每周至少有一篇,有兴趣而且觉得对自己有意义的就可以坚持看笔者的博文。现在开始进入我们 ...… 查看全部问答> |
|
本帖最后由 jameswangsynnex 于 2015-3-3 20:00 编辑 磁卡的工作原理和其识别的原理是怎么样的 前些天对磁卡产生了好奇,在网上搜索相关的识别原理图以及控制电路图似乎没找到什么。请问哪位能指点指点?假如对商品条码的识别相关的条码扫描器 ...… 查看全部问答> |
|
这几天在用FRAM(富士通的一款内置2K FRAM的RFID芯片MB89R118C),对FRAM初次接触,学习了不少皮毛,Google了一些资料顺便分享给大家,抛砖引玉,有用过的大牛也给小弟一些指导哈(特别是目前主流器件关键性能的比较)! 铁电存储器 ...… 查看全部问答> |
|
EEworld大学堂上线了一门新的电源课程:《PCB 热管理》。本课程介绍了电源设计中的一个重要环节:PCB热设计。介绍了PCB热设计中常见的概念,术语和半导体器件中常用热参数的含义。着重介绍了管理热性能的方法,并以实例的方式给出了设计指引和建议 ...… 查看全部问答> |




