NRF51822 2.4G无线

一.我用的是NRF51的板子,兼容51822和51422外带了Debugin和Debugout烧录

二.我是用的芯片手册是51822。所以下面就来说说我是用的51822无线的应用

1.NRF51822简介

CPU: 32-bit ARM® Cortex™ M0 32-bit CPU
Memery:256/128 KB embedded flash、 16 KB RAM
System Peripherals:
一个32位定时器,两个16位定时器。(注:nRF51定时器的位数可以通过寄存器设置的,可变的)
16通道的CPU独立编程外设互联(PPI)
(翻译太渣,献原句:16 channel CPU independent Programmable Peripheral Interconnect (PPI))
128位AES ECB/CCM/AAR加密协处理器
RNG:随机数发生器
两个RTC时钟,RTC0,RTC1
温度传感器
GPIO:
31个GPIO引脚
支持多达4路PWM输出
Digital I/O:
SPI Master/Slave, 2-wire Master (I2C compatible), UART (CTS/RTS)
正交解码器(Quadrature decoder)
Analog I/O:
8/9/10 bit ADC - 8 configurable channels
Low power comparator
Power Management:
支持1.8V到3.6V宽电压
在芯片DC/DC转换
0.6 µA @ 3V OFF mode
1.2 µA @ 3V OFF mode + 1 region RAM retention
2.6 µA @ 3V ON mode, all blocks in idle mode
其他:
MPU

2.烧写工具及环境搭建

环境我用的是NRF51——SDK和KEIL(版本是4.72)这些资源在官网上都有,关键是环境要安装成功,我就遇见安装环境时,下一步界面直接跳到flish这个界面,最后的解决办法是安装微软的.NET framework 2.0这个环境。才能安装成功,还有安装J-LINK之类的官网的用户手册都有

3.芯片手册
大概说一下,我只是看了下WTD,GPIO,RADIO,ADC,UART,后面的如果有研究在更

4.WDT详情见芯片手册
代码:
[cpp] view plain copy 在CODE上查看代码片派生到我的代码片

ifndef __WDT__H

define __WDT__H

void wdt_start(void);
void wdt_stop(void);
void wdt_feed(void);
void wdt_init(void);

endif

include “nrf51.h”

include “nrf51_bitfields.h”

define RELOAD_COUNT (32768*60*3-1) //3 minutes

void wdt_init(void)
{
NRF_WDT->TASKS_START = 0;
NRF_WDT->CRV = RELOAD_COUNT;
NRF_WDT->CONFIG =
WDT_CONFIG_HALT_Pause << WDT_CONFIG_HALT_Pos |
WDT_CONFIG_SLEEP_Pause << WDT_CONFIG_SLEEP_Pos;
NRF_WDT->RREN = WDT_RREN_RR0_Enabled << WDT_RREN_RR0_Pos;
}

void wdt_start(void)
{
NRF_WDT->TASKS_START = 1;
}

void wdt_feed(void)
{
if(NRF_WDT->RUNSTATUS & WDT_RUNSTATUS_RUNSTATUS_Msk)
NRF_WDT->RR[0] = WDT_RR_RR_Reload;
}

void wdt_stop(void)
{
NRF_WDT->TASKS_START = 0;
}

上面 我们 设置看看门狗
1.溢出时间为3s
2.debuger仿真的时候看门狗停止
3.CPU睡眠的时候看门狗停止
注意:1.看门狗只要一启动就不能关闭了。不同通过wdt_stop()来关闭
2.如果在app启动了定时器。那在空中升级的程序也必须喂狗。
在main.c中
[cpp] view plain copy 在CODE上查看代码片派生到我的代码片
wdt_start();
// Enter main loop
for (;;) {
app_sched_execute();

wdt_feed();
;/strong> power_manage();
}

3.GPIO见手册

4.RADIO代码
协议:图片复制不上来自己看手册
代码
void TxData(void)
{

    id_buf[0] = 0x57;   
    id_buf[1] = 0;
    id_buf[2] = 0;          
    id_buf[3] = 0;
    id_buf[4] = 0;
    id_buf[5] = 0;  
    id_buf[6] = cur;
    id_buf[7] = 'B';
    id_buf[8] = 0xaa;           

}

void system_init (void)
{
clock_init();
lfclk_config();
}

void radio_disable(void)

{

NRF_RADIO -> TASKS_STOP = 1;
NRF_RADIO -> TASKS_TXEN = 0;
NRF_RADIO -> TASKS_RXEN = 0;
NRF_RADIO -> TASKS_STOP = 1;
NRF_RADIO -> TASKS_DISABLE = 1;
NRF_RADIO -> POWER = 0;

}

void Radio_Set_RX(void )
{
nrf_gpio_pin_write(Txpoweren,0);
nrf_gpio_pin_write(Rxpoweren,1);
NVIC_DisableIRQ(RADIO_IRQn);
radio_disable();
#ifdef F250K
radio_configureM(TxAdderss,RxAdderss,RADIO_MODE_MODE_Nrf_250Kbit,RADIO_TXPOWER_TXPOWER_Pos4dBm,Fren,RX_MODE);
#else
radio_configureM(TxAdderss,RxAdderss,RADIO_MODE_MODE_Nrf_1Mbit,RADIO_TXPOWER_TXPOWER_Pos4dBm,Fren,RX_MODE);
#endif
NVIC_EnableIRQ(RADIO_IRQn);
__enable_irq();
//set Priority of IRQ
NVIC_SetPriority(RADIO_IRQn,6);
NVIC_EnableIRQ(RADIO_IRQn);

//NRF_RADIO->PACKETPTR  = (uint32_t)buf;
                    // set receive finish interrupt
NRF_RADIO->INTENSET = RADIO_INTENSET_END_Enabled << RADIO_INTENSET_END_Pos;         
NRF_RADIO->EVENTS_READY = 0U;        
NRF_RADIO->TASKS_RXEN   = 1U; // Enable radio.
while(NRF_RADIO->EVENTS_READY == 0U) // Wait for an event to be ready.
{
                // Do nothing.
}               
NRF_RADIO->EVENTS_END  = 0U;        
NRF_RADIO->TASKS_START = 1U; // Start listening and wait for address received event.

    //temp++;
//     radio_rx_mode(buf,cnt_num);

}

void Radio_Set_TX(uint8_t pwr)
{
//uint8_t temp=0xff;
//uint32_t tempcount=0;
unsigned char datapwr;
switch(pwr)
{
case 8:
datapwr=RADIO_TXPOWER_TXPOWER_Pos4dBm;
break;
case 7:
datapwr=RADIO_TXPOWER_TXPOWER_0dBm;
break;
case 6:
datapwr=RADIO_TXPOWER_TXPOWER_Neg4dBm;
break;
case 5:
datapwr=RADIO_TXPOWER_TXPOWER_Neg8dBm;
break;
case 4:
datapwr=RADIO_TXPOWER_TXPOWER_Neg12dBm;
break;
case 3:
datapwr=RADIO_TXPOWER_TXPOWER_Neg16dBm;
break;
case 2:
datapwr=RADIO_TXPOWER_TXPOWER_Neg20dBm;
case 1:
datapwr=RADIO_TXPOWER_TXPOWER_Neg30dBm;
default:
datapwr=RADIO_TXPOWER_TXPOWER_Pos4dBm;
break;
}
nrf_gpio_pin_write(Txpoweren,1);
nrf_gpio_pin_write(Rxpoweren,0);
NVIC_DisableIRQ(RADIO_IRQn);
radio_disable();
//radio_configure();
RadioMode.TxAdderss_S = TxAdderss;
RadioMode.RxAddersses = RxAdderss;
#ifdef F250K
RadioMode.DataSize = RADIO_MODE_MODE_Nrf_250Kbit;
#else
RadioMode.DataSize = RADIO_MODE_MODE_Nrf_1Mbit;
#endif
RadioMode.TxPower = datapwr; //RADIO_TXPOWER_TXPOWER_Pos4dBm;
RadioMode.Frequen = Fren;
RadioMode.Mode = TX_MODE;
radio_configure_M(&RadioMode);
NVIC_EnableIRQ(RADIO_IRQn);
__enable_irq();
NVIC_SetPriority(RADIO_IRQn,6); //set Priority of IRQ
NVIC_EnableIRQ(RADIO_IRQn);

//NRF_RADIO->PACKETPTR  = (uint32_t)buf;
                    // set receive finish interrupt
//NRF_RADIO->INTENSET = RADIO_INTENSET_END_Enabled << RADIO_INTENSET_END_Pos;           

}

void radio_rx_receive(uint8_t* buf)
{
//int datatemp;
//ErrorRecFlag=0;
NRF_RADIO->PACKETPTR = (uint32_t)buf;
NRF_RADIO->EVENTS_END = 0U;
NRF_RADIO->TASKS_START = 1U; // Start listening and wait for address received event.
Rx_flag=0;
// Wait for the end of the packet.
/*while(NRF_RADIO->EVENTS_END == 0U)
{
// Do nothing.
datatemp++;
if(datatemp>0x7fff11ff)
{
ErrorRecFlag=1;
return;
}
}*/
}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值