专家
公告
财富商城
电子网
旗下网站
首页
问题库
专栏
标签库
话题
专家
NEW
门户
发布
提问题
发文章
求助MSP430F155+NRF905通讯不了
2019-03-24 13:08
发布
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
站内问答
/
TI MCU
2082
2
1065
载波能检测到,地址检测不通过。 此帖出自
小平头技术问答
友情提示:
此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
2条回答
obentul
1楼-- · 2019-03-25 00:41
发送程序
#include <msp430x15x.h>
//==============================================================================
#define uchar unsigned char
#define uint unsigned int
#define uclong unsigned long
//==================TXEN,TRX_CE,PWR_0 为收发模式控制端口======================
#define TXEN_0 P2OUT &=~BIT0 //输出0
#define TXEN_1 P2OUT |= BIT0 //输出1
//==============================================================================
#define TRX_CE_0 P2OUT &=~BIT1
#define TRX_CE_1 P2OUT |= BIT1
//==============================================================================
#define PWR_0 P2OUT &=~BIT2
#define PWR_1 P2OUT |= BIT2
//===================================主入从出===================================
#define MISO_0 P3OUT &=~BIT2
#define MISO_1 P3OUT |= BIT2
//==================================主出从入====================================
#define MOSI_0 P3OUT &=~BIT1
#define MOSI_1 P3OUT |= BIT1
//===================================SPI时钟端口================================
#define SCK_0 P3OUT &=~BIT3
#define SCK_1 P3OUT |= BIT3
//===================================SPI使能端口=================================
#define CSN_0 P3OUT &=~BIT0
#define CSN_1 P3OUT |= BIT0
//==================================以下为状态端口==============================
//===========================AM 地址匹配=======================================
#define AM_0 P2OUT &=~BIT5
#define AM_1 P2OUT |= BIT5
//=================================DR 数据接收状态==============================
#define DR_0 P2OUT &=~BIT6
#define DR_1 P2OUT |= BIT6
//=====================================CD 载波侦听状态==========================
#define CD_0 P2OUT &=~BIT4
#define CD_1 P2OUT |= BIT4
//==============================================================================
#define LED1_0 P6OUT &=~BIT1 //输出0
#define LED1_1 P6OUT |= BIT1 //输出1
#define LED2_0 P6OUT &=~BIT2 //输出0
#define LED2_1 P6OUT |= BIT2 //输出1
//===========================NRF905:SPI指令=====================================
#define WC 0x00
#define RC 0x10
#define WTP 0x20
#define RTP 0x21
#define WTA 0x22
#define RTA 0x23
#define RRP 0x24
//==========================32字节发送数据收发缓冲区============================
#define TxRxBuf_Len 32
unsigned char TxRxBuf[TxRxBuf_Len]=
{ 0x01,0x02,0x03,0x4,0x05,0x06,0x07,0x08,0x09,0x10,0x11,0x12,0x13,0x14,0x15,0x16,
0x17,0x18,0x19,0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x30,0x31,0x32,
};
char TxAddress[4]={0xcc,0xcc,0xcc,0xcc};
char DATA_BUF[];
//==========================NRF905:10寄存器配置================================
unsigned char RFConf[11]=
{
WC, //SPI写操作命令
0x4c, //CH_NO,配置频段在430MHZ
0x0C, //输出功率为10db,不重发,节电为正常模式
0x44, //地址宽度设置,为4字节
0x20,0x20, //接收发送有效数据长度为32字节
0xCC,0xCC,0xCC,0xCC, //接收地址
0x58, //CRC充许,8位CRC校验,外部时钟信号不使能,16M晶振
};
/*****************************************************************************
系统初始化
******************************************************************************/
void Delay(uchar n)
{
uint i;
while(n--)
for(i=0;i<80;i++);
}
void InitSys()
{
unsigned int iq0;
_DINT();
BCSCTL1 &=~XT2OFF;
do
{
IFG1 &= ~OFIFG; // 清除振荡器失效标志
for (iq0 = 0xFF; iq0 > 0; iq0--); // 延时,等待XT2起振
}
while ((IFG1 & OFIFG) != 0); // 判断XT2是否起振
BCSCTL2 =SELM1+SELS; //MCLK,SMCLK时钟为XT2
//???USART0
}
//===========================初始化nRF905=======================================
void nRF905_IO_set(void)
{
P2DIR |= 0x07;
P2DIR &= 0x8F;
P2SEL&=0x88;
P3DIR |= 0xC0;
P3DIR |= 0xFB;
P3SEL&=0xF0;
CSN_1; // Spi disable
SCK_0; // Spi clock line init low
PWR_1; // nRF905 power on
TRX_CE_0; // Set nRF905 in standby mode
TXEN_0;Delay(100); // set radio in Rx mode
}
//==============================================================================
void LED_IO_set(void)
{
P6DIR |= BIT2;
P6OUT |= BIT2; //关闭电平转换
}
//==========================延时================================================
//=========================NRF905 SPI读函数(IO模拟SPI时序)==================
unsigned char SpiRead(void)
{
unsigned char i;
for (i=0;i<8;i++)
{
DATA_BUF=DATA_BUF<<1;
SCK_1;
if ((P3IN&0x04)) //读取最高位,保存至最末尾,通过左移位完成整个字节
{
DATA_BUF|=0x01;
}
else
{
DATA_BUF&=~(0x01);
}
SCK_0;
}
return DATA_BUF;
}
//=========================NRF905 SPI读写函数(IO模拟SPI时序)==================
void SpiWrite(unsigned char send)
{
unsigned char i;
DATA_BUF=send;
for (i=0;i<8;i++)
{
if (((DATA_BUF&0x80) != 0)) //总是发送最高位
{
MOSI_1;
}
else
{
MOSI_0;
}
SCK_1;
DATA_BUF=DATA_BUF<<1;
SCK_0;
}
}
//==================================初始化NRF905================================
void Config905(void)
{
uchar i;
CSN_0; // Spi enable for write a spi command
for (i=0;i<11;i++) // Write configration words 写放配置字
{
SpiWrite(RFConf
);
}
CSN_1; //关闭SPI
}
//=========================NRF905装载地址+数据打包+数据发送=====================
void TxPacket(void)
{
uchar i;
CSN_0;
SpiWrite(WTP); // 待发数据装载命令
for (i=0;i<32;i++)
{
SpiWrite(TxRxBuf
);
}
CSN_1; // 关闭SPI
Delay(1);
CSN_0; // 打开SPI
SpiWrite(WTA); // 写入地址要和接收方地址一样
for (i=0;i<4;i++) // 4字节地址
{
SpiWrite(TxAddress
);
}
CSN_1; //关闭SPI
TRX_CE_1; // Set TRX_CE high,start Tx data transmission
Delay(10); //while (CheckDR()!=1);
TRX_CE_0; // Set TRX_CE low
}
//==================================发送模式初始化-=============================
void SetTxMode(void)
{
TRX_CE_0;
TXEN_1;
Delay(1); // Delay for mode change(>=650us)
}
//==================================数据发送===================================
void TX(void)
{
TxPacket();
SetTxMode();
}
//==================================主函数=====================================
void main(void)
{
WDTCTL = WDTPW + WDTHOLD; //禁止看门狗
InitSys();
nRF905_IO_set();
LED_IO_set(); //6.2灯亮,6.2为输出
Config905();
LED1_1 ; LED2_1 ;
while(1)
{
TX();
Delay(200); Delay(200); Delay(200);LED1_0 ;
Delay(200); Delay(200); Delay(200); Delay(200); Delay(200); LED1_1;
}
}
加载中...
obentul
2楼-- · 2019-03-25 05:00
精彩回答 2 元偷偷看……
加载中...
一周热门
更多
>
相关问题
相关文章
×
关闭
采纳回答
向帮助了您的网友说句感谢的话吧!
非常感谢!
确 认
×
关闭
编辑标签
最多设置5个标签!
保存
关闭
×
关闭
举报内容
检举类型
检举内容
检举用户
检举原因
广告推广
恶意灌水
回答内容与提问无关
抄袭答案
其他
检举说明(必填)
提交
关闭
×
关闭
您已邀请
15
人回答
查看邀请
擅长该话题的人
回答过该话题的人
我关注的人
#include <msp430x15x.h>
//==============================================================================
#define uchar unsigned char
#define uint unsigned int
#define uclong unsigned long
//==================TXEN,TRX_CE,PWR_0 为收发模式控制端口======================
#define TXEN_0 P2OUT &=~BIT0 //输出0
#define TXEN_1 P2OUT |= BIT0 //输出1
//==============================================================================
#define TRX_CE_0 P2OUT &=~BIT1
#define TRX_CE_1 P2OUT |= BIT1
//==============================================================================
#define PWR_0 P2OUT &=~BIT2
#define PWR_1 P2OUT |= BIT2
//===================================主入从出===================================
#define MISO_0 P3OUT &=~BIT2
#define MISO_1 P3OUT |= BIT2
//==================================主出从入====================================
#define MOSI_0 P3OUT &=~BIT1
#define MOSI_1 P3OUT |= BIT1
//===================================SPI时钟端口================================
#define SCK_0 P3OUT &=~BIT3
#define SCK_1 P3OUT |= BIT3
//===================================SPI使能端口=================================
#define CSN_0 P3OUT &=~BIT0
#define CSN_1 P3OUT |= BIT0
//==================================以下为状态端口==============================
//===========================AM 地址匹配=======================================
#define AM_0 P2OUT &=~BIT5
#define AM_1 P2OUT |= BIT5
//=================================DR 数据接收状态==============================
#define DR_0 P2OUT &=~BIT6
#define DR_1 P2OUT |= BIT6
//=====================================CD 载波侦听状态==========================
#define CD_0 P2OUT &=~BIT4
#define CD_1 P2OUT |= BIT4
//==============================================================================
#define LED1_0 P6OUT &=~BIT1 //输出0
#define LED1_1 P6OUT |= BIT1 //输出1
#define LED2_0 P6OUT &=~BIT2 //输出0
#define LED2_1 P6OUT |= BIT2 //输出1
//===========================NRF905:SPI指令=====================================
#define WC 0x00
#define RC 0x10
#define WTP 0x20
#define RTP 0x21
#define WTA 0x22
#define RTA 0x23
#define RRP 0x24
//==========================32字节发送数据收发缓冲区============================
#define TxRxBuf_Len 32
unsigned char TxRxBuf[TxRxBuf_Len]=
{ 0x01,0x02,0x03,0x4,0x05,0x06,0x07,0x08,0x09,0x10,0x11,0x12,0x13,0x14,0x15,0x16,
0x17,0x18,0x19,0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x30,0x31,0x32,
};
char TxAddress[4]={0xcc,0xcc,0xcc,0xcc};
char DATA_BUF[];
//==========================NRF905:10寄存器配置================================
unsigned char RFConf[11]=
{
WC, //SPI写操作命令
0x4c, //CH_NO,配置频段在430MHZ
0x0C, //输出功率为10db,不重发,节电为正常模式
0x44, //地址宽度设置,为4字节
0x20,0x20, //接收发送有效数据长度为32字节
0xCC,0xCC,0xCC,0xCC, //接收地址
0x58, //CRC充许,8位CRC校验,外部时钟信号不使能,16M晶振
};
/*****************************************************************************
系统初始化
******************************************************************************/
void Delay(uchar n)
{
uint i;
while(n--)
for(i=0;i<80;i++);
}
void InitSys()
{
unsigned int iq0;
_DINT();
BCSCTL1 &=~XT2OFF;
do
{
IFG1 &= ~OFIFG; // 清除振荡器失效标志
for (iq0 = 0xFF; iq0 > 0; iq0--); // 延时,等待XT2起振
}
while ((IFG1 & OFIFG) != 0); // 判断XT2是否起振
BCSCTL2 =SELM1+SELS; //MCLK,SMCLK时钟为XT2
//???USART0
}
//===========================初始化nRF905=======================================
void nRF905_IO_set(void)
{
P2DIR |= 0x07;
P2DIR &= 0x8F;
P2SEL&=0x88;
P3DIR |= 0xC0;
P3DIR |= 0xFB;
P3SEL&=0xF0;
CSN_1; // Spi disable
SCK_0; // Spi clock line init low
PWR_1; // nRF905 power on
TRX_CE_0; // Set nRF905 in standby mode
TXEN_0;Delay(100); // set radio in Rx mode
}
//==============================================================================
void LED_IO_set(void)
{
P6DIR |= BIT2;
P6OUT |= BIT2; //关闭电平转换
}
//==========================延时================================================
//=========================NRF905 SPI读函数(IO模拟SPI时序)==================
unsigned char SpiRead(void)
{
unsigned char i;
for (i=0;i<8;i++)
{
DATA_BUF=DATA_BUF<<1;
SCK_1;
if ((P3IN&0x04)) //读取最高位,保存至最末尾,通过左移位完成整个字节
{
DATA_BUF|=0x01;
}
else
{
DATA_BUF&=~(0x01);
}
SCK_0;
}
return DATA_BUF;
}
//=========================NRF905 SPI读写函数(IO模拟SPI时序)==================
void SpiWrite(unsigned char send)
{
unsigned char i;
DATA_BUF=send;
for (i=0;i<8;i++)
{
if (((DATA_BUF&0x80) != 0)) //总是发送最高位
{
MOSI_1;
}
else
{
MOSI_0;
}
SCK_1;
DATA_BUF=DATA_BUF<<1;
SCK_0;
}
}
//==================================初始化NRF905================================
void Config905(void)
{
uchar i;
CSN_0; // Spi enable for write a spi command
for (i=0;i<11;i++) // Write configration words 写放配置字
{
SpiWrite(RFConf);
}
CSN_1; //关闭SPI
}
//=========================NRF905装载地址+数据打包+数据发送=====================
void TxPacket(void)
{
uchar i;
CSN_0;
SpiWrite(WTP); // 待发数据装载命令
for (i=0;i<32;i++)
{
SpiWrite(TxRxBuf);
}
CSN_1; // 关闭SPI
Delay(1);
CSN_0; // 打开SPI
SpiWrite(WTA); // 写入地址要和接收方地址一样
for (i=0;i<4;i++) // 4字节地址
{
SpiWrite(TxAddress);
}
CSN_1; //关闭SPI
TRX_CE_1; // Set TRX_CE high,start Tx data transmission
Delay(10); //while (CheckDR()!=1);
TRX_CE_0; // Set TRX_CE low
}
//==================================发送模式初始化-=============================
void SetTxMode(void)
{
TRX_CE_0;
TXEN_1;
Delay(1); // Delay for mode change(>=650us)
}
//==================================数据发送===================================
void TX(void)
{
TxPacket();
SetTxMode();
}
//==================================主函数=====================================
void main(void)
{
WDTCTL = WDTPW + WDTHOLD; //禁止看门狗
InitSys();
nRF905_IO_set();
LED_IO_set(); //6.2灯亮,6.2为输出
Config905();
LED1_1 ; LED2_1 ;
while(1)
{
TX();
Delay(200); Delay(200); Delay(200);LED1_0 ;
Delay(200); Delay(200); Delay(200); Delay(200); Delay(200); LED1_1;
}
}
一周热门 更多>