liao12338392 发表于 2010-6-13 12:05:08

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

#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 = {       
   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;
uint8 idata RxBuf;
//*****************************************************************************
//函数名: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);
    }
       
    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 = SpiReadWrite(0);
            RfDataCount++;
      }
    }
    if(DataNum == 0x01)
    {
      for(i=1; i<32; i++)//读出数据。
      {
            pBuf = 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)
    {
      case 0x01:
            TxBuf = 0x00;
            TxBuf = 0x0B;
            TxBuf = 0x09;
            TxBuf = 0x00;
            TxBuf = 0x00;
            TxBuf = 0x07;
            TxBuf = 0xDA;
            TxBuf = 0x00;
            TxBuf = 0x00;
            TxBuf = 0x02;
            TxBuf= 0x63;
            TxBuf= 0x06;
            TxBuf= 0x22;
            for(i=13;i<32;i++)
            {
                TxBuf = 0xFF;       
            }
            for(i=0;i<32;i++)
            {
                UARTPutch(Data);       
            }
                       
            TransmitPacket(TxBuf);
            RxBuf = 0x00;
            break;
      case 0x02:
            if(RfDataCount<DataLen)
            {
                break;
            }
            TxBuf = 0x00;
            TxBuf = 0x19;
            TxBuf = 0x0A;
            TxBuf = RxBuf;
            TxBuf = RxBuf;
            TxBuf = RxBuf;
            TxBuf = RxBuf;
            TxBuf = RxBuf;
            TxBuf = RxBuf;
            TxBuf = RxBuf;
            TxBuf= RxBuf;
            TxBuf= RxBuf;                //Gate
            TxBuf= 0x30;
            TxBuf= 0x30;
            TxBuf= 0x30;
            TxBuf= 0x30;
            TxBuf= 0x30;
            TxBuf= 0x30;
            TxBuf= 0x30;
            TxBuf= 0x30;
            TxBuf= 0x34;
            TxBuf= 0x49;
            TxBuf= 0x00;
            TxBuf= 0x34;
            TxBuf= 0x34;
            TxBuf= 0x34;
            TxBuf= 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 = 0x00;
            TxBuf = 0x19;
            TxBuf = 0x0B;
            TxBuf = RxBuf;
            TxBuf = RxBuf;
            TxBuf = RxBuf;
            TxBuf = RxBuf;
            TxBuf = RxBuf;
            TxBuf = RxBuf;
            TxBuf = RxBuf;
            TxBuf= RxBuf;
            TxBuf= RxBuf;                //Gate
            TxBuf= 0x30;
            TxBuf= 0x30;
            TxBuf= 0x30;
            TxBuf= 0x30;
            TxBuf= 0x30;
            TxBuf= 0x30;
            TxBuf= 0x30;
            TxBuf= 0x30;
            TxBuf= 0x34;
            TxBuf= 0x49;
            TxBuf= 0x00;
            TxBuf= 0x34;
            TxBuf= 0x34;
            TxBuf= 0x34;
            TxBuf= 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的?

jemmy 发表于 2010-6-13 15:11:54

这么神奇的问题,我也想知道原因。

n0831 发表于 2010-6-13 16:46:22

查看汇编文件就明白了,有时候Keil会出莫名其妙的问题。可以换个版本试试,或许会好。

liao12338392 发表于 2010-6-17 12:02:36

把那些赋值语句放到一个函数里面去,好像又可以跑,是不是因为栈满了,怎么这样子?

vf1983cs 发表于 2010-12-21 23:37:33

楼主有空多交流我的QQ51412029!!!
页: [1]
查看完整版本: nRF9E5增加了一些赋值语句就无法运行,请高手指教!