MSP430F149学习总结 1.MSP430F149的时钟
MSP430F149有三种时钟信号源:LFXT1CLK、XT2CLK、DCOCLK MSP430F149有三种时钟信号:MCLK、SMCLK、ACLK 上电复位时
MCLK和SMCLK的信号源为DCOCLK,ACLK的信号源只能为LFXT1CLK。 与时钟有关的寄存器有以下5个:
DCOCTL、BCSCTL
1、BCSCTL
2、IE
1、IFG1 (1) 基本时钟的配置
DCOCTL用于配置DCO。
SCBCTL1最高位用于指示是否允许使用XT2晶振,其它位用于设置ACLK。 SCBCTL2用于设置MCLK和SMCLK的时钟源及分频比。 IE1和IFG1有分别有一位用于指示中断允许与中断标志。
(2) 时钟配置程序
P2.0输出ACLK信号 #include Void main(void) { Unsigned int i; WDTCTL=WDTPW+WDTHOLD; BCSCTL1|=XTS;//打开XT2晶振
P2DIR|=0x01; P2SEL|=0x01; P1DIR|=0x02; Do{
IFG1&=~OFIFG;
For(i=0xFF;i>0;i--) }while((IFG1&OFIFG)); BCSCTL2|=SELM_3;设置主时钟的时钟源为XT2CLK For(;;) {
P1OUT|=0x02;
P1OUT&=~0x02; } } 2.MSP430F149看门狗定时器
WDT定时器有二种工作模式:看门狗模式和内部定时器模式
二种模式下定时到时都会产生中断。
与WDT操作有关的寄存器为:WDTCTL、IE
1、IFG1 WDTCTL为16位寄存器,高字节为口令字05AH,低字节如下图:
1 WDTHOLD控制定时器是否工作。 WDTNMIES选择非屏蔽中断触发沿
WDTNMI设置RST/NMI的引脚的功能,复位或中断功能 WDTTMSEL选择工作模式
WDTCNTCL 是否清零WDT计数器 WDTSSEL选择WDT的时钟信号 WDTISx设置定时长度。
IE1中有NMIIE和WDTIE指示是否允许WDT中断
IFG1中有NMIIFG和WDTIFG指不是否有NMI中断和WDT中断
程序:
使用看门狗定时器产生一个方波
#include {
WDT=WDT_MDLY_32;
IE1|=WDTIE;
P1DIR|=0x01;
_EINT();
While(1)
{
_BIS_SR(CPUOFF);
_NOP();
} } #pragma vector=WDT_VECTOR __i nterrupt void watchdog(void) {
P1OUT^=0x01; } 3.MSP430F149的IO端口
1.MSP430149有6个8位的IO端口,每个端口都有第二功能。P1和P2端口还有中断功能。
2.每个端口都有PxIN、PxOUT、PxDIR和PxSEL寄存器。P1和P2还有与中断有关的寄存器PxIFG、PxIES、PxIE寄存器。PxIN只读。PxDIR为方向寄存器。PxSEL为功能选择寄存器。 IO端口操作:
#include Void main(void) {
WDTCTL=WDTPW+WDTHOLD;
P1DIR=0x01;//P1.0输出
P1OUT|=BIT0;//P1.0输出”1”; } IO中断操作
#include Void main(void)
2 {
WDTCTL=WDTPW+WDTHOLD;
P3DIR=0x01;
P1IES=0x01;//下降沿触发
P1IE=0x01;//P1.0中断允许
_EINT;
While(1); } #pragma vect=PORT1_VECTOR {
P3OUT^=0x01; } 4.定时器A 写时器A的时钟信号可以是ACLK、SMCLK或者是处部时钟信号TACLK和TAINCLK 定时器A为具有捕获与比较功能的16位定时器。定时器的工作模式有4种:
停止模式、增计数模式、连续计数模式、增/减模式
与定时器A相关的寄存器有TACTL、TAR、TACCTL0、TACCR0、TACCTL
1、TACCR
1、TACCTL
2、TACCR
2、TAIV TACTL寄存器如下:
TASSELx用于选择时钟信号,IDx用于选择分频比,MCx选择工作模式,TACLR用于清零计数器,TAIE用于控制是否允许定时器中断。TAIV用于保存中断向量。
在不使用定时器的比较/捕获功能时只用到TACTL、TAR和TAIV寄存器。 在要使用定时器的比较/捕获功能时就要用到另外的二个寄存器了。TACCTLx和TACCRx。TACCTx如下:
3
CMx用于触发沿选择,CCISx用于选择输入,SCS指示是否同与定时器的时钟信号同步,CAP用于选择是比较还是捕获,OUTTMODx用于选择输出模式,CCIE是否允许中断。CCI用于读输入信号,OUT比较输出控制。 程序:
1. 定时器的一般功能使用
#include Void main(void) { WDTCTL=WDTPW+WDTHOLD; P1DIR|=0x01; TACTL=TASSEL_1+MC_2+TAIE;//使用ACLK时钟信号,连续计数模式,允许中断
_BIS_SR(LPM3_bits+GIE); } #pragma vector=TIMERA1_VECTOR __interrupt void Timer_A(void) { Switch(TAIV) {
Case 2:break;
Case 4:break;
Case 10:P1OUT^=0x01;break; } } 2. 用定时器产生PWM波形
#include Void main(void) { WDTCTL=WDTPW+WDTHOLD; P1DIR|=0x0C; P1SEL|=0x0C; CCR0=512-1; CCTL1=OUTMOD_7; CCR1=284;
4 CCTL2=OUTMOD_7; CCR2=128; TACTL=TASSEL_1+MC_1; _BIS_SR(LMP3_bits); } 5.USART的SPI模式
首先SPI有主机模式和从机模式之分,在MSP430F149中SPI还有三引脚与四引脚之分。 三引脚与四引脚的区别为STE引脚。在从机模式时,当使用4引脚时允许在单个SPI总线上有多个主机。使用3引脚时,STE引脚不用。
4引脚主机模式时:STE=1 SIMO和UCLK操作正常,STE=0时SIMO和UCLK设计为输入。 4引脚从机模式时:STE=1;收发不允许SOMI强制为输入,STE=0时,收发允许SOMI正常。
与USART有关的寄存器有:UxCTL、UxTCTL、UxRCTL、UxMCTL、UxBR0、UxBR
1、UxRXBUF、UxTXBUF、MEx、IEx、IFGx。
UxCTL寄存器USART控制寄存器,UxTCTL发送控制寄存器,UxRCTL接收控制寄存器,UxMCTL模式控制寄存器,SPI时未用。 程序:
#include void main(void) {
WDTCTL=WDTPW+WDTHOLD;
P3DIR=0xff;
U0CTL=CHAR+SYNC+MM+SWRST;
U0TCTL=SSEL0+STC;
ME1|=USPIE0;
ME2|=USPIE0;
U0CTL&=(~SWRST);
IE1=UTXIE0+URXIE0;
IE2|=(UTXIE0+URXIE0);
_BIS_SR(LPM0_bits + GIE); } #pragma vector=USART0TX_VECTOR __interrupt void spi_tx(void) {
P4OUT=~P4OUT; } #pragma vector=USART0RX_VECTOR __interrupt void spi_rx(void) {
U0TXBUF=U0RXBUF;
P3OUT=U0RXBUF; } 6.ADC12 时钟信号可以为ACLK、MCLK、SMCLK和ADC12OSC。ADC12OSC必须在5M以内。 ADC12有8个外部输入和4个内部输入。
5 的参考电压可以为内部或外部。
内部电压参考1.5和2.5可选。外部电压通过VeREF+和VREF-/VeREF-提供。 ADC12有二种采样方式Extended Sample Mode和Pulse Sample Mode。
ADC12 的转换方式有单通道单次转换,顺序通道单次转换,单通道多次转换,顺序通道多次转换。
与ADC12有关的寄存器:
ADC12CTL0、ADC12CTL
1、ADC12IFG、ADC12IE、ADC12IV、ADC12MEM0-
15、ADC12MCTL0-15。 程序示例:
//***************************************************************************** // Single Channel Rpt Mode, TA1 as Sample Trigger // // Description: Sample and convert A0 using Timer_A as sample trigger in // Pulse Sample mode.Put \"Num_of_Results\" ADC12MEM0 values in results[] // and Light LED (P1.0) when done.// //
MSP430F149 //
--------------- //
|
| //
Vin -->|P6.0/A0
| //
|
| // //***************************************************************************** #include
#define
Num_of_Results
512 int results[Num_of_Results] = {0};
void ADC_Init(void);
void main(void) {
WDTCTL = WDTPW | WDTHOLD;
// Disable the Watchdog.
ADC_Init();
// Initialize ADC12
ADC12CTL0 |= ENC;
// Start conversion
_BIS_SR(LPM0_bits);
// Enter LPM0 }
void ADC_Init(void) {
P1DIR = 0xff;
// set port to outputs
P1OUT = 0;
// reset port outputs
P6SEL |= 0x01;
// select A0 input
ADC12CTL0 = ADC12ON+SHT0_1+REF2_5V+REFON; // Setup ADC12
6 ADC12CTL1 = SHP+CONSEQ_2+SHS_1;
// Timer triggers sampling
ADC12MCTL0 = INCH_0 + SREF_1;
ADC12IE = 0x0001;
// Enable ADC12IFG.0
TACCR0 = 1500;
// Delay to allow Ref to settle
TACCTL0 |= CCIE;
// Compare-mode interrupt.
TACTL = TASSEL_1 | MC_1;
// TACLK = ACLK, Up mode.
_BIS_SR(LPM3_bits + GIE);
// Wait for delay, Enable interrupts
TACCTL0 &= ~CCIE;
P2SEL |= BIT3;
P2DIR |= 0x08;
TACCR0 = 7;
TACCR1 = 4;
TACCTL1 = OUTMOD_3;
TACTL = TACLR | MC_1 | TASSEL_1;
}
// Timer_A0 Interrupt Service Routine #pragma vector=TIMERA0_VECTOR __interrupt void ta0_isr(void) {
TACTL = 0;
LPM3_EXIT;
}
// ADC12 Interrupt Service Routine #pragma vector=ADC12_VECTOR __interrupt void ADC12ISR (void) {
static unsigned int index = 0;
results[index++] = ADC12MEM0;
if (index == 512)
{
ADC12CTL0 &= ~ENC;
index = 0;
P1OUT |= 0x01;
_BIS_SR(LPM3_bits);
} }
// Disable timer // Set for Timer A1
// Init TACCR0 w/ sample prd=CCR0+1
// Trig for ADC12 sample & convert
// Set/reset
// ACLK, clear TAR, up mode
// Exit LPM3 on return // Move results
// Stop conversion // Enter LPM3 7
NRF24L01学习总结
NRF24L01有四种工作模式: Power Down Mode, Standby Modes, Rx mode , Tx mode 工作模式由CONFIG寄存器的PWR_UP和PRIM_RX位和CE引脚控制.模式配置图如下:
NRF24L01的操作是基于状态图的:
NRF24L01的发送方式有二种,增强形发送方式和直接发送方式.直接发送方式要自己处理与协议有关的数据操作起来复杂因而很少使用.使用增强形发送方式有芯片可以自动处理封包,使编程复杂度大大降低.使用培增强形发送模式时数据帧格式如下图:
8 NRF24L01的数据接口为SPI接口。NRF24L01的SPI命令有以下几个: R_REGISTER W_REGISTER R_RX_PAYLOAD R_RX_PAYLOAD FLUSH_TX FLUSH_RX REUSE_TX_PL ACTIVATE R_RX_PL_WID W_ACK_PAYLOAD W_TX_PAYLOAD_NO_ACK NOP 有些命令只能在特定的模式下使用: 例如:W_RESISTER只能在power down和standby模式下使用,R_RX_PAYLOAD只能在RX mode下使用等。
例一个重要的是NRF24L01的时序:
9 由图知:
第次spi操作时总是先写入一字节命令,并返回NFR24L01的状态寄存器值,然后写入要定入的若干字节。
NRF24L01发送端程序示例: #include
typedef unsigned int uint; typedef unsigned char uchar;
#define TX_ADDR_WIDTH 5 #define RX_ADDR_WIDTH 5 #define TX_PAYLOAD_WIDTH 32 #define RX_PAYLOAD_WIDTH 32
//********************SPI命令************************* #define R_REGISTER 0x00 #define W_REGISTER 0x20 #define R_RX_PAYLOAD 0x61 #define W_TX_PAYLOAD 0xa0 #define FLUSH_TX 0xe1 #define FLUSH_RX 0xe2 #define REUSE_TX_PL 0xe3 #define ACTIVATE 0x50 #define R_RX_PL_WID 0x60 #define W_ACK_PAYLOAD 0xa8 #define W_TX_PAYLOAD_NO_ACK 0xb0 #define NOP
0xff
10 //**************NRF24L01寄存器地址************* #define CONFIG
0x00 #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 RX_DR
0x40
#define OBSERVE_TX 0x08 #define CD
0x09 #define RX_ADDR_P0 0x0a #define TX_ADDR
0x10 #define RX_PW_P0 0x11 #define FIFO_STATUS 0x17 #define DYNPD
0x1c #define FEATURE
0x1d //***************NRF24L01端口定义********************* sbit MISO =P1^3; sbit MOSI =P1^4; sbit SCK
=P1^2; sbit CE
=P1^1; sbit CSN =P3^2; sbit IRQ =P3^3; //NRF地址
uchar code TX_ADDRESS[5]={0x01,0x02,0x03,0x04,0x05}; uchar code RX_ADDRESS[5]={0x01,0x02,0x03,0x04,0x05}; //****************函数************************ void delayus(uchar us); void delayms(uchar ms); uchar SPI_RW(uchar dat); uchar NRF_ReadStatus(void); uchar NRF_RW_Reg(uchar reg,uchar dat); uchar NRF_WriteBuf(uchar reg,uchar *buf,uchar len); uchar NRF_ReadBuf(uchar reg,uchar *buf,uchar len); void SetRxmode(void); void TxPacket(uchar *buf); uchar RxPacket(uchar *buf); void NRF_Config(void); uchar Date[32]={1,2,3,4,5,6,7,8,9,10,11,12}; void main(void)
11 P2=0x0e; P0=0x87; delayms(11); NRF_Config(); TxPacket(Date); RxPacket(Date); delayms(100); P0=0x03; while(1) {
TxPacket(Date);
delayms(100);
P0=0x65;
delayms(100);
P0=0x32; }
} void delayus(uchar us) { while(us--); } void delayms(uchar ms) { while(ms--)delayus(250); } uchar SPI_RW(uchar dat) { uchar bit_ctr; for(bit_ctr=0;bit_ctr
MOSI=(dat&0x80);
dat=dat
SCK=1;
dat|=MISO;
SCK=0; } return dat; } uchar NRF_ReadStatus(void) { uchar ret; CSN=0; ret=SPI_RW(NOP);
12 CSN=1; return ret; } uchar NRF_RW_Reg(uchar reg,uchar dat) { uchar status; CSN=0; status=SPI_RW(reg); SPI_RW(dat); CSN=1; return status; } uchar NRF_WriteBuf(uchar reg,uchar *buf,uchar len) { uchar status; CSN=0; status=SPI_RW(reg); while(len) {
SPI_RW(*buf++);
len--; } CSN=1; return status; } uchar NRF_ReadBuf(uchar reg,uchar *buf,uchar len) { uchar status; CSN=0; status=SPI_RW(reg); while(len) {
*buf++=SPI_RW(0);
len--; } CSN=1; return status; } void SetRxmode(void) { CE=0; NRF_RW_Reg(W_REGISTER+CONFIG,0x0f); CE=1; }
13 { CE=0; NRF_RW_Reg(W_REGISTER+CONFIG,0x0e); // CE=1; // delayus(10); NRF_WriteBuf(W_TX_PAYLOAD,buf,TX_PAYLOAD_WIDTH); CE=1; delayus(150); CE=0; } uchar RxPacket(uchar *buf) { uchar status,ret=0; SetRxmode(); delayus(130); status=NRF_ReadStatus(); if(status&RX_DR) {
NRF_ReadBuf(R_RX_PAYLOAD,buf,TX_PAYLOAD_WIDTH);
ret=1; } NRF_RW_Reg(W_REGISTER+STATUS,status); return ret; } void NRF_Config(void) { CE=0; CSN=1; SCK=0; NRF_RW_Reg(W_REGISTER+CONFIG,0x0f); delayms(2); NRF_RW_Reg(W_REGISTER+EN_AA,0x01); NRF_RW_Reg(W_REGISTER+EN_RXADDR,0x01); NRF_RW_Reg(W_REGISTER+SETUP_AW,0x03); NRF_RW_Reg(W_REGISTER+SETUP_RETR,0x1a); NRF_RW_Reg(W_REGISTER+RF_CH,0x00); NRF_RW_Reg(W_REGISTER+RF_SETUP,0x07); NRF_WriteBuf(W_REGISTER+RX_ADDR_P0,RX_ADDRESS,0x05); NRF_WriteBuf(W_REGISTER+TX_ADDR,TX_ADDRESS,0x05); NRF_RW_Reg(W_REGISTER+RX_PW_P0,RX_PAYLOAD_WIDTH); CE=1; } NRF24L01接收端程序示例:
14
typedef unsigned int uint; typedef unsigned char uchar;
#define TX_ADDR_WIDTH 5 #define RX_ADDR_WIDTH 5 #define TX_PAYLOAD_WIDTH 32 #define RX_PAYLOAD_WIDTH 32
//********************SPI命令************************* #define R_REGISTER 0x00 #define W_REGISTER 0x20 #define R_RX_PAYLOAD 0x61 #define W_TX_PAYLOAD 0xa0 #define FLUSH_TX 0xe1 #define FLUSH_RX 0xe2 #define REUSE_TX_PL 0xe3 #define ACTIVATE 0x50 #define R_RX_PL_WID 0x60 #define W_ACK_PAYLOAD 0xa8 #define W_TX_PAYLOAD_NO_ACK 0xb0 #define NOP
0xff //**************NRF24L01寄存器地址************* #define CONFIG
0x00 #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 RX_DR
0x40
#define OBSERVE_TX 0x08 #define CD
0x09 #define RX_ADDR_P0 0x0a #define TX_ADDR
0x10 #define RX_PW_P0 0x11 #define FIFO_STATUS 0x17 #define DYNPD
0x1c #define FEATURE
0x1d //***************NRF24L01端口定义*********************
15 MISO =P1^3; sbit MOSI =P1^4; sbit SCK
=P1^2; sbit CE
=P1^1; sbit CSN =P3^2; sbit IRQ =P3^3; //NRF地址
uchar code TX_ADDRESS[5]={0x01,0x02,0x03,0x04,0x05}; uchar code RX_ADDRESS[5]={0x01,0x02,0x03,0x04,0x05}; //****************函数************************ void delayus(uchar us); void delayms(uchar ms); uchar SPI_RW(uchar dat); uchar NRF_ReadStatus(void); uchar NRF_RW_Reg(uchar reg,uchar dat); uchar NRF_WriteBuf(uchar reg,uchar *buf,uchar len); uchar NRF_ReadBuf(uchar reg,uchar *buf,uchar len); void SetRxmode(void); void TxPacket(uchar *buf); uchar RxPacket(uchar *buf); void NRF_Config(void); uchar Date[32]={1,2,3,4,5,6,7,8,9,10,11,12}; void main(void) { uchar i; P2=0x0e; P0=0x87; delayms(11); NRF_Config(); TxPacket(Date); RxPacket(Date); delayms(250); P0=0x03; while(1) {
i=RxPacket(Date);
if(i==1)
{
P0=0x53;
delayms(100);
i=0;
P0=0xff;
delayms(100);
}
16 else
{
P0=0xfe;
delayms(100);
} }
} void delayus(uchar us) { while(us--); } void delayms(uchar ms) { while(ms--)delayus(250); } uchar SPI_RW(uchar dat) { uchar bit_ctr; for(bit_ctr=0;bit_ctr
MOSI=(dat&0x80);
dat=dat
SCK=1;
dat|=MISO;
SCK=0; } return dat; } uchar NRF_ReadStatus(void) { uchar ret; CSN=0; ret=SPI_RW(NOP); CSN=1; return ret; } uchar NRF_RW_Reg(uchar reg,uchar dat) { uchar status; CSN=0; status=SPI_RW(reg); SPI_RW(dat); CSN=1; return status;
17 uchar NRF_WriteBuf(uchar reg,uchar *buf,uchar len) { uchar status; CSN=0; status=SPI_RW(reg); while(len) {
SPI_RW(*buf++);
len--; } CSN=1; return status; } uchar NRF_ReadBuf(uchar reg,uchar *buf,uchar len) { uchar status; CSN=0; status=SPI_RW(reg); while(len) {
*buf++=SPI_RW(0);
len--; } CSN=1; return status; } void SetRxmode(void) { CE=0; NRF_RW_Reg(W_REGISTER+CONFIG,0x0f); CE=1; } void TxPacket(uchar *buf) { CE=0; NRF_RW_Reg(W_REGISTER+CONFIG,0x0e); // CE=1; // delayus(10); NRF_WriteBuf(W_TX_PAYLOAD,buf,TX_PAYLOAD_WIDTH); CE=1; delayus(150); CE=0; }
18 { uchar status,ret=0; SetRxmode(); delayus(130); status=NRF_ReadStatus(); if(status&RX_DR) {
NRF_ReadBuf(R_RX_PAYLOAD,buf,TX_PAYLOAD_WIDTH);
ret=1; } NRF_RW_Reg(W_REGISTER+STATUS,status); return ret; } void NRF_Config(void) { CE=0; CSN=1; SCK=0; NRF_RW_Reg(W_REGISTER+CONFIG,0x0f); delayms(2); NRF_RW_Reg(W_REGISTER+EN_AA,0x01); NRF_RW_Reg(W_REGISTER+EN_RXADDR,0x01); NRF_RW_Reg(W_REGISTER+SETUP_AW,0x03); // NRF_RW_Reg(W_REGISTER+SETUP_RETR,0x1a); NRF_RW_Reg(W_REGISTER+RF_CH,0x00); NRF_RW_Reg(W_REGISTER+RF_SETUP,0x07); NRF_WriteBuf(W_REGISTER+RX_ADDR_P0,RX_ADDRESS,0x05); NRF_WriteBuf(W_REGISTER+TX_ADDR,TX_ADDRESS,0x05); NRF_RW_Reg(W_REGISTER+RX_PW_P0,RX_PAYLOAD_WIDTH); CE=1; } 程序结果为,发送端打开时,接收端的数码管不停的闪烁。发送端不发时接收端的数码管不闪烁。
19 学习总结
1.nrf2401有四种操作模式:Active(TX/TX),Configuration,Stand by,Power down.四种模式的引脚配置如下:
在Active模式下可以进行数据的收发,Configuration下进行配置nrf2401的配置.TX模式下有二种发送方式,突发模式和直接发送方式.直接发送方式需要自己写入地址,数据,计算CRC校验,因此比较复杂。我们一般使用突发模式,这样可以降低软件的复杂度。
在突发模式,当有数据发送时MCU低速(如:10k)写入nrf2401,然后高速发射。Nrf2401中最高支持1M的发送速率。发送流程如下:
(1) 有数据发送时,设置CE=’1’; (2) 写入地址和有效数据(
(3) MCU设置EC=’0’,激发nrf2401发送数据
接收流程:
(nrf2401有二个接收通道,当二个通道都使用时使用时,nrf2401的晶振要为16M,此处为单通道接收) (1) 配置好正确的地址 (2) 设置CE=’1’
(3) 200u秒后,nrf2401监视空中接口
(4) 当接收到数据时(地址匹配,CRC正确),设置DR1=’1’通知MCU (5) MCU从nrf2401中取走数据后,设置DR!=’0’继续接收数据 2.配置字
除了使用接收通道2使用DR2,CLK2和DOUT2外,其它的数据操作都使用通道1的数据接口。
Nrf2401有40字节的配置字,配置字表如下:
20 详细的配置字详见数据手册。写入配置字时,高位在前。
21 NRF2402学习总结(2011-5-5) Nrf2402有四种操作模式分别为Active、Configuration、Stand By、Power Down。这四种操作模式通过能过PWR_UP,CE,CS这三个引脚来配置。各种操作模式配置如下图:
在Active模式下的发送有突发模式和直接发送模式。直接发送模式用的比较少,需要程序员自己处理CRC、地址等。突发模式中芯片自动处理地址与CRC,简化了编程,突发模式中最高速度可达到1M。
突发模式操作过程如下: 1. CE=1,激活nrf2402 2. 写入接收端地址和有效数据 3. CE=0,激活发送
Nrf2402的数据接口为CS,CLK,DIN三个引脚。 Nrf2402有三字节的配置字,配置字的如下:
在nrf2402中在CS的下降沿才会更新配置字。
在配置字中,18和19位用于测试,第18位不使用必需设置为1,第19位为0时正常操作。 14-17位用于配置突发模式。Bit17设置突发时是否有前导码。Bit16不使用设计为1。Bit14设置是否允许CRC,1允许,0禁止。Bit15选择CRC的字节数,0一字节CRC,1二字节CRC。Bit7-13用于芯片的通用配置。
Burst设置工作模式,OD设置发射速度。 XO_F设置晶振
22 RF_PWR设置发射功率
低7 位用于设置发射的频率,频率计算公式如下: 频率=2.4GHz+RF_CH*1MHz
23