两个组合MCU1+nRF905,将nRF905模块和51单片机各引脚直接连接,其中一个为发送方,另一个为接收方。引脚配置如下:
sbit TX_EN =P1^0;
sbit TRX_CE =P3^2;
sbit PWR_UP =P1^1;
sbit MISO =P1^6;
sbit MOSI =P1^5;
sbit SCK =P1^7;
sbit CSN =P1^3;
sbit AM =P1^4;
sbit DR =P3^3;
sbit CD =P1^2;
*********************************************************************************
发送方和接收方的nRF905各引脚初始化配置相同,都为:
void nRF905Init(void)
{
CSN=1; // Spi disable
SCK=0; // Spi clock line init high
DR=1; // Init DR for input
CD=0;
AM=1; // Init AM for input
PWR_UP=1; // nRF905 power on
Delay(4);
TRX_CE=0; // Set nRF905 in standby mode
TX_EN=0; // set radio in Rx mode
}
*************************************************************************************
发送方和接收方的905的10个字节的配置字也相同,这10个字节值放在结构体TxRxconf的成员buf[10]中:
{
0x4c, //配置频段为430MHz,
0x0c, //输出功率为10dBm,正常接收模式,不自动重发
0x44, //接收、发送的地址宽度为4字节
0x20,0x20, //接收、发送有效数据宽度为32字节
0xcc,0xcc,0xcc,0xcc, //接收地址的4个字节为0xcc,0xcc,0xcc,0xcc
0x58 //CRC校验允许,8位CRC校验,外部时钟信号不使能,16M晶振
}
********************************************************************************
发送方在发送前的准备工作: | 接收方在接收前的准备工作:
对于发送方, | 对于接收方
void SetTxMode(void) | void SetRXMode(void)
{ | {
TRX_CE=0; | TRX_CE=1;
TX_EN=1; | TX_EN=0;
Delay(1); | Delay(1);
} | }
当PWR_UP=1; |当 PWR_UP=1;
TRX_CE=0; | TRX_CE=1;
TX_EN =1; | TX_EN=0;
nRF905进入standby(待机)模式, |nRF905进入接收模式
当TRX_CE=1时,便进入发送模式 |
**********************************************************************
发送方发送数据: | 接收方接收数据:
void TxPacket(unsigned char *TxBuf) | unsigned char RxPacket(unsigned char *RxBuf)
{ | {
uchar i; | uchar i;
CSN=0; | if (DR)//当接收方接收完一个数据,nRF905会将其DR引脚置高
SpiWrite(WTP); //写发送数据命令 | {
for (i=0;i
{ | CSN=0;
//MCU通过SPI接口将需要发送的32个数据送至缓存| SpiWrite(RRP);//读接收数据
SpiWrite(TxBuf); | for (i = 0 ;i < RxTxConf.buf[3] ;i++)
} | {
CSN=1; | RxBuf=SpiRead();
| }
Delay(1); | CSN=1;
| while(DR||AM);//MCU读取数据完毕,nRF905会将DR和AM引脚置低
CSN=0; | TRX_CE=1; //nRF905重新进入接收模式
SpiWrite(WTA);//写地址命令 | return 1;
for (i=0;i
{ | else
//写入接收机地址 | {
SpiWrite(TxAddress); | return 0;
} | }
CSN=1; | }
//将TRX_CE置高,启动发送 |
TRX_CE=1; |
Delay(1); |
TRX_CE=0;//发送完毕,进入待机模式 |
} |
发送方通过调用TxPacket(TxBuf)发送了32个字节数据,接收方接收并通过串口在PC机上显示,接收方和PC机的串口通信程序经调试没有问题。
问题在于,发送方和接收方之间没有通信。
根据坛友nicole088帖子“基于MSP430F149+nRF905无线数传模块的调试心得”,他提到,
31引脚 23 引脚 19引脚 发送机 1.5V 1.2V 1.8V 接收机 1.2V 1.2V 0V
我分别测了发送方和接收方
31、23和19引脚的电压值,
31引脚 23引脚 19引脚 发送方 1.38V 0.44 0.64 接收方 1.27v 1.19 0.00
这样比较看来,我的接收方应该没有问题,问题出在发送方,也就是发送方根本就没有把数据发送出来,可是为什么就没有发送出来呢?
发送方程程序哪里不对吗?