最近调试一对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);
}
}
此帖出自
小平头技术问答
一周热门 更多>