智能车制作

标题: MC9S12XS128上基于SPI与NRF905通信问题!!!!跪求!!高手进,调了一天了~~~ [打印本页]

作者: flyeastlxl    时间: 2011-4-21 15:51
标题: MC9S12XS128上基于SPI与NRF905通信问题!!!!跪求!!高手进,调了一天了~~~
我写个与另一NRF905通讯,传输数据的程序
NRF905的DR有反应但是NRF905没数据发送出去
NRF905是好的
初步怀疑是SPI的波特率没调试好,导致通过SPI从单片机发送到NRF905的信息是乱码
只是猜测还望高手帮忙啊!!!
  

#include <hidef.h>      /* common defines and macros */
#include "derivative.h"      /* derivative-specific definitions */

#define uchar unsigned char
#define uint unsigned int

///////////////////////////////
//////////引脚数据寄存器定义///////////
#define RF905_PR_TX_EN        PORTA_PA3
#define RF905_PR_TRX_CE       PORTA_PA4
#define RF905_PR_PWR          PORTA_PA5
#define RF905_PR_CD           PORTA_PA6
#define RF905_PR_AM           PORTA_PA7
#define RF905_PR_DR           PTJ_PTJ7
#define RF905_SPI_PR_CSN      PTM_PTM3
#define RF905_SPI_PR_SCK      PTM_PTM5
#define RF905_SPI_PR_MISO     PTM_PTM2
#define RF905_SPI_PR_MOSI     PTM_PTM4
////////////////////RF905模块引脚方向寄存器定义//////////////////
#define RF905_TR_TX_EN DDRA_DDRA3
#define RF905_TR_TRX_CE DDRA_DDRA4
#define RF905_TR_PWR DDRA_DDRA5
#define RF905_TR_CD DDRA_DDRA6
#define RF905_TR_AM DDRA_DDRA7
#define RF905_TR_DR DDRJ_DDRJ7
#define RF905_SPI_TR_SCK DDRM_DDRM5
#define RF905_SPI_TR_MISO DDRM_DDRM2
#define RF905_SPI_TR_MOSI DDRM_DDRM4
#define RF905_SPI_TR_CSN DDRM_DDRM3
///////////////////RF905中断寄存器定义////////////////
#define RF905_INR_CS_DR       PPSJ_PPSJ7
#define RF905_INR_IE_DR       PIEJ_PIEJ7
#define RF905_INR_IF_DR       PIFJ_PIFJ7

////////////////////////////905-SPI指令/////////////////////////////////
#define WC        0x00          //写905配置字
#define RRC        0x10          //读905配置字
#define WTP        0x20            //写905 发送的32个字节
#define RTP        0x21           //读905 发送的32个字节
#define WTA        0x22             //写905 接收方地址
#define RTA        0x23           //读905 接收方地址
#define RRP        0x24           //读取接收到的32个字节
///////////////////////////NRF_905变量定义/////////////////////////
                        
/////////////////////共用变量定义///////////////////////
int i;
int j;
int Temp;
int Hmt;
long int TmNum;
unsigned char RF905_Spi_RCBuf[32]={0};
uchar RF905_CheckBuf_1[]="FJ1";                             //发送数据
uchar RF905_CheckBuf_2[]="FJ2";                             //发送数据
unsigned char RF905_CheckAddress_1[4]={0xcc,0xcc,0xcc,0xcc};
unsigned char RF905_CheckAddress_2[4]={0xaa,0xaa,0xaa,0xaa};
unsigned char RF905_Conf_1[11]=
{
  0X00,                             //配置命令//
  0x4c,                             //CH_NO,配置频段在423MHZ
  0x0c,                             //输出功率为10db,不重发,节电为正常模式
  0x44,                             //地址宽度设置,为4字节
  0x20,0x20,                        //接收发送有效数据长度为32字节
  0xcc,0xcc,0xcc,0xcc,              //接收地址
  0x58                             //CRC充许,8位CRC校验,外部时钟信号不使                                   //CRC充许,8位CRC校验,外部时钟信号不使能,16M晶振
};
unsigned char RF905_Conf_2[11]=
{
  0X00,                             //配置命令//
  0x4c,                             //CH_NO,配置频段在423MHZ
  0x0c,                             //输出功率为10db,不重发,节电为正常模式
  0x44,                             //地址宽度设置,为4字节
  0x20,0x20,                        //接收发送有效数据长度为32字节
  0xaa,0xaa,0xaa,0xaa,              //接收地址
  0x58                             //CRC充许,8位CRC校验,外部时钟信号不使                                   //CRC充许,8位CRC校验,外部时钟信号不使能,16M晶振
};


///////////////

void RF905_SpiReadSpiWrite(uchar DATA);
void RF905_SpiWrite_Order(uchar *val,uchar num);
void RF905_SpiRead_Order(uchar *val,uchar num);
void RF905_Config_1(void);
void RF905_Config_2(void);
void RF905_SetRCMode(void);
void RF905_SetTXMode (void);
void RF905_RCPacket(void);
void RF905_TXPacket_1(void);
void RF905_TXPacket_2(void);
void RF905_CheckTemp_1(void);
void RF905_CheckTemp_2(void);
void RF905_ProcTemp(void);
////////////////////////////////////公用程序////////////////////////////////////

void __delay_us(unsigned int valus)
{
unsigned int i;
valus=2*valus;
    for(i=0;i<valus;i++)
   {
    ;
   }
   
}
   

void __delay_ms(int ms)
{
   int ii,jj;
   if (ms<1) ms=1;
   for(ii=0;ii<ms;ii++)
     for(jj=0;jj<2670;jj++);   
}
////////////////////系统初始化设置/////////////////////////
void System_Init(void)
{
           RF905_TR_TX_EN=1;
     RF905_TR_TRX_CE=1;
     RF905_TR_PWR=1;
     RF905_TR_CD=0;
     RF905_TR_AM=0;
     RF905_TR_DR=0;
RF905_SPI_TR_CSN=1;
RF905_SPI_TR_SCK=1;
RF905_SPI_TR_MISO=0;
RF905_SPI_TR_MOSI=1;
     
     RF905_PR_TX_EN=0;                             
     RF905_PR_TRX_CE=0;
     RF905_PR_PWR=1;
     RF905_SPI_PR_CSN=1;
RF905_INR_IE_DR=1;
RF905_INR_CS_DR=1;
RF905_INR_IF_DR=0;
SPI0CR1=0X52;
SPI0CR2=0X10;
MODRR=0X10;
SPI0BR=0X42;

}
////////////////////////////////////RF905子程序/////////////////////////////////////
////////////////////RF905-SPI读/写单字节/////////////////////////
void RF905_SpiReadSpiWrite(uchar DATA)        //r
{

  SPI0DR=DATA;
        while(!(SPI0SR&0X20));
       
                                 //写入要发送数据发送的同时也得到数据
       

        }
///////////////////RF905-SPI写数组///////////////////////////
void RF905_SpiWrite_Order(uchar *val,int num)
{
        RF905_SPI_PR_CSN=0;
        __delay_ms(1);
        for(i=0;i<num;i++)
        {
                RF905_SpiReadSpiWrite(val[i]);
        }
    RF905_SPI_PR_CSN=1;
}

////////////////////初始化寄存器_1////////////////////////////
void RF905_Config_1(void)
{
        RF905_SpiWrite_Order(RF905_Conf_1,11);
    __delay_ms(10);
}
////////////////////初始化寄存器_2////////////////////////////
void RF905_Config_2(void)
{
        RF905_SpiWrite_Order(RF905_Conf_2,11);
    __delay_ms(10);
}
////////////////////RF905接收设置////////////////////////////
void RF905_SetRCMode(void)
{
        RF905_PR_TX_EN=0;
        __delay_ms (1);
        RF905_PR_TRX_CE=1;
        __delay_ms(1);
}
////////////////////RF905发送设置////////////////////////////
void RF905_SetTXMode (void)
{
        RF905_PR_TRX_CE=0;
        __delay_ms(1);
        RF905_PR_TX_EN=1;
        __delay_ms(1);
}
////////////////////RF905数据包接收//////////////////////////
void RF905_RCPacket(void)
{
        RF905_PR_TRX_CE=0;
    __delay_ms(1);
    RF905_SPI_PR_CSN=0;
    __delay_ms(1);
    RF905_SpiReadSpiWrite(RRP);
        RF905_SpiRead_Order(RF905_Spi_RCBuf,32);
        while(RF905_PR_AM||RF905_PR_DR);
}
////////////////////RF905_1数据包发送//////////////////////////
void RF905_TXPacket_1(void)
{
        RF905_SPI_PR_CSN=0;
        __delay_ms(1);
        RF905_SpiReadSpiWrite(WTP);
        RF905_SpiWrite_Order(RF905_CheckBuf_1,3);
    __delay_ms(1);
    RF905_SPI_PR_CSN=0;
        RF905_SpiReadSpiWrite(WTA);
        RF905_SpiWrite_Order(RF905_CheckAddress_1,4);
    RF905_PR_TRX_CE=1;
        while(RF905_PR_DR==0);
        RF905_PR_TRX_CE=0;
        RF905_PR_TX_EN=0;
        RF905_INR_IF_DR=0;
    __delay_ms(1);
}
////////////////////RF905_2数据包发送//////////////////////////
void RF905_TXPacket_2(void)
{
        RF905_SPI_PR_CSN=0;
        __delay_ms(1);
        RF905_SpiReadSpiWrite(WTP);
        RF905_SpiWrite_Order(RF905_CheckBuf_2,3);
    __delay_ms(1);
    RF905_SPI_PR_CSN=0;
        RF905_SpiReadSpiWrite(WTA);
        RF905_SpiWrite_Order(RF905_CheckAddress_2,4);
    RF905_PR_TRX_CE=1;
        while(RF905_PR_DR==0);
        __delay_ms(10);
        RF905_PR_TRX_CE=0;
        RF905_PR_TX_EN=0;
    RF905_INR_IF_DR=0;
    __delay_ms(1);
       
}
/////////////////////RF905_1温度检测///////////////////////////
void RF905_CheckTemp_1(void)
{
       
    RF905_Config_1();
        __delay_ms(10);
    RF905_INR_IE_DR=0;
        RF905_SetTXMode();
        RF905_TXPacket_1();
    RF905_INR_IE_DR=1;
        RF905_SetRCMode();
    __delay_ms(100);
}
/////////////////////RF905_2温度检测///////////////////////////
void RF905_CheckTemp_2(void)
{   
       
        RF905_Config_2();
        __delay_ms(10);
    RF905_INR_IE_DR =0;
        RF905_SetTXMode();
        RF905_TXPacket_2();
    RF905_INR_IE_DR=1;
        //RF905_SetRCMode();
       
    __delay_ms(100);
}
/////////////////////RF905温度处理/////////////////////////////
void RF905_ProcTemp(void)
{

        //Temph=RF905_Spi_RCBuf[2]-'0';
    //Templ=RF905_Spi_RCBuf[3]-'0';
        Temp=(RF905_Spi_RCBuf[2]-'0')*10+RF905_Spi_RCBuf[3]-'0';
        //Hmth=RF905_Spi_RCBuf[12]-'0';
        //Hmtl=RF905_Spi_RCBuf[13]-'0';
        Hmt=RF905_Spi_RCBuf[12]-'0'*10+RF905_Spi_RCBuf[13]-'0';
        RF905_Spi_RCBuf[2];
  RF905_Spi_RCBuf[3];
        RF905_Spi_RCBuf[11];
  RF905_Spi_RCBuf[12];

}
void setbusclock(void)
{   
    CLKSEL=0X00;                                          //disengage PLL to system
    PLLCTL_PLLON=1;                                  //turn on PLL
    SYNR=1;                                                                               
    REFDV=1;                                  //pllclock=2*osc*(1+SYNR)/(1+REFDV)=32MHz;
    _asm(nop);                    //If PLL is selected (PLLSEL=1), Bus Clock = PLLCLK / 2=16M     
    while(!(CRGFLG_LOCK==1))
      _asm(nop);                        //when pll is steady ,then use it;
    CLKSEL_PLLSEL =1;                          //engage PLL to system;
}
void main(void)
{
System_Init();
//setbusclock();
//EnableInterrupts;
RF905_CheckTemp_2();
  while(1);
}
作者: flyeastlxl    时间: 2011-4-22 21:54
高手帮帮忙吧~!!!
作者: 雾里飘月    时间: 2011-11-16 16:01
回复 1# flyeastlxl


    大哥你的这个程序程序成功了吗?能不能发一个给我,谢谢了[url=mailtonesin@foxmail.com[/url]onesin@foxmail.com[/url]
作者: Beyoungbehappy    时间: 2011-11-24 20:35
高手……我们一般直接设置PTR8000模块,因为905的寄存器实在是看不懂……
作者: flyeastlxl    时间: 2012-1-11 16:28
回复 4# Beyoungbehappy
额~~905寄存器不难~~
但是PTR8000是什么啊
作者: flyeastlxl    时间: 2012-1-11 16:30
回复 3# 雾里飘月


    那是去年的帖子了~~~貌似直接使用x128的spi是不行的~~因为他俩spi的频率及协议貌似都不对~(905的频率低~)~只能用模拟法~
作者: excellentlizhen    时间: 2012-2-22 17:57

作者: trudy    时间: 2012-4-14 20:51
大哥!  跪求你好使的程序!!  正在调试了!




欢迎光临 智能车制作 (http://dns.znczz.com/) Powered by Discuz! X3.2