欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

第二部分 基础篇-第11章 CC2530随机数发生器

程序员文章站 2022-06-11 18:43:49
...

1 理论分析

1.1 CC2530 随机数发生器简介

随机数发生器有如下功能。
 产生伪随机字节,可以被 CPU 读取,或由命令选通处理器直接使用。
 计算写入到 RNDH 的 CRC16 字节。
 由写入到 RNDL 的值播种。
随机数发生器是一个 16 位的线性反馈移位寄存器 LFSR,带有多项式 X 16 + X15 + X 2 +1(即 CRC16) 。根据执行的操作,它使用不同级别的展开值。基本的形式(不展开)如下图所示。当 ADCCON1.RCTRL=11 时,随机数发生器就关闭。

第二部分 基础篇-第11章 CC2530随机数发生器

图 1 随机数发生器的基本结构

1.2 CC2530 随机数发生器的运行

随机数发生器的运行是由 ADCCON1.RCTRL 位控制的。LFSR 的 16 位移位寄存器的当前值可以从 RNDH 和 RNDL 寄存器中读取。
1、伪随机数序列的生成
默认操作(ADCCON1.RCTRL 是 00)是命令选通处理器每次读取随机值,就通知LFSR 一次(不展开的 13x,其中通知不展开的 13x 意味着执行 13 次反馈移位的一个操作等式) 。这保证来自 LFSR 末端的 LSB 一个新的伪随机字节的有效性。更新 LFSR的另一种方式是设置 ADCCON1.RCTRL 为 01。这将每次通知 LFSR(不展开的 13x) ,且当操作完成时,ADCCON1.RCTRL 位将自动清除。
2、种子数的产生
LFSR 可以通过写入 RNDL 寄存器两次产生种子数。每次写入 RNDL 寄存器,LFSR 的 8 位 LSB 复制到 8 位 MSB,8 位 LSB 被替换为写入 RNDL 的新的数据字节。当需要一个真正的随机值,LFSR 应通过写入 RNDL 产生种子,随机值来自在 RF接收路径的 IF_ADC。要使用这种产生种子的方法,无线电必须首先上电。无线电应处于无限 TX 状态,以避免 RX 状态可能的同步检测。来自 IF_ADC 的随机值从 RF 寄存器 RFRND 中读出。读出的值作为种子值写入 RNDL 寄存器,如上所述。注意这可以在为正常任务使用无线电时完成。
请注意种子值 0x0000 或 0x8003 将总会导致 LFSR 中的值通知之后不改变,因为没有值通过 in_bit 推入,因此,不能用于随机数的产生。
3、CRC16
LFSR 也可以用于计算一个字节序列的 CRC 值。 写入 RNDH 寄存器的操作将触发一个 CRC 计算。新的字节从 MSB 末端处理,使用一个 8x 的未展开式,这样一个新的字节可以在每个时钟周期写入到 RNDH。注意在开始 CRC 计算之前,LFSR 必须通过写 RNDL 正确产生随机数。通常产生的用于 CRC 计算的种子数值应该是 0x0000 或0xFFFF。

2 实验详解

2.1 实验目的

1)、了解 CC2530 随机数发生器的功能;
2)、掌握 CC2530 的随机数发生器的使用。

2.2实验设备

硬件:PC 机一台,ZB2530(底板、核心板、仿真器、USB 线)一套;
软件:2000/XP/win7 系统,IAR 8.20 集成开发环境。

2.3实验分析

本实验用到了串口、随机数发生器相关寄存器,在此只给出随机数发生器的相关寄存器。

表1随机数发生器数据低字节

第二部分 基础篇-第11章 CC2530随机数发生器

表2随机数寄存器RNOH

第二部分 基础篇-第11章 CC2530随机数发生器

2.5参考代码(部分代码)

/**Includes*********************************************************************/
#include "ioCC2530.h"
#include "Uart.h"
#include "hal.h"

/**宏定义***********************************************************************/
#define KEY1 P0_4  
#define LED1 P1_0

/**函数声明*********************************************************************/
void Init_RandomGenerator(void);

/**全局变量*********************************************************************/
uint Random=0;// Random Sequence
char TX_data[4];

/**
  * @brief     主函数
  * @param     None
  * @retval    None
  */
void main(void)
{      
  uint Data_H,Data_L;

  SetSysClock();  //设置系统时钟为32MHz  
  InitUART();  //初始化串口
  Init_RandomGenerator(); //初始化随机数发生器   

  while(1)
  {       

    //更新LFSR    
    ADCCON1 |= 0x04;

    // Read Randomom register                 
    Data_H=RNDH;  //读相关寄存器
    Data_L=RNDL;

    Random = (((uint)Data_H << 8) | Data_L);//获取随机数
    memset(TX_data, 0, sizeof(TX_data));

    TX_data[0]=(char)(Random/4096);   //数据处理
    TX_data[1]=(char)((Random%4096)/256);
    TX_data[2]=(char)(((Random%4096)%256)/16);
    TX_data[3]=(char)(((Random%4096)%256)%16);

    UartSend_String(TX_data,4);  //串口发给电脑显示

    Delayms(1000);
  }
}

/**
  * @brief     初始化随机数发生器
  * @param     None
  * @retval    None
  */
void Init_RandomGenerator(void)
{  
   /*当需要一个真正的随机值,LFSR 应通过写入RNDL 产生种子,
     随机值来自在RF 接收路径的IF_ADC。要
     使用这种产生种子的方法,无线电必须首先上电*/
    RFRND = 0x04;

   // 等待上电完毕
    while( RFRND & 0x10 );

   //无线电应处于无限TX 状态,以避免RX 状态可能的同步检测
    RFST = 0xE2;
    Delayms(1);

    /*RCTRL[1:0]---控制16 位随机数发生器
      [00:] 正常运行。(13X 型展开)*/
    ADCCON1 &= ~0x0C;   

    RNDH = ADCTEST2;

    /*更新LFSR 的一种方式是设置ADCCON1.RCTRL 为01。
      [01:] LFSR 的时钟一次(没有展开).*/
    ADCCON1 |= 0x04;
}

2.6实验现象

编译下载程序到开发板上,通过串口可以看到随机数打印出来。

第二部分 基础篇-第11章 CC2530随机数发生器

图2

【注】通过设置时,要以16进制方式查看。

附:管理随机数发生器的寄存器类型

●RNDL (0xBC) - 随机数发生器数据低字节
●RNDH (0xBD)–随机寄存器 RNDH

本章参考代码

点击进入

相关标签: CC2530 随机数