最近做了个基于NRF905的无线通讯系统,期间发现了一些问题,虽然最后调通了,但是其中的道理不是很清楚,下面上程序,这个是接收数据的,发送的只是在上面小改一下就好了。
#include "io430G2231.h"
#define CPU_F ((double)1000000)
#define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0))
#define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))
#define uchar unsigned char
#define uint unsigned int
//#define uclong unsigned long
//==================TXEN,TRX_CE,PWR_0 为收发模式控制端口======================
#define TX_EN_0 P2OUT &=~BIT6 //输出0
#define TX_EN_1 P2OUT |= BIT6 //输出1
//=======================================================
#define TRX_CE_0 P1OUT &=~BIT0
#define TRX_CE_1 P1OUT |= BIT0
//=======================================================
#define PWR_0 P2OUT &=~BIT7
#define PWR_1 P2OUT |= BIT7
//=========================SPI 主入从出==================
#define MISO ((P1IN&BIT2)>>2)
//=========================主出从入======================
#define MOSI_0 P1OUT &=~BIT7
#define MOSI_1 P1OUT |= BIT7
//=========================SPI时钟端口===================
#define SCK_0 P1OUT &=~BIT3
#define SCK_1 P1OUT |= BIT3
//=========================SPI使能端口===================
#define CSN_0 P1OUT &=~BIT5
#define CSN_1 P1OUT |= BIT5
//===========================以下为状态端口==============
//===========================AM 地址匹配================
#define AM (P1IN&BIT1)
//===========================DR 数据接收状态=============
#define DR ((P1IN&BIT6)>>6)
//===========================CD 载波侦听状态=============
#define CD ((P1IN&BIT4)>>4)
//============NRF905:SPI指令==================
#define WC 0x00 //写配置寄存器
#define RC 0x10 //读配置寄存器
#define WTP 0x20 //写TX有效数据
#define RTP 0x21 //读TX有效数据
#define WTA 0x22 //写TX地址
#define RTA 0x23 //读TX地址
#define RRP 0x24 //读取RX有效数据
uchar sss[10]={0};
uchar rx[10]={0};
typedef struct RFConfig{
uchar n;
uchar buf[10];
}RFConfig;
struct RFConfig RxTxConf ={
10,
0x4c, /**/
0x0c, /**/
0x44, /*TX_AFW,RX_AFW地址宽度*/
0x01,0x01, /*RX,TX有效数据位长度1位*/
0x22,0x22,0x22,0x22, /*接收地址*/
0x58 /*CRCx效验*/
};
uchar SPI_NRF905_READ(void){
uchar i;
uchar byte;
for(i=0; i<8; i++){
byte = byte<<1;
SCK_1;
if(MISO)
byte |= 0x01;
else
byte &=~0x01;
SCK_0;
}
return byte;
}
void SPI_NRF905_WRITE(uchar byte){
uchar i;
for(i=0; i<8; i++){
if(byte&0x80)
MOSI_1;
else
MOSI_0;
SCK_1;
byte = byte<<1;
SCK_0;
}
}
void Config905(void){
uchar i;
CSN_0;
SPI_NRF905_WRITE(WC);
for(i=0; i<RxTxConf.n; i++){
SPI_NRF905_WRITE(RxTxConf.buf[i]);
}
CSN_1;
}
void ReadConfig905(){
uchar i;
CSN_0;
SPI_NRF905_WRITE(RC);
for(i=0; i<10; i++){
sss[i]=SPI_NRF905_READ();
}
CSN_1;
}
void TxPacket(void){
uchar i;
CSN_0;
SPI_NRF905_WRITE(WTP);
SPI_NRF905_WRITE(0x01); //发送一位数据
CSN_1;
delay_us(2);
CSN_0;
SPI_NRF905_WRITE(WTA);
for(i=0; i<4; i++){
SPI_NRF905_WRITE(RxTxConf.buf[i+5]); //发送地址
}
CSN_1;
TRX_CE_1;
delay_us(5);
while(!DR);
TRX_CE_0;
}
void RxPacket(void){
//uchar i;
TRX_CE_0;
CSN_0;
SPI_NRF905_WRITE(RRP);
rx[0]=SPI_NRF905_READ();//读取一位数据
CSN_1;
while(DR||AM);
TRX_CE_1;
}
void SetTxMode(void){
TX_EN_1;
TRX_CE_0;
delay_us(400);
}
void SetRxMode(void){
TX_EN_0;
TRX_CE_1;
delay_us(650);
}
void main( void )
{
// Stop watchdog timer to prevent time out reset
WDTCTL = WDTPW + WDTHOLD;
if (CALBC1_1MHZ ==0xFF || CALDCO_1MHZ == 0xFF)
{
while(1); // If calibration constants erased
// do not load, trap CPU!!
}
BCSCTL1 = CALBC1_1MHZ; // Set range
DCOCTL = CALDCO_1MHZ;
//P1DIR = 0x01;
//while(1){
//P1OUT ^= 0x01;
//delay_ms(1000);
//}
P2DIR |=(BIT6+BIT7);
P1DIR = 0xff;
P1DIR &= ~(BIT1+BIT2+BIT4+BIT6);
P2REN |= (BIT6+BIT7); //采用了上拉电阻,否则无法NRF905无法正常工作(实验出来的)至今还不是很明白
P2OUT = 0x00;
P1OUT = 0x00;
CSN_1;
SCK_0;
PWR_1;
TRX_CE_0;
TX_EN_0;
Config905();
ReadConfig905();
//SetTxMode();//设置发送模式
SetRxMode();
while(1){
//TxPacket(); //发送数据
//delay_ms(500);
while(!DR); //检测接收是否完成
RxPacket(); //读取接收数据
__delay_cycles(1);
}
}