专家
公告
财富商城
电子网
旗下网站
首页
问题库
专栏
标签库
话题
专家
NEW
门户
发布
提问题
发文章
nrf905 通讯
2019-03-24 12:23
发布
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
站内问答
/
TI MCU
7363
9
1707
单片机发送完一条指令后变为接收状态,正常情况下应不断询问DR是否为高,但程序却停在while(AM_IN||DR_IN);这一句,说明此时DR为高单片机接收到数据,但实际上另一个单片机还没向该单片机发送数据。不知道DR为什么会变高,以为是“发送”导致的,于是在发送后插入10ms的延时,但问题还在
此帖出自
小平头技术问答
友情提示:
此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
9条回答
智波景严
1楼-- · 2019-03-24 19:03
同样不理解,我还想用多对一通信,地址问题还是很乱,求解答
加载中...
zgbkdlm
2楼-- · 2019-03-24 22:32
精彩回答 2 元偷偷看……
加载中...
zdd563
3楼-- · 2019-03-24 23:04
以前玩过,好像到接收状态的时候好像还应该检查是否有新数据传入的
加载中...
智波景严
4楼-- · 2019-03-25 03:47
恩,现在弄好了,三个全双工通行也实现了!
同时也想回答楼主的疑问,就是AM,DR的输入口促初始化的时候要将其拉高,否则就会出来那种情况!
[
本帖最后由 智波景严 于 2012-11-25 13:13 编辑
]
加载中...
泡泡鱼会飞
5楼-- · 2019-03-25 07:09
精彩回答 2 元偷偷看……
加载中...
智波景严
6楼-- · 2019-03-25 08:49
/**********************************************************************
*作 者:WANGBQ *
*修改时间:2012-11-14 *
*功 能:实现nrf905的数据传输和读取 *
*说 明:无 *
**********************************************************************/
//---------------------------------------------------------------------------/
#include"msp430g2553.h"
#define uchar unsigned char
#define uint unsigned int
#define Tx_MODE (P1OUT |= BIT0) //TX_EN
#define Rx_MODE (P1OUT &=~BIT0) //TX_EN
#define TRx_EN (P1OUT |= BIT1) //TRX_CE
#define TRx_DIS (P1OUT &=~BIT1)//TRX_CE
#define AM (P1IN & BIT2) //address
#define DR (P1IN & BIT3) //R/T_x data is ok
#define MISO (P1IN & BIT4) //FOR read
#define MOSI_HIGH (P1OUT |= BIT5) //for write
#define MOSI_LOW (P1OUT &=~BIT5)
#define SCK_HIGH (P1OUT |= BIT6)
#define SCK_LOW (P1OUT &=~BIT6)
#define CSN_HIGH (P1OUT |= BIT7)
#define CSN_LOW (P1OUT &=~BIT7)
//---------------------------------------------------------------------------/
#define WC (0X00) //write Configuration_Register
#define RC (0X10) //read Configuraion_Register
#define WTP (0X20) //write Translation_Payload
#define RTP (0X21) //read Translation_Payload
#define WTA (0X22) //write Tanslation_Address
#define RTA (0X23) //read Tanslation_Assress
#define RRP (0X24) //read Receive_Payload */
//---------------------------------------------------------------------------/
uchar TRX_Conf[10]={0x4c, 0x0c, 0x44, 0x01, 0x01, 0xcc, 0xcc, 0xcc,0xcc, 0x58};
/*uchar TRX_Conf[10]={0x4c, 0x0c, 0x44, 0x20, 0x20, 0xcc, 0xcc, 0xcc,0xcc, 0x58};
注释: 0x4c : CH_ON,423MHz频段;
0x0c : 输出功率10dB,不重发,节点为正常;
0x44 : 设置地址宽度为四字节;
0x20,0x20 : 收、发有效数据长度为32字节;(0x01 为一字节)
0xcc,0xcc,0xcc,0xcc : 接收地址(本机地址);
0x58 : CRC使能,八位CRC校正,外部时钟不使能,16M晶振;
*/
int Readbuf=0;
//---------------------------------------------------------------------------/
void delay(uchar x);
void delayms(uchar x);
void SPI_write(uchar byte);
uchar SPI_read();
void Init();
void Conf_nrf905();
void Tran_packet(uchar dat,uchar addr);
void Receive_packet();
//---------------------------------------------------------------------------/
/***********************************************************************
*函数名称: main *
*函数参量: 无 *
*函数功能:实现nrf905的数据传输和读取 *
*说 明: *
************************************************************************/
void main()
{
WDTCTL = WDTHOLD + WDTPW;
Init();
Conf_nrf905();
for(;;)
{
// Receive_packet();
Tran_packet(0x01,0xee); //向地址0xee的从机发送数据0x01
}
}
/***********************************************************************
*函数名称: *
*函数参量: *
*函数功能: *
*说 明: *
************************************************************************/
void delay(uchar x)
{
while(x--)
{
_NOP();
}
}
/***********************************************************************
*函数名称: *
*函数参量: *
*函数功能: *
*说 明: *
************************************************************************/
void delayms(uchar x)
{
int i,j;
for(i=x;i>0;i--)
for(j=110;j>0;j--);
}
/***********************************************************************
*函数名称: *
*函数参量: *
*函数功能: *
*说 明: *
************************************************************************/
void SPI_write(uchar byte)
{
uchar i,buf=byte;
for(i=0;i<8;i++)
{
SCK_LOW;
if(buf & 0x80) MOSI_HIGH ;
else MOSI_LOW ;
SCK_HIGH;
buf<<=1 ;
SCK_LOW;
}
}
/***********************************************************************
*函数名称: *
*函数参量: *
*函数功能: *
*说 明: *
************************************************************************/
uchar SPI_read()
{
uchar i,buf=0;
for(i=0;i<8;i++)
{
SCK_LOW;
buf<<=1 ;
if(MISO) buf |=0x01;
else buf &= ~BIT0 ;
SCK_HIGH ;
delay(2);
SCK_LOW;
}
return buf;
}
/***********************************************************************
*函数名称: *
*函数参量: *
*函数功能: *
*说 明: *
************************************************************************/
void Init()
{
P1DIR |= BIT4 + BIT3 + BIT2; //避免2.3.4口因为其他配置而保持低电平。
P1OUT |= BIT4 +BIT3;
P1OUT &= ~BIT2 ;
P1DIR = 0xe3 ; //0.1.5.6.7 output
P2DIR |= BIT5 + BIT0;
P2OUT |= BIT5;
TRx_DIS;
CSN_HIGH;
SCK_LOW;
}
/***********************************************************************
*函数名称: *
*函数参量: *
*函数功能: *
*说 明: *
************************************************************************/
void Conf_nrf905()
{
uchar i;
CSN_LOW ;
SPI_write(WC);
for(i=0;i<10;SPI_write(TRX_Conf[i++]));
CSN_HIGH;
TRx_DIS;
}
/***********************************************************************
*函数名称: *
*函数参量: *
*函数功能: *
*说 明: *
************************************************************************/
void Tran_packet(uchar dat,uchar addr)
{
Tx_MODE;
CSN_LOW;
SPI_write(WTA);
SPI_write(addr);
SPI_write(addr);
SPI_write(addr);
SPI_write(addr);
CSN_HIGH;
delayms(1);
CSN_LOW;
SPI_write(WTP);
SPI_write(dat);
CSN_HIGH;
delayms(1);
TRx_EN;
delayms(1);
TRx_DIS;
while(!DR);
P2OUT |= BIT0; //用一根杜邦线把P2.1与一个led连一起,发出数据是它会闪烁。
delayms(100);
P2OUT &= ~BIT0;
}
/***********************************************************************
*函数名称: *
*函数参量: *
*函数功能: *
*说 明: *
************************************************************************/
void Receive_packet()
{
Rx_MODE;
TRx_EN;
delayms(1); //>650us
for(;;)
{
if(AM&&DR) //received
{
TRx_DIS; //stop Receive
CSN_LOW;
SPI_write(RRP);
Readbuf=SPI_read();
CSN_HIGH;
while(DR);
TRx_EN;
P2OUT |= BIT5; //用一根杜邦线吧P2.5与一个led连一起,收完数据是它会闪烁。
delayms(100);
P2OUT &= ~BIT5;
break;
}
}
}
//好久没来论坛了,希望贴上后对你还有帮助
[
本帖最后由 智波景严 于 2013-1-1 22:31 编辑
]
加载中...
1
2
下一页
一周热门
更多
>
相关问题
相关文章
×
关闭
采纳回答
向帮助了您的网友说句感谢的话吧!
非常感谢!
确 认
×
关闭
编辑标签
最多设置5个标签!
保存
关闭
×
关闭
举报内容
检举类型
检举内容
检举用户
检举原因
广告推广
恶意灌水
回答内容与提问无关
抄袭答案
其他
检举说明(必填)
提交
关闭
×
关闭
您已邀请
15
人回答
查看邀请
擅长该话题的人
回答过该话题的人
我关注的人
同时也想回答楼主的疑问,就是AM,DR的输入口促初始化的时候要将其拉高,否则就会出来那种情况!
[ 本帖最后由 智波景严 于 2012-11-25 13:13 编辑 ]
*作 者:WANGBQ *
*修改时间:2012-11-14 *
*功 能:实现nrf905的数据传输和读取 *
*说 明:无 *
**********************************************************************/
//---------------------------------------------------------------------------/
#include"msp430g2553.h"
#define uchar unsigned char
#define uint unsigned int
#define Tx_MODE (P1OUT |= BIT0) //TX_EN
#define Rx_MODE (P1OUT &=~BIT0) //TX_EN
#define TRx_EN (P1OUT |= BIT1) //TRX_CE
#define TRx_DIS (P1OUT &=~BIT1)//TRX_CE
#define AM (P1IN & BIT2) //address
#define DR (P1IN & BIT3) //R/T_x data is ok
#define MISO (P1IN & BIT4) //FOR read
#define MOSI_HIGH (P1OUT |= BIT5) //for write
#define MOSI_LOW (P1OUT &=~BIT5)
#define SCK_HIGH (P1OUT |= BIT6)
#define SCK_LOW (P1OUT &=~BIT6)
#define CSN_HIGH (P1OUT |= BIT7)
#define CSN_LOW (P1OUT &=~BIT7)
//---------------------------------------------------------------------------/
#define WC (0X00) //write Configuration_Register
#define RC (0X10) //read Configuraion_Register
#define WTP (0X20) //write Translation_Payload
#define RTP (0X21) //read Translation_Payload
#define WTA (0X22) //write Tanslation_Address
#define RTA (0X23) //read Tanslation_Assress
#define RRP (0X24) //read Receive_Payload */
//---------------------------------------------------------------------------/
uchar TRX_Conf[10]={0x4c, 0x0c, 0x44, 0x01, 0x01, 0xcc, 0xcc, 0xcc,0xcc, 0x58};
/*uchar TRX_Conf[10]={0x4c, 0x0c, 0x44, 0x20, 0x20, 0xcc, 0xcc, 0xcc,0xcc, 0x58};
注释: 0x4c : CH_ON,423MHz频段;
0x0c : 输出功率10dB,不重发,节点为正常;
0x44 : 设置地址宽度为四字节;
0x20,0x20 : 收、发有效数据长度为32字节;(0x01 为一字节)
0xcc,0xcc,0xcc,0xcc : 接收地址(本机地址);
0x58 : CRC使能,八位CRC校正,外部时钟不使能,16M晶振;
*/
int Readbuf=0;
//---------------------------------------------------------------------------/
void delay(uchar x);
void delayms(uchar x);
void SPI_write(uchar byte);
uchar SPI_read();
void Init();
void Conf_nrf905();
void Tran_packet(uchar dat,uchar addr);
void Receive_packet();
//---------------------------------------------------------------------------/
/***********************************************************************
*函数名称: main *
*函数参量: 无 *
*函数功能:实现nrf905的数据传输和读取 *
*说 明: *
************************************************************************/
void main()
{
WDTCTL = WDTHOLD + WDTPW;
Init();
Conf_nrf905();
for(;;)
{
// Receive_packet();
Tran_packet(0x01,0xee); //向地址0xee的从机发送数据0x01
}
}
/***********************************************************************
*函数名称: *
*函数参量: *
*函数功能: *
*说 明: *
************************************************************************/
void delay(uchar x)
{
while(x--)
{
_NOP();
}
}
/***********************************************************************
*函数名称: *
*函数参量: *
*函数功能: *
*说 明: *
************************************************************************/
void delayms(uchar x)
{
int i,j;
for(i=x;i>0;i--)
for(j=110;j>0;j--);
}
/***********************************************************************
*函数名称: *
*函数参量: *
*函数功能: *
*说 明: *
************************************************************************/
void SPI_write(uchar byte)
{
uchar i,buf=byte;
for(i=0;i<8;i++)
{
SCK_LOW;
if(buf & 0x80) MOSI_HIGH ;
else MOSI_LOW ;
SCK_HIGH;
buf<<=1 ;
SCK_LOW;
}
}
/***********************************************************************
*函数名称: *
*函数参量: *
*函数功能: *
*说 明: *
************************************************************************/
uchar SPI_read()
{
uchar i,buf=0;
for(i=0;i<8;i++)
{
SCK_LOW;
buf<<=1 ;
if(MISO) buf |=0x01;
else buf &= ~BIT0 ;
SCK_HIGH ;
delay(2);
SCK_LOW;
}
return buf;
}
/***********************************************************************
*函数名称: *
*函数参量: *
*函数功能: *
*说 明: *
************************************************************************/
void Init()
{
P1DIR |= BIT4 + BIT3 + BIT2; //避免2.3.4口因为其他配置而保持低电平。
P1OUT |= BIT4 +BIT3;
P1OUT &= ~BIT2 ;
P1DIR = 0xe3 ; //0.1.5.6.7 output
P2DIR |= BIT5 + BIT0;
P2OUT |= BIT5;
TRx_DIS;
CSN_HIGH;
SCK_LOW;
}
/***********************************************************************
*函数名称: *
*函数参量: *
*函数功能: *
*说 明: *
************************************************************************/
void Conf_nrf905()
{
uchar i;
CSN_LOW ;
SPI_write(WC);
for(i=0;i<10;SPI_write(TRX_Conf[i++]));
CSN_HIGH;
TRx_DIS;
}
/***********************************************************************
*函数名称: *
*函数参量: *
*函数功能: *
*说 明: *
************************************************************************/
void Tran_packet(uchar dat,uchar addr)
{
Tx_MODE;
CSN_LOW;
SPI_write(WTA);
SPI_write(addr);
SPI_write(addr);
SPI_write(addr);
SPI_write(addr);
CSN_HIGH;
delayms(1);
CSN_LOW;
SPI_write(WTP);
SPI_write(dat);
CSN_HIGH;
delayms(1);
TRx_EN;
delayms(1);
TRx_DIS;
while(!DR);
P2OUT |= BIT0; //用一根杜邦线把P2.1与一个led连一起,发出数据是它会闪烁。
delayms(100);
P2OUT &= ~BIT0;
}
/***********************************************************************
*函数名称: *
*函数参量: *
*函数功能: *
*说 明: *
************************************************************************/
void Receive_packet()
{
Rx_MODE;
TRx_EN;
delayms(1); //>650us
for(;;)
{
if(AM&&DR) //received
{
TRx_DIS; //stop Receive
CSN_LOW;
SPI_write(RRP);
Readbuf=SPI_read();
CSN_HIGH;
while(DR);
TRx_EN;
P2OUT |= BIT5; //用一根杜邦线吧P2.5与一个led连一起,收完数据是它会闪烁。
delayms(100);
P2OUT &= ~BIT5;
break;
}
}
}
//好久没来论坛了,希望贴上后对你还有帮助
[ 本帖最后由 智波景严 于 2013-1-1 22:31 编辑 ]
一周热门 更多>