nrf52832的radio外设
目前国内大多ble外设都是都是直接将ble的controller封死的,导致无法直接利用芯片的
radio(射频)外设,直接去模拟广播。
nordic系列都可以直接控制radio外设,可以通过直接配置寄存器来模拟广播,其寄存器
可以查看其芯片手册,也可以看俺关于radio的讲解,哈哈
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/fb124c95fe755551039a78239471ef2b.png)
广播协议格式
任何一些都有其格式,不同格式表示的含义不同。下面就是BLE广播的格式。
从左往右以此:
1、前导码 不需要懂它、也不用用管它,固定的,由芯片自行设置
2、接入地址 广播信道固定地址,用于表示广播的。
3、报头、长度就不用说了,每个位置表示各自含义。
4、数据载荷就是承载的数据。
数据载荷的格式,第一个字节表示长度,后面表示数据。数据又可以自定义格式。哈哈,for example:
02 11 15 02表示长度,11 15就是数据,至于11 15表示什么含义,可以自己定义或者遵循别人协议。
更具体的看俺的蓝牙广播格式帖子哦
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/b43536ac76c912fdfd8453cd72f856c3.png)
寄存器设置和代码编写
通过设置其寄存器之后,然后使用其event事件去触发发送。其寄存器主要代码是:
void radio_init(void){
NRF_RADIO->BASE0 = (0x89BED600);
NRF_RADIO->BASE1 = (0x89BED600);
NRF_RADIO->PREFIX0 = 0x8E8E8E8E;
NRF_RADIO->PREFIX1 = 0x8E8E8E8E;
NRF_RADIO->TXADDRESS = 0;
NRF_RADIO->CRCCNF = (3<<0) | (1<<8);
NRF_RADIO->CRCPOLY = 0x100065b;
NRF_RADIO->CRCINIT = 0x555555;
NRF_RADIO->PACKETPTR = (uint32_t)&adv_array[0];
NRF_RADIO->FREQUENCY = 2;
NRF_RADIO->TXPOWER = 0x04;
NRF_RADIO->MODE = 0x03;
NRF_RADIO->PCNF0 = (8<<0) | (1<<8);
NRF_RADIO->PCNF1 = (31<<0) |(0<<8)|(3<<16) | (1<<25) ;
NRF_RADIO->DATAWHITEIV = 0x25;
}
让广播占领整个广播信道
这里来个有趣的,既然可以模拟广播了,那就尝试占领整个信道。其实简单的说就是模拟超多不同MAC
地址哈哈。其实很简单的哦。用nrf connect来查看下效果。
其主要代码如下所示,代码写的很曹凑合看吧。
void radio(){
init_clock();
radio_init();
set_advdata();
while(1){
for(int j=0;j<100;j++) {
for(int i=0;i<0xFF;i++){
device_add[0]=j;
device_add[1]=(i+1)%0xFF;
device_add[2]=(i+2)%0xFF;
device_add[3]=(i+3)%0xFF;
device_add[4]=(i+4)%0xFF;
device_add[5]=(i+5)%0xFF;
for(int i=0;i<3;i++){
send_data();
}
}
for(int i=0;i<0xFF;i++){
device_add[0]=j+2;
device_add[1]=(i+1)%0xFF;
device_add[2]=(i+2)%0xFF;
device_add[3]=(i+3)%0xFF;
device_add[4]=(i+4)%0xFF;
device_add[5]=(i+5)%0xFF;
for(int i=0;i<3;i++){
send_data();
}
}
for(int i=0;i<0xFF;i++){
device_add[0]=j+3;
device_add[1]=(i+1)%0xFF;
device_add[2]=(i+2)%0xFF;
device_add[3]=(i+3)%0xFF;
device_add[4]=(i+4)%0xFF;
device_add[5]=(i+5)%0xFF;
for(int i=0;i<3;i++){
send_data();
}
}
for(int i=0;i<0xFF;i++){
device_add[0]=j+4;
device_add[1]=(i+1)%0xFF;
device_add[2]=(i+2)%0xFF;
device_add[3]=(i+3)%0xFF;
device_add[4]=(i+4)%0xFF;
device_add[5]=(i+5)%0xFF;
for(int i=0;i<3;i++){
send_data();
}
}
}
}
}
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/28aac5e6a6fd11e10173490e08894650.png)
一个大胆的想法,就是干扰信道。
就是上边的哦,通过在广播PDU中声明大量的MAC地址。
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/a08fa0b8361c5a57496c336b3fdd53ab.png)
结果与总结
结果就是上边那个长图,如果是只是广播一个设备,只要要一个MAC地址了。多个不同广播,就多个MAC地址。
项目上传到CSDN吧,只需要在keil中烧录,然后在nrf connect中查看想过就行。
https://download.csdn.net/download/beidideshu/86341416