|
nrf905在凌阳61上的问题!!大家帮帮忙!急啊
[复制链接]
#include "SPCE061A.H"
#include "math.h"
#include "bit.h" //位操作 1.8.4版
#define uchar unsigned char
#define LED pb_buffer->bit.bit12
#define MOSI pb_buffer->bit.bit7 //模拟SPI总线
#define MISO pb_buffer->bit.bit8
#define SCK pb_buffer->bit.bit9
#define CSN pb_buffer->bit.bit10
#define AM pb_buffer->bit.bit0
#define CD pb_buffer->bit.bit1
#define DR pb_buffer->bit.bit2
#define PWR_UP pb_buffer->bit.bit3
#define TX_EN pb_buffer->bit.bit4
#define TRX_CE pb_buffer->bit.bit5
#define WC 0x00 // 写配置寄存器(RF-Configuration Register)
#define RC 0x10 // 读配置寄存器(RF-Configuration Register)
#define WTP 0x20 // 向TX-Payload寄存器写入发送有效数据
#define RTP 0x21 // 从TX-Payload寄存器读取发送有效数据
#define WTA 0x22 // 向TX-Address寄存器写入发送地址
#define RTA 0x23 // 从TX-Address寄存器读取发送地址
#define RRP 0x24 // 从RX-Payload寄存器读取接收到的有效数据
//unsigned char flag,flag1;
unsigned char DATA_BUF;//16位
unsigned char RxBuf[32];
unsigned char TxBuf[32];
typedef struct RFConfig
{
uchar n;
uchar buf[10];
}RFConfig;
RFConfig RxTxConf =
{
10,
0x4c, 0x0c, 0x44, 0x20, 0x20, 0xcc, 0xcc, 0xcc,0xcc, 0x58
};
//buf[10] 中数据对应 字节0 ~ 字节9 ,具体内容可参考上文寄存器配置章节
//注:对于频段设置参数CH_NO,在我们提供的范例程序中CH_NO[7:0]的值为0x4c。
//
void Delay(unsigned int k)
{ //延时子程序
unsigned int i;
for(i=0; i
{
*P_Watchdog_Clear=0x0001; //清WatchDog
}
}
void strcpy(unsigned char *p,unsigned char *q)
{
while(*q!='\0')
{
*p=*q;
p++;q++;
}
*p='\0';
}
void SpiWrite(uchar byte)
{
uchar i;
DATA_BUF=byte; // 将需要发送的数据写入缓存
for (i=0;i<8;i++) // 循环8次发送一个字节的数据
{
if (DATA_BUF&0x80) // 取data_buf最高位;
MOSI=1;
else
MOSI=0;
SCK=1; // SCK 高电平
DATA_BUF=DATA_BUF<<1; // 左移一位,为下一位的发送做准备
SCK=0; // SCK 低电平
}
}
//
uchar SpiRead(void)
{
uchar i;
for (i=0;i<8;i++)
{
DATA_BUF=DATA_BUF<<1; //左移一位,准备接收下一位数据
SCK=1; // SCK 高电平
if (*P_IOA_Data&0x0100)
DATA_BUF=DATA_BUF|0x01; // 最低位写1
else
DATA_BUF=DATA_BUF|0x00;//最低位写0
SCK=0; // SCK低电平
}
return DATA_BUF; // DATA_BUF 为接收到的完整数据
}
//<主机通过SPI接口向905配置寄存器写入信息>
void Config905(void)
{
uchar i;
CSN=0; // CSN片选信号,SPI使能
SpiWrite(WC); // 向905芯片写配置命令
for (i=0;i
{
SpiWrite(RxTxConf.buf); //RxTxConf保存预先设置好的配置信息
}
CSN=1; // 结束SPI数据传输
}
//使用nRF905发送数据
void TxPacket(void)
{
uchar i;
CSN=0;
SpiWrite(WTP); // Write payload command
for (i=0;i<32;i++)
{
SpiWrite(TxBuf); // 写入32直接发送数据
}
CSN=1; // 关闭SPI,保存写入的数据
Delay(10);
CSN=0; // SPI使能,准备写入地址信息
SpiWrite(WTA); // 写数据至地址寄存器
for (i=0;i<4;i++) // 写入4字节地址
{
SpiWrite(RxTxConf.buf[i+5]);
}
CSN=1; // 关闭SPI
TRX_CE=1; // 进入发送模式,启动射频发送
// while(!(*P_IOA_Data&0x0004));
Delay(100); // 进入ShockBurst发送模式后,芯片保证数据发送完成后返回STANDBY模式z
TRX_CE=0;
}
void RxPacket(void)
{
uchar i;
TRX_CE=0; // 设置905进入待机模式
CSN=0; // 使能SPI
SpiWrite(RRP); // 准备读取接收到的数据
for (i=0;i<32;i++)
{
RxBuf=SpiRead(); // 通过SPI接口从905芯片读取数据
}
CSN=1; // 禁用SPI
while((*P_IOA_Data&0x0004)||(*P_IOA_Data&0x0001));
TRX_CE=0;
}
//<设置器件为发送模式>
void SetTxMode(void)
{
TX_EN=1;
TRX_CE=1;
Delay(6000); // delay for mode change(>=650us)
}
//<设置器件为接收模式>
void SetRxMode(void)
{
TX_EN=0;
TRX_CE=1;
Delay(60000); // delay for mode change(>=650us)
}
void nRF905Init(void)
{ *P_IOA_Dir=0xFEF8;
*P_IOA_Attrib=0xFEFF;
*P_IOA_Data=0xffff;
*P_IOB_Dir=0xFEF8;
*P_IOB_Attrib=0xFeF8;
*P_IOB_Data=0xFFFF;
CSN=1; // Spi disable
SCK=0; // Spi clock line init low
DR=0; // Init DR for input
AM=0; // Init AM for input
CD=0; // Init CD for input
PWR_UP=1; // nRF905 power on
TRX_CE=0; // Set nRF905 in standby mode
TX_EN=0; // set radio in Rx mode
}
void send(unsigned char *p)
{
strcpy(TxBuf, p);
TxPacket();
SetTxMode();
}
void re()
{
SetRxMode();
RxPacket();
}
int strcmp(unsigned char *p,unsigned char *q)
{
int a;int n;n=0;a=0;
while(*q!='\0')
{
if(*p=*q&&n<=31){n++;p++;q++;}
else{p++;q++;a=0;}
if(n=31){a=1;}
}
return a;
}
unsigned char data[]={"yes "};
void led()
{
LED=0;Delay(6000);
LED=1;Delay(6500);
}
main()
{
while(1)
{nRF905Init();
Config905();
CSN=0;
SpiWrite(WTP); // Write payload command
SpiWrite('F'); // 写入32直接发送数据
CSN=1; // 关闭SPI,保存写入的数据
Delay(1);
CSN=0;
SpiWrite(RTP); // Write payload command
//DATA_BUF=0x50;
a=SpiRead(); // 写入32直接发送数据
CSN=1; // 关闭SPI,保存写入的数据
Delay(1);
LED=0;
Delay(65535);
LED=1;
Delay(65535);
}
LED=0;
while(1)
{
nRF905Init();
Config905();
re();
if(strcmp(data,RxBuf)==1)
{
led();
}
}
}
这是接受程序,以下发射主函数。无法实现发送和接受
main()
{
while(1)
{
nRF905Init();
Config905();
send("yes ");
LED=0;
Delay(6000);
LED=1;
Delay(6000);
}
}
/**以下使用Avr调试成功之后改的发射程序:////
#include "SPCE061A.H"
#include "unSPMACRO.h"
#include "math.h"
#include "bit.h" //位操作 1.8.4版
#define uchar unsigned char
#define LED pb_buffer->bit.bit12
#define MOSI pb_buffer->bit.bit7 //模拟SPI总线
#define MISO pb_buffer->bit.bit8
#define SCK pb_buffer->bit.bit9
#define CSN pb_buffer->bit.bit10
#define AM pb_buffer->bit.bit0
#define CD pb_buffer->bit.bit1
#define DR pb_buffer->bit.bit2
#define PWR pb_buffer->bit.bit3
#define TXEN pb_buffer->bit.bit4
#define TRX_CE pb_buffer->bit.bit5
uchar buf[]={12,34,56,78};
//RF配置寄存器
uchar RFcon[11]={0x00,0x6c,0x0c,0x44,0x04,0x04,0xe7,0xe7,0xe7,0xe7,0xde};
void delay_us(unsigned int k)
{
unsigned int i;
for(i=0; i
{
*P_Watchdog_Clear=0x0001; //清WatchDog
}
}
void delay_ms(unsigned int k)
{
unsigned int i;
for(i=0; i<1000*k; i++)
{
*P_Watchdog_Clear=0x0001; //清WatchDog
}
}
//写数据到rf905
void spiwrite(uchar b)
{
uchar i=8;
while(i--)
{
delay_ms(10);
SCK=0;
MOSI=b&0x80;
b<<=1;
delay_ms(10);
SCK=1;
delay_ms(10);
SCK=0;
}
SCK=0;
}
//发送数据包
void Txbao(void)
{
TXEN=1;
CSN=0;
spiwrite(0x22);
spiwrite(0xe7);
spiwrite(0xe7);
spiwrite(0xe7);
spiwrite(0xe7);
CSN=1;
delay_us(2);
CSN=0;
spiwrite(0x20);
spiwrite(buf[0]);//数据
spiwrite(buf[1]);//数据
spiwrite(buf[2]);//数据
spiwrite(buf[3]);//数据
CSN=1;
delay_us(2);
TRX_CE=1;
delay_ms(50);
TRX_CE=0;
while(!DR);
}
//初始化
void init(void)
{
uchar i;
SCK=1;
AM=1;
TXEN=1;
PWR=1;
MOSI=1;
CSN=1;
CSN=1;
SCK=0;
PWR=1;
TRX_CE=0;
TXEN=0;
delay_us(2);
CSN=0;
for(i=0;i<11;i++)
{
spiwrite(RFcon);
}
CSN=1;
PWR=1;
delay_ms(1000);
}
这是main.c:
#include
#include "905.c "
void delay10s(void)
{
uchar i;
for(i=3;i>0;i--)
{
delay_ms(1000);
}
}
void main()
{
*P_SystemClock|=0x0001;
init();
while (1)
{
Txbao();
delay10s();
LED=0;
delay_ms(100);
LED=1;
delay_ms(100);
}
}
/**********************************************以下是接受:*/////////////
#include "SPCE061A.H"
#include "math.h"
#include "bit.h" //位操作 1.8.4版
#define uchar unsigned char
//#define MISO1 pa_buffer->bit.bit8
//#define LED1 pa_buffer->bit.bit12
#define LED pb_buffer->bit.bit12
#define MOSI pb_buffer->bit.bit7 //模拟SPI总线
#define MISO pb_buffer->bit.bit8
#define SCK pb_buffer->bit.bit9
#define CSN pb_buffer->bit.bit10
#define AM pb_buffer->bit.bit0
#define CD pb_buffer->bit.bit1
#define DR pb_buffer->bit.bit2
#define PWR pb_buffer->bit.bit3
#define TXEN pb_buffer->bit.bit4
#define TRX_CE pb_buffer->bit.bit5//配置口
//状态输出口
uchar buf[4];
//RF配置寄存器
uchar RFcon[11]={0x00,0x6c,0x0c,0x44,0x04,0x04,0xe7,0xe7,0xe7,0xe7,0xde};
void delay_ms(unsigned int k)
{ //延时子程序
unsigned int i;
for(i=0; i<1000*k; i++)
{
*P_Watchdog_Clear=0x0001; //清WatchDog
}
}
void delay_us(unsigned int k)
{ //延时子程序
unsigned int i;
for(i=0; i
{
*P_Watchdog_Clear=0x0001; //清WatchDog
}
}
//写数据到rf905
void spiwrite(uchar b)
{
uchar i=8;
while(i--)
{
delay_ms(10);
SCK=0;
MOSI=b&0x80;
b<<=1;
delay_ms(10);
SCK=1;
delay_ms(10);
SCK=0;
}
SCK=0;
}
//由rf905接数据
uchar spiread(void)
{
uchar i=8;
uchar dat=0;
while(i--)
{
dat<<=1;
SCK=0;
delay_ms(10);
if(MISO) dat++;
SCK=1;
delay_ms(10);
}
SCK=0;
return dat;
}
//接受数据包
void Rxbao(void)
{
uchar i=0;
while(DR)
{
buf=spiread();
i++;
}
}
//等待接收数据包
void wait(void)
{
TXEN=0;
TRX_CE=1;
while(!DR);
TRX_CE=0;
CSN=0;
spiwrite(0x24);
Rxbao();
CSN=1;
}
//初始化
void init(void)
{
uchar i;
SCK=1;
AM=1;
TXEN=1;
PWR=1;
MOSI=1;
CSN=1;
CSN=1;
SCK=0;
PWR=1;
TRX_CE=0;
TXEN=0;
delay_us(2);
CSN=0;
for(i=0;i<11;i++)
{
spiwrite(RFcon);
}
CSN=1;
PWR=1;
TRX_CE=1;
TXEN=0;
delay_ms(1000);
}
void main(void)
{
*P_SystemClock|=0x0001;
init();
while (1)
{
wait();
delay_ms(100);
if(buf[0]="12")
{
LED=0;
delay_us(5000);
LED=1;
delay_us(5000);
}
}
}
|
|