2391|2

75

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

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);
}
}
}

最新回复

问题是后面的程序老卡在DR判断上,前面程序调试不出来   详情 回复 发表于 2010-5-9 14:29
点赞 关注

回复
举报

66

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
楼主贴了 一大堆代码,但好像没说具体问题吧;

建议楼主去凌阳 官网的BBS上搜索下或者求助下,那么的筒子们 对于凌阳的SPCE061A更专注;

MARK,祝你好运! 顶下。
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
问题是后面的程序老卡在DR判断上,前面程序调试不出来
 
 
 

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

查找数据手册?

EEWorld Datasheet 技术支持

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

 
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
快速回复 返回顶部 返回列表