您的位置:首页 > 其它

NRF51822 2.4G无线

2016-03-25 16:52 169 查看
一.我用的是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;

}

}*/

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: