微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 基于430单片机的NRF905收发驱动程序

基于430单片机的NRF905收发驱动程序

时间:11-27 来源:互联网 点击:
#include

#include "BaseType.h"

#include

#include

#define WaitKeyDw 100

#define WaitKeyUp 101

#define KeyDwTimes 30

#define WRC 0x00 //W_RF_CONFIG

#define RRC 0x10 //R_RF_CONFIG

#define WTP 0x20 //W_TX_PAYLOAD

#define RTP 0x21 //R_TX_PAYLOAD

#define WTA 0x22 //W_TX_ADDRESS

#define RTA 0x23 //R_TX_ADDRESS

#define RRP 0x24 //R_RX_PAYLOAD

#define RAD 0x40 //R_ADC_DATA

#define WAC 0x44 //W_ADC_CONFIG

#define RAC 0x46 //R_ADC_CONFIG

#define WTU 0x50 //W_TEST_UNLOCK (use with data A5)

#define WTR 0x52 //W_TEST_REGISTER

#define RTR 0x53 //R_TEST_REGISTER

#define CC 0x80 //CHANNEL_CONFIG

#define SAV 0xC0 //START_ADC_CONV

#define HFREQ 1 // 0=433MHz, 1=868/915MHz

#define POWER 3 // 0=min power...3 = max power

#define RFTxLen 16 //射频发送绶冲区长度

#define RFRxLen 16 //射频接收绶冲区长度

#define INT8U unsigned char

#define INT16U unsigned int

#define _nop_() _NOP()

INT8U Nrf9e5Config[10] = {

0x6B, //频道设置

0x0C, //自动重发关,发送节电模式关,输出功率10dB,433.1MHZ

0x44, //收发地址都为4字节

RFRxLen, //接收数据长度,10字节

RFTxLen, //发送数据长度,10字节

0xE7,

0xE7,

0xE7,

0xE7, //地址

0xDF //16位校验,CRC开,16M晶振,外部时钟使能500KHZ输出

};

INT8U RFRxBuf[RFRxLen+2]; //射频接收缓冲区

INT8U RFTxBuf[RFTxLen+2]; //射频接收缓冲区

U32 CntTmp;

void PORT_Init(void)

{

P2SEL &= ~(BIT5|BIT4|BIT3|BIT2|BIT1|BIT0);

P2DIR |= (BIT3|BIT2|BIT1);

//p2.1--PWR_UP,OUTPUT

//p2.2--TRX_CE,OUTPUT

//p2.3--TX_EN, OUTPUT

P2DIR &= ~(BIT5|BIT4|BIT0);

//p2.0--uCLK, INPUT

//p2.4--KEY1, INPUT

//p2.5--KEY2, INPUT

P1SEL &= ~(BIT7|BIT6|BIT5|BIT4|BIT3|BIT2|BIT1);

P1DIR &= ~(BIT7|BIT6|BIT5);

//p1.7--CD, INPUT

//p1.6--AM, INPUT

//p1.5--DR, INPUT

P1DIR |= (BIT4|BIT3|BIT2|BIT1);//LED4--LED1, OUTPUT

P1OUT |= (BIT4|BIT3|BIT2|BIT1);

}

void SPI_Init(void)

{

P3SEL |= (BIT3|BIT2|BIT1);

P3SEL &= ~BIT0;

// P3.1 P3.2 P3.3作为SPI的管脚

// p3.0--CE905,905片选, I/O

// p3.1--MOSI,

// p3.2--MISO,

// P3.3--SCK905,

P3DIR |= (BIT3|BIT1|BIT0);

//P3.3作为输出

//P3.1作为输出

//P3.0作为输出

P3OUT |= (BIT3|BIT1|BIT0);

//P3.0输出高电平

//P3.1输出高电平

//P3.3输出高电平

// 以下设置SPI口的参数

UCTL0 |= SWRST; //为设置串口作准备

UCTL0 |= (CHAR + SYNC + MM); //数据为8比特,选择SPI模式,单片机为主机模式

UTCTL0 &= ~(CKPH|CKPL); //SPI时钟设置

UTCTL0 |= (SSEL1|STC); // 时钟源为SMCLK,选择3线模式

UBR00 = 0x02; //波特率为ACLK/2

UBR10 = 0x00; //波特率为ACLK/2

UMCTL0 = 0x00; //调整寄存器

ME1 |= USPIE0; //SPI0模块允许

IE1 |= URXIE0; //接收中断允许

IE1 |= UTXIE0; //发送中断允许

UCTL0 &= ~SWRST; // Initalise USART state machine

}

void Init_CLK(void)

{

unsigned int i;

BCSCTL1 = 0X00;//将寄存器的内容清零

//XT2震荡器开启

//LFTX1工作在低频模式

//ACLK的分频因子为1

do

{

IFG1 &= ~OFIFG; // 清除OSCFault标志

for (i = 0x20; i > 0; i--);

}

while ((IFG1 & OFIFG) == OFIFG); // 如果 OSCFault == 1

BCSCTL2 = 0x00; //将寄存器的内容清零

BCSCTL2 |=SELM_2; //MCLK select lftx

BCSCTL2 |= SELS; //SMCLK--DCOCLK

}

void Delay_ms(unsigned long nValue)//毫秒为单位,8MHz为主时钟

{

unsigned long nCount;

int i;

unsigned long j;

nCount = 2667;

for(i = nValue;i > 0;i--)

{

for(j = nCount;j > 0;j--);

}

return;

}

void Delay_us(unsigned long nValue)//微秒为单位,8MHz为主时钟

{

int nCount;

int i;

int j;

nCount = 3;

for(i = nValue;i > 0;i--)

{

for(j = nCount;j > 0;j--);

}

return;

}

void delay(INT16U s)

{

INT16U i;

for(i=0; i

}

void SpiWriteByte(INT8U dat)

{

// while ((IFG1 & UTXIFG0)==0x0);

U0TXBUF = dat;

while ((U0TCTL & TXEPT) == 0x0);

}

INT8U SpiReadByte(void)

{

//INT8U temp;

U0TXBUF = 0;

while ((U0TCTL & TXEPT) == 0x0);

// while((IFG1 & URXIFG0)==0);

// temp=U0RXBUF;

// return temp;

return U0RXBUF;

}

void INIT_905(void)

{

INT8U i;

TRX_CE_0; //TRX_CE = 0;

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top