3586|5

25

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

请教nRF905数据发送的问题 [复制链接]

最近调试一对nRF905,昨天晚上调试成功了,一直很稳定,今天再试就不行了,接收方DR变高后读数据有时候正确有时候错误(为0x00),后来发现,昨天发送端进入发送模式后DR变高但是接着会变低(这里是不是因为数据发送完了就变低?),今天是变高后一直未高,是不是说没有发送完?可是程序我又没变,很是郁闷...请教大家帮我看看,我实在是不知道哪儿有问题,我用的是M16,下面是程序,有不对的地方请指教,谢谢了!
#include <mega16.h>
#include <delay.h>
 
#define uint unsigned int
#define uchar unsigned char
 
#define DATA7 (DATA_BUF&(1<<7))!= 0
#define DATA0 (DATA_BUF&(1<<0))!= 0
//----------------配置口定义---------------------------------------
#define TXEN_1 PORTB.0=1// (PORTB|=(1<<0))
#define TXEN_0 PORTB.0=0// (PORTB&=~(1<<0))
#define TRX_CE_1 PORTB.1=1// (PORTB|=(1<<1))
#define TRX_CE_0 PORTB.1=0// (PORTB&=~(1<<1))
#define PWR_1 PORTB.2=1// (PORTB|=(1<<2))
#define PWR_0 PORTB.2=0// (PORTB&=~(1<<2))
#define MISO PINB.3// (PINB&(1<<3))
#define MOSI_1 PORTB.4=1// (PORTB|=(1<<4))
#define MOSI_0 PORTB.4=0// (PORTB&=~(1<<4))
#define SCK_1 PORTB.5=1// (PORTB|=(1<<5))
#define SCK_0 PORTB.5=0// (PORTB&=~(1<<5))
#define CSN_1 PORTB.6=1// (PORTB|=(1<<6))
#define CSN_0 PORTB.6=0// (PORTB&=~(1<<6))
//---------------------NRF905状态IO-------------------------------------
#define AM PINA.0
#define DR PINA.1
#define CD PINA.2
//--------------------------------nrf905控制指令------
#define WC 0x00
#define RC 0x10
#define WTP 0x20
#define RTP 0x21
#define WTA 0x22
#define RTA 0x23
#define RRP 0x24
 
uchar TxAddress[4]={0xcc,0xcc,0xcc,0xcc}; //发送端发送的地址(接收端的本机地址)
 
unsigned char DATA_BUF;
unsigned char TxBuf[4]=
{
0x01,0x02,0x03,0x04
};
 
unsigned char RxBuf[4];
 
unsigned char RFConf[11]=
{
  0x00, //配置命令//
  0x4c, //CH_NO,配置频段在430MHZ
  0x0c, //输出功率为10db,不重发,节电为正常模式
  0x44, //地址宽度设置,为4字节
  0x04,0x04, //接收发送有效数据长度为32字节
  0xCC,0xCC,0xCC,0xCC, //本机地址
  0x58, //CRC充许,8位CRC校验,外部时钟信号不使能,16M晶振
};
 
 
// SPI读操作
 
unsigned char SpiRead(void)
{
  unsigned char j;
  for(j=0;j<8;j++)
  {
  DATA_BUF=DATA_BUF<<1;
  SCK_1; //初始化时SCK为低电平  
  if(MISO) //读取最高位先保存到末尾,通过左移到最高位
  {
  DATA_BUF|=(1<<0);
  }  
  else
  {
  DATA_BUF&=~(1<<0);
  }   
  SCK_0;
  }
  return DATA_BUF;
}
 
//spi写函数
void SpiWrite(unsigned char send)
{
  unsigned char i;
  DATA_BUF=send;  
  for(i=0;i<8;i++)
  {
  if(DATA7)
  {
  MOSI_1;
  }   
  else
  {
  MOSI_0;
  }   
  SCK_1;  
  DATA_BUF=DATA_BUF<<1;  
  SCK_0;   
  }   
}
 
 
void nRF905Init(void)
{
  CSN_1; // Spi disable
  SCK_0; // Spi clock line init low
  PORTA=0XFF; //AM DR CD输入拉高
  DDRA=0X00;
  PWR_1; // nRF905 power on
  TRX_CE_0; // Set nRF905 in standby mode
  TXEN_0; // set radio in Rx mode
}
//--------------------初始化寄存器-----------------------------------
 
 
void Config905(void)
{
  unsigned char i;
  CSN_0; // Spi enable for write a spi command
  for (i=0;i<11;i++) // Write configration words 写放配置字
  {
  SpiWrite(RFConf);  
  // delay_us(2);
  }
  CSN_1; // Disable Spi
}
//---------------------------发送数据打包-----------------------------------
 
void TxPacket(uchar *TxRxBuf)
{
  unsigned char i;
  CSN_0;
  SpiWrite(WTP); // Write payload command
  for (i=0;i<4;i++)
  {
  SpiWrite(TxBuf); // Write 32 bytes Tx data  
  // delay_us(2);
  }// Spi enable for write a spi command
  CSN_1;
  // delay_ms(1); // Spi disable
  CSN_0; // Spi enable for write a spi command
  SpiWrite(WTA); // Write address command
  for (i=0;i<4;i++) // Write 4 bytes address
  {
  SpiWrite(TxAddress);  
  // delay_us(2);
  }
  CSN_1; // Spi disable  
  // delay_us(2);
 
  TRX_CE_1; // Set TRX_CE high,start Tx data transmission  
  delay_ms(1); // // while (DR!=1);
  delay_ms(1);
  TRX_CE_0; // Set TRX_CE low 发送完成后进入空闲模式
}
//------------------------设置发送状态------------------------------
void SetTxMode(void)
{
  TRX_CE_0;
  TXEN_1;
  delay_ms(2); // delay for mode change(>=650us)
}
//------------设置接受状态-----------------------------------------
void SetRxMode(void)
{
  TXEN_0;
  TRX_CE_1;
  delay_ms(2); // delay for mode change(>=650us)
}
 
//----------读NRF905接收数据--------------------------------
void RxPacket(void)   
{
  uchar i;
  TRX_CE_0;
  CSN_0; // Spi enable for write a spi command
  delay_ms(1);
  SpiWrite(RRP);
  for (i = 0 ;i < 4 ;i++)
  {
  RxBuf=SpiRead(); // Read data and save to buffer
  delay_us(2);   
  }
  CSN_1;
  delay_ms(1);
  TRX_CE_1;   
}
 
void main(void)
{
// Declare your local variables here
  DDRB=0xF7; //MISO(PB3)为输入 其他输出
  DDRA=0x00;
  nRF905Init();
  Config905();
 
while (1)
  {
  SetTxMode();
  TxPacket(TxBuf);
  }
 

最新回复

模拟SPI的???  详情 回复 发表于 2012-8-28 09:57
点赞 关注
 

回复
举报

20

帖子

0

TA的资源

一粒金砂(中级)

沙发
 
我也调过。调了很久一直没出来,后来才发现是插座有问题,闹心死了
 
 
 

回复

3404

帖子

6

TA的资源

裸片初长成(初级)

板凳
 
没有用过!
 
 
 

回复

17

帖子

0

TA的资源

一粒金砂(中级)

4
 

楼主用的是啥单片机呢?mega16?

 

AVR可以直接读端口状态?PINA.0表示A端口第一个位?楼主用的啥编辑器啊?我用的ICCAVR,读端口不能这样直接表示啊,

[ 本帖最后由 zxy760803 于 2012-6-13 22:26 编辑 ]
 
 
 

回复

17

帖子

0

TA的资源

一粒金砂(中级)

5
 

期待谁来解决楼主的问题

[ 本帖最后由 zxy760803 于 2012-6-13 23:54 编辑 ]
 
 
 

回复

113

帖子

1

TA的资源

一粒金砂(中级)

6
 
模拟SPI的???
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表