搜索
bottom↓
回复: 4

nRF9E5增加了一些赋值语句就无法运行,请高手指教!

[复制链接]

出0入0汤圆

发表于 2010-6-13 12:05:08 | 显示全部楼层 |阅读模式
#include <reg9e5.h>
#define         uint8         unsigned char
#define         uint16        unsigned int

#define HFREQ    0                     // 0=433MHz, 1=868/915MHz    19/08/2004 set 915mhz
#define POWER    3                     // 0=min power...3 = max power

#define EE_WRSR      0x01
#define EE_WRITE     0x02
#define EE_READ      0x03
#define EE_WRDI      0x04
#define EE_RDSR      0x05
#define EE_WREN      0x06

//*****************************************************************************
//I/O口定义
//*****************************************************************************
sbit LED = P0^5;

//*****************************************************************************
//配置寄存器
//*****************************************************************************
uint8 idata Nrf9e5Config[10] = {       
   125,                        //频道设置
   0x0C,                        //自动重发关,发送节电模式关,输出功率10dB,915MHZ
   0x44,                        //收发地址都为4字节
   0x20,                        //接收数据长度,4字节
   0x20,                        //发送数据长度,4字节
   0xCC,
   0xCC,
   0xCC,
   0xCC,                        //地址                       
   0x58                        //CRC开,16位校验,16M晶振,外部时钟使能500KHZ输出
};

//*****************************************************************************
//全局变量
//*****************************************************************************
uint8 RfDataCount = 0;
uint8 DataNum = 0;
uint8 DataLen = 0;
uint8 idata TxBuf[32];
uint8 idata RxBuf[65];
//*****************************************************************************
//函数名:void Delay100us(uint8 n)
//输入:时间
//输出:无
//功能描述:廷时100us
//*****************************************************************************
void Delay100us(uint8 n)
{
    uint8 i;
    while(n--)
    for(i=0;i<35;i++);
}

//*****************************************************************************
//函数名:void delay(uint16 s)
//输入:时间
//输出:无
//功能描述:普通廷时
//*****************************************************************************
void delay(uint16 s)
{
    uint16 i;
    for(i=0; i<s; i++);
    for(i=0; i<s; i++);
}

//*****************************************************************************
//函数名:uint8 SpiReadWrite(uint8 b)
//输入:发送的数据
//输出:收到的数据
//功能描述:SPI发送接收一个字节
//*****************************************************************************
uint8 SpiReadWrite(uint8 b)
{
    EXIF &= ~0x20;                        // 清除SPI中断标致位
    SPI_DATA = b;                             
    while((EXIF & 0x20) == 0x00);        //等待发送接收完成
    return SPI_DATA;
}


//*****************************************************************************
//函数名:InitUart(void)
//输入:无
//输出:无
//功能描述:串口初始化
//*****************************************************************************
void InitUart(void)
{
    TH1 = 243;                      // 19200                             
    CKCON |= 0x10;
    PCON = 0x80;                    // SMOD=1
    SCON = 0x52;                    // 模式1,使能接收
    TMOD &= ~0x30;
    TMOD |= 0x20;                  
    TR1 = 1;                        // timer1开启
    P0_ALT |= 0x06;                 // 串口端口使能
    P0_DIR |= 0x02;                 // P0.1 输入
    ES = 0;
}

//*****************************************************************************
//函数名:void SendCh(uint8 c)
//输入:发送的数据
//输出:无
//功能描述:发送一个字节
//*****************************************************************************
void UARTPutch(uint8 c)
{
    EA = 0;
    TI = 0;
    SBUF = c;
    while(!TI);//等待发送完成
    TI = 0;
    EA = 1;
}

//*****************************************************************************
//函数名:void InitCpu(void)
//输入:无
//输出:无
//功能描述:Cpu初始化
//*****************************************************************************               
void InitCpu(void)
{
    uint8 cklf;
    SPICLK = 1;                                 // Max SPI clock
    SPI_CTRL = 0x02;                            // SPI接到RF端
    RACSN = 0;
    SpiReadWrite(RRC | 0x09);
    cklf = SpiReadWrite(0) | 0x04;
    RACSN = 1;
    RACSN = 0;
    SpiReadWrite(WRC | 0x09);
    SpiReadWrite(cklf);
    RACSN = 1;
    P0_DIR=P0_DIR&0x1F;                        //P0.6,P0.5,P0.7 输出  
    LED=0;
    P0_DIR |= 0x18;                             // P0.3,P0.4 输入
    EA = 1;
}               

//*****************************************************************************
//函数名:void Init9E5(void)
//输入:无
//输出:无
//功能描述:Nrf9e5初始化,这里我们配置成32位地址。
//*****************************************************************************
void Init9E5(void)
{       
    uint8 i;
    TRX_CE=0;
    TXEN=0;                                //配置模式
    RACSN = 0;
    SpiReadWrite(WRC);       
    for(i=0; i<10; i++)
    {
        SpiReadWrite(Nrf9e5Config); //写入配置寄存器
    }

    RACSN = 1;
}

//*****************************************************************************
//函数名:TransmitPacket(uint8 *pBuf)
//输入:发送的数据
//输出:无
//功能描述:发送发送缓冲区的数据
//*****************************************************************************
void TransmitPacket(uint8 *pBuf)
{
    uint8 i;
   
    EA = 0;
    TRX_CE = 0;
    TXEN = 1;                                // Set Tx Mode
   
    Delay100us(12); ///////////////////////
    RACSN = 0;
    SpiReadWrite(WTP);
    for (i=0;i<32;i++)
    {
        SpiReadWrite(pBuf);                // Write dataleth bytes Tx data
    }

    RACSN = 1;
    Delay100us(12);
    RACSN=0;                                // Spi enable for write a spi command       
    SpiReadWrite(WTA);                // Write address command
  
    for(i=0;i<4;i++)
    {
        SpiReadWrite(Nrf9e5Config[i+5]);
    }
       
    RACSN=1;                            // Spi disable                                                        
    TRX_CE = 1;                                // Set TRX_CE high,start Tx data transmission
    while(DR==0);
    TXEN = 0;
    TRX_CE = 1;
    EA = 1;
}

//*****************************************************************************
//函数名:uint8 Recepacket(uint8 *pBuf)
//输入:接收数据缓冲区
//输出:成功返回1,否则返回0
//功能描述:接收数据存在缓冲区内
//*****************************************************************************
uint8 Recepacket(uint8 *pBuf)
{
    uint8 i;
    EA = 0;
    TXEN = 0;
    TRX_CE = 0;   
    RACSN = 0;
    SpiReadWrite(RRP);

    DataNum = SpiReadWrite(0);
    if(DataNum == 0x00)
    {
        DataLen = SpiReadWrite(0);
        for(i=2; i<32; i++)//读出数据。
        {
            pBuf[RfDataCount] = SpiReadWrite(0);
            RfDataCount++;
        }
    }
    if(DataNum == 0x01)
    {
        for(i=1; i<32; i++)//读出数据。
        {
            pBuf[RfDataCount] = SpiReadWrite(0);
            RfDataCount++;       
        }
    }
    if(RfDataCount >= DataLen)
    {
        RfDataCount = DataLen = DataNum = 0;
    }
    RACSN = 1;
    TRX_CE = 1;
    while(DR)        //直到DR为高。
    {
        SpiReadWrite(0);
    }
    TXEN =0;
    TRX_CE = 1;
    EA =1;
    return 1;
}

uint8 EEStatus(void)
{
    uint8 temp;
    EECSN = 0;
    SpiReadWrite(EE_RDSR);
    temp = SpiReadWrite(0);
    EECSN = 1;
    return temp;
}

uint8 EERead(uint16 addr)
{
    uint8 temp;
    SPICLK = 5;
    SPI_CTRL = 0x01;
    while((EEStatus()&0x01)!=0x00);
    EECSN = 0;
    SpiReadWrite(EE_READ);
    SpiReadWrite(addr/256);
    SpiReadWrite(addr);
    temp = SpiReadWrite(0);
    EECSN = 1;
    SPICLK = 1;//temp2;
    SPI_CTRL = 0x02;
    return temp;
}

void EEWrite(uint16 addr,uint8 temp)
{
    SPICLK = 5;
    SPI_CTRL = 0x01;
    while((EEStatus()&0x01)!=0x00);
    EECSN = 0;
    SpiReadWrite(EE_WREN);
    EECSN = 1;
    EECSN = 0;
    SpiReadWrite(EE_WRITE);
    SpiReadWrite(addr/256);
    SpiReadWrite(addr);
    SpiReadWrite(temp);
    EECSN = 1;
    SPICLK = 1;//temp2;
    SPI_CTRL = 0x02;
}

void Process_Rev(uint8 *Data)
{
    uint8 i;
    switch(Data[0])
    {
        case 0x01:
            TxBuf[0] = 0x00;
            TxBuf[1] = 0x0B;
            TxBuf[2] = 0x09;
            TxBuf[3] = 0x00;
            TxBuf[4] = 0x00;
            TxBuf[5] = 0x07;
            TxBuf[6] = 0xDA;
            TxBuf[7] = 0x00;
            TxBuf[8] = 0x00;
            TxBuf[9] = 0x02;
            TxBuf[10]= 0x63;
            TxBuf[11]= 0x06;
            TxBuf[12]= 0x22;
            for(i=13;i<32;i++)
            {
                TxBuf = 0xFF;       
            }
            for(i=0;i<32;i++)
            {
                UARTPutch(Data);       
            }
                       
            TransmitPacket(TxBuf);
            RxBuf[0] = 0x00;
            break;
        case 0x02:
            if(RfDataCount<DataLen)
            {
                break;
            }
            TxBuf[0] = 0x00;
            TxBuf[1] = 0x19;
            TxBuf[2] = 0x0A;
            TxBuf[3] = RxBuf[1];
            TxBuf[4] = RxBuf[2];
            TxBuf[5] = RxBuf[3];
            TxBuf[6] = RxBuf[4];
            TxBuf[7] = RxBuf[5];
            TxBuf[8] = RxBuf[6];
            TxBuf[9] = RxBuf[7];
            TxBuf[10]= RxBuf[8];
            TxBuf[11]= RxBuf[17];                //Gate
            TxBuf[12]= 0x30;
            TxBuf[13]= 0x30;
            TxBuf[14]= 0x30;
            TxBuf[15]= 0x30;
            TxBuf[16]= 0x30;
            TxBuf[17]= 0x30;
            TxBuf[18]= 0x30;
            TxBuf[19]= 0x30;
            TxBuf[20]= 0x34;
            TxBuf[21]= 0x49;
            TxBuf[22]= 0x00;
            TxBuf[23]= 0x34;
            TxBuf[24]= 0x34;
            TxBuf[25]= 0x34;
            TxBuf[26]= 0x34;
            for(i=27;i<32;i++)
            {
                TxBuf = 0xFF;       
            }
            for(i=0;i<64;i++)
            {
                //EEWrite(0xF90+i,Data);
                //Data = EERead(0xF90+i);
                UARTPutch(Data);       
            }
            TransmitPacket(TxBuf);
            for(i=0;i<32;i++)
            {
                UARTPutch(TxBuf);
                //EEWrite(0xF90+i,RxBuf);       
            }
            LED = 0;
            break;
        case 0x03:
            LED = 0;
            TxBuf[0] = 0x00;
            TxBuf[1] = 0x19;
            TxBuf[2] = 0x0B;
            TxBuf[3] = RxBuf[1];
            TxBuf[4] = RxBuf[2];
            TxBuf[5] = RxBuf[3];
            TxBuf[6] = RxBuf[4];
            TxBuf[7] = RxBuf[5];
            TxBuf[8] = RxBuf[6];
            TxBuf[9] = RxBuf[7];
            TxBuf[10]= RxBuf[8];
            TxBuf[11]= RxBuf[17];                //Gate
            TxBuf[12]= 0x30;
            TxBuf[13]= 0x30;
            TxBuf[14]= 0x30;
            TxBuf[15]= 0x30;
            TxBuf[16]= 0x30;
            TxBuf[17]= 0x30;
            TxBuf[18]= 0x30;
            TxBuf[19]= 0x30;
            TxBuf[20]= 0x34;
            TxBuf[21]= 0x49;
            TxBuf[22]= 0x00;
            TxBuf[23]= 0x34;
            TxBuf[24]= 0x34;
            TxBuf[25]= 0x34;
            TxBuf[26]= 0x34;
            break;
        default:
            break;
        }
}

/***********************************主程序**************************************/
main()
{
    uint8 i;
    InitCpu();                //初始化CPU
    InitUart();                //初始化串口
    delay(5000);
    Init9E5();                //初始化NRF9E5
       
    LED = 1;
    EECSN=1;
    TRX_CE = 1;
    while(1)
    {
               
        if(DR)
        {
            Recepacket(RxBuf);
            Process_Rev(RxBuf);
            LED = !LED;

        }
                       
    }                          
}


以上是基于Keil开发环境的源码,去掉Process_Rev()函数的case 0x03赋值内容,程序就能正常运行,但增加case 0x03部分赋值内容就无法运行(case 0x02和case 0x03是一样的)。还有一个问题就是,Uartl已经设置为19200了,但为什么变成4800的?

出0入0汤圆

发表于 2010-6-13 15:11:54 | 显示全部楼层
这么神奇的问题,我也想知道原因。

出0入42汤圆

发表于 2010-6-13 16:46:22 | 显示全部楼层
查看汇编文件就明白了,有时候Keil会出莫名其妙的问题。可以换个版本试试,或许会好。

出0入0汤圆

 楼主| 发表于 2010-6-17 12:02:36 | 显示全部楼层
把那些赋值语句放到一个函数里面去,好像又可以跑,是不是因为栈满了,怎么这样子?

出0入0汤圆

发表于 2010-12-21 23:37:33 | 显示全部楼层
楼主有空多交流我的QQ51412029!!!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-29 23:43

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表