STC12C5A60S2控制NRF905做发射ATMEGA16A控制NRF905做接收程序调不了

2019-07-15 19:58发布

请各位大神帮忙看下,这个两个发送,接收程序那里出错了

STC12C5A60S2单片机发射程序
/*******************************************************************************************/
#include "hmi_driver.h"
#include "hmi_user_uart.h"
#include "cmd_process.h"
#include "stdio.h"
#include "DefineID.c"
#include "main.h"
#include "ulitity.h"
#include "string.h"
#include "nRF905.h"
#include "intrins.h"
#define WC  0x00  
#define RC  0x10   
#define WTP  0x20   
#define RTP  0x21  
#define WTA  0x22  
#define RTA  0x23  
#define RRP  0x24   
/*******************************************************************************************/
uchar  senddata1[4]={0};
typedef struct RFConfig
{
uchar n;
uchar buf[10];
}RFConfig;
code RFConfig RxTxConf =
{
  0x00,//配置命令   
  0x4c,//CH_NO,配置频段在430MHZ   
  0x0c,//输出功率为10db,不重发,节电为正常模式
  0x44,//地址宽度设置,为4字节
  0x04, 0x04,  //接收发送有效数据长度为4字节
  0xcc, 0xcc, 0xcc,0xc,  //接收地址
  0x58 //CRC充许,8位CRC校验,外部时钟信号不使能,16M晶振
};

code Tx_add[]={0x12,0x34,0x56,0x78};
uchar bdata DATA_BUF;
sbit flag =DATA_BUF^7;
sbit flag1 =DATA_BUF^0;
/*******************************************************************************************/
sbit TX_EN =P0^0;
sbit TRX_CE =P0^1;
sbit PWR_UP =P0^2;
sbit MISO =P0^3;
sbit MOSI =P0^4;
sbit SCK  =P0^5;
sbit CSN  =P0^6;
sbit AM  =P2^1;
sbit DR  =P2^2;
sbit CD  =P2^0;

/*******************************************************************************************/
void Config905(void);  

void SpiWrite(uchar);  
uchar SpiRead(void);  

/*******************************************************************************************/

void delay700us(void)   
{
    unsigned char a,b;
    for(b=600;b>0;b--)
        for(a=9;a>0;a--);
    _nop_();  
}
void delay100us(void)
{
    unsigned char a,b;
    for(b=78;b>0;b--)
        for(a=2;a>0;a--);
    _nop_();  
}
void nRF_init()
{
  
CSN=1;         
SCK=0;      
DR=1;     
AM=1;     
PWR_UP=1;     
TRX_CE=0;   
TX_EN=0;   
//================
Config905();   
SetTxMode();   


}
void Config905(void)
{
uchar i;     
CSN=0;     
SpiWrite(WC);   
for (i=0;i<RxTxConf.n;i++)
{
  SpiWrite(RxTxConf.buf[i]);
}
CSN=1;      
}
void SpiWrite(uchar  byte)
{
uchar i;
DATA_BUF=byte;      
for (i=0;i<8;i++)   
{
  
  if (flag)   
   MOSI=1;
  else
   MOSI=0;
  SCK=1;   
  DATA_BUF=DATA_BUF<<1;
  SCK=0;   
}
}
uchar SpiRead(void)
{
uchar i;
for (i=0;i<8;i++)  
{
  DATA_BUF=DATA_BUF<<1;
  SCK=1;     
  if (MISO)
   flag1=1;   
  else
   flag1=0;
      
  
  SCK=0;   
}
return DATA_BUF;   
}
void TxPacket(uchar TxBuf[],uchar n)
{
uchar i;
   
CSN=0;      
SpiWrite(WTP);   
for (i=0;i<n;i++)
{
  SpiWrite(TxBuf[i]);  
}
CSN=1;         
delay100us();
CSN=0;      
SpiWrite(WTA);   
for (i=0;i<4;i++)  
{
  SpiWrite(Tx_add[i]);
}
CSN=1;     
TRX_CE=1;   
   delay100us();
TRX_CE=0;   
}
void RxPacket(uchar RxBuf[],uchar n)
{
uchar i;
TRX_CE=0;     
CSN=0;     
SpiWrite(RRP);   
for (i=0;i<n;i++)
{
  RxBuf[i]=SpiRead();   
}
CSN=1;     
while(DR||AM);
TRX_CE=1;

        
}
void SetTxMode(void)   
{
TX_EN=0;
TRX_CE=1;
delay700us();     
}   
void SetRxMode(void)
{
TX_EN=0;
TRX_CE=1;
delay700us();        
}
void main(void)
{
senddata1[0]=0x1f;
senddata1[1]=0xff;
senddata1[2]=0xff;
senddata1[3]=0xff;
nRF_init();
SetTxMode();
while(1)
{
  TxPacket(senddata1,4);
  delay_ms(3600);
}
}


ATmega16接收程序
#include "nRF905.h"
//         1    2 3  4   5    6    7    8    9    10   11   12   13   14   15                    
//uchar CodeEditor[]={0x1e,0x1d,0x1c,0x1b,0x1a,0x19,0x18,0x17,0x16,0x15,0x14,0x13,0x12,0x11,0x10};
#define SET_1(a,b) a|=(1<<b)
#define CLE_0(a,b) a&=~(1<<b)
//端口初始化

//---------------------------------模式控制定义---------------------------------   
//#define  nrf905_TX_EN   PB2       //输出1   
#define   Hign_nrf905_TX_EN    PORTB |= (1 < PB2);      
#define   Low_nrf905_TX_EN     PORTB &= ~(1 < PB2);   
//#define  nrf905_TRX_CE  PB3       //输出1   
#define   Hign_nrf905_TRX_CE    PORTB |= (1 < PB3);      
#define   Low_nrf905_TRX_CE     PORTB &= ~(1 < PB3);   
//#define  nrf905_PWR     PB1       //输出1   
//#define   Hign_nrf905_PWR    PORTB |= (1 < PB1);      
//#define   Low_nrf905_PWR     PORTB &= ~(1 < PB1);   
//--------------------------------NRF905-SPI口接口定义--------------------------   
//#define  nrf905_MISO    PB6       //输入0
#define   nrf905_MISO    PORTB |= (1 < PB4);      
#define   nrf905_MISO     PORTB &= ~(1 < PB4);   
#define   Read_nrf905_MISO    PINB & (1 < PB4);  
//#define  nrf905_MOSI    PB5       //输出1   
#define   Hign_nrf905_MOSI    PORTB |= (1 < PB5);      
#define   Low_nrf905_MOSI     PORTB &= ~(1 < PB5);
//#define  nrf905_SCK     PB7       //输出1   
#define   Low_nrf905_SCK     PORTB &= ~(1 < PB7);   
//#define  nrf905_CSN     PB4       //输出1         
#define   Hign_nrf905_CSN    PORTB |= (1 < PB4);      
#define   Low_nrf905_CSN     PORTB &= ~(1 < PB4);                           
//-------------------------------NRF905状态输出口-------------------------------   
//#define  nrf905_CD      PD4       //输入0   
//#define   Hign_nrf905_CD    PORTD |= (1 < PD4);      
//#define   Low_nrf905_CD     PORTD &= ~(1 < PD4);   
//#define   Read_nrf905_CD    PINB & (1 < PD4);   
//#define  nrf905_AM      PB3       //输入0   
//#define   Hign_nrf905_AM    PORTB |= (1 < PB3);      
//#define   Low_nrf905_AM     PORTB &= ~(1 < PB3);   
//#define   Read_nrf905_AM    PINB & (1 < PB3);   
//#define  nrf905_DR      PC7       //输入0   
#define   Hign_nrf905_DR     PORTC |= (1 < PC7);      
#define   Low_nrf905_DR     PORTC &= ~(1 < PC7);   
#define   Read_nrf905_DR    PINC & (1 < PC7);      
//----------------------------------NRF905-SPI指令------------------------------   
#define WC  0x00   
#define RRC 0x10   
#define WTP 0x20   
#define RTP 0x21   
#define WTA 0x22   
#define RTA 0x23   
#define RRP 0x24
//uchar  DATA_BUF;  
//---------------------------------发送数据-------------------------------------   
uchar TxRxBuffer[32];   
//----------------------------------接收地址------------------------------------   
uchar TxAddress[4]={0xcc,0xcc,0xcc,0xcc };      
//----------------------------------寄存器配置----------------------------------   
uchar RFConf[11]=   
{   
  0x00,                            //配置命令//   
  0x4c,                           //CH_NO,配置频段在430MHZ   
  0x0C,                          //输出功率为10db,不重发,节电为正常模式   
  0x44,                         //地址宽度设置,为4字节   
  0x04,0x04,                   //接收发送有效数据长度为32字节   
  0xCC,0xCC,0xCC,0xCC,        //接收地址   
  0x58,                      //CRC充许,8位CRC校验,外部时钟信号不使能,16M晶振   
};   
//----------------------------------NRF905函数申明------------------------------   
void Delay(uint x);                            //延时子程序                                                                                             
void Spi_initial();                            //SPI初始化   
uchar SpiReadSpiWrite(unsigned char cData);    //SPI读写子程序   
void nRF_init(void);                        //nRF_init初始化   
void Config905(void);                          //NRF905初始化子程序   
void TxPacket(void);                           
void SetTxMode(void);                          //数据发送   
void SetRxMode(void);                          //   
void TX(void);   
unsigned char CheckDR(void);   
void RxPacket(void);   
void  RX(void);   
//-------------------------------串口函数申明-----------------------------------   
void StartUART(void);   
void R_S_Byte(uchar R_Byte);   
//----------------------------------100us延时子程序-----------------------------   
void Delay(uint x)   
{   
    uint i;   
    while(x--)   
    for(i=0;i<80;i++);   
}   
//----------------------------------SPI初始化-----------------------------------   
void Spi_initial()   
{   
    SPCR   = (1<<SPE)|(1<<MSTR)|(0<<CPOL)|(0<<SPR0);// 主机模式,fck/16, SPI方式0

//* 设置MOSI 和SCK 为输出,其他为输入 */
//DDRB = (1<<PB5)|(1<<PB7);
/* 使能SPI 主机模式,设置时钟速率为fck/16 */
//SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0);  
}   
//---------------------------------SPI读写程序----------------------------------      
uchar SpiReadSpiWrite(unsigned char cData)   
{   
    //SPDR = cData;   
    while(!(SPSR & (1<<SPIF) ));  // 等待SPI发送完毕   
    //{};            
    return SPDR;   
}   
//--------------------------------nRF_init状态初始化--------------------------------   
void nRF_init(void)            
{   
   
    Hign_nrf905_CSN;            // SPI使能   
    Low_nrf905_SCK;               
    Low_nrf905_DR;              // DR=0   
    //Low_nrf905_AM;              // AM=0   
    //Low_nrf905_CD;              // CD=0   
    //Hign_nrf905_PWR;            // PWR=1   
    Low_nrf905_TRX_CE;          // nrf905_TRX_CE=0   
    Low_nrf905_TX_EN ;          // nrf905_TX_EN=0   
}   
//--------------------------------NRF905寄存器初始化函数------------------------   
void Config905(void)   
{   
    uchar i;   
    Low_nrf905_CSN;             //SPI使能                                            
    Delay(1);                     
    for (i=0;i<11;i++)           //碞RF905配置字   
    {   
     SpiReadSpiWrite(RFConf[i]);   
    }   
    Hign_nrf905_CSN;                    // Disable Spi   
}   
//--------------------------------NRF905待发数据打包----------------------------   
void TxPacket()   
{   
    uchar i;   
    Low_nrf905_CSN;                     // 使能Spi,允许对nrf905进行读写操作   
    Delay(1);   
    SpiReadSpiWrite(WTP);               // 写数据前先写写数据命令   
    for (i=0;i<32;i++)   
    {   
     SpiReadSpiWrite(TxRxBuffer[i]);     // 待发送的32字节数据   
    }                          
    Hign_nrf905_CSN;   
    Delay(1);                           // 关闭Spi,不允许对nrf905进行读写操作   
    Low_nrf905_CSN;                     // 使能Spi   
    SpiReadSpiWrite(WTA);               // 写地址前首先先写地址命令   
    for (i=0;i<4;i++)                   //写入4 bytes 接收地址   
    {   
    SpiReadSpiWrite(TxAddress[i]);   
    }   
    Hign_nrf905_CSN;                    // 关闭Spi   
    Hign_nrf905_TRX_CE;                 // Set TRX_CE high,start Tx data transmission   
    Delay(1);                           // 等待DR变高   
    Low_nrf905_TRX_CE;                  // 设置TRX_CE=0   
}   
//------------------------------设置发送模式------------------------------------   
void SetTxMode(void)   
{   
    Low_nrf905_TRX_CE;              //   
    Hign_nrf905_TX_EN;             //发送使能   
    Delay(70);               // delay for mode change(>=650us)   
}   
//------------------------------设置接收模式激发--------------------------------   
void SetRxMode(void)   
{   
    Low_nrf905_TX_EN;   
    Hign_nrf905_TRX_CE;   
    Delay(70);                  // delay for mode change(>=650us)   
}   
//------------------------------发送数据----------------------------------------   
void TX(void)   
{   
     SetTxMode();      // Set nRF905 in Tx mode   
     TxPacket();               // Send data by nRF905   
}   
//-----------------------------判断是否收到数据---------------------------------   
unsigned char CheckDR(void)     //检查是否有新数据传入   
{   
    if (PINC & (1 < PC7))  
    {   
        return 1;               //收到数据   
    }   
    else   
    {   
        return 0;   
    }   
}   
//-----------------------------------读接收数据包-------------------------------   
void RxPacket()                         //读数据   
{   
    uchar i;   
    Low_nrf905_TRX_CE;   
    Low_nrf905_CSN;                         // 使能SPI   
    Delay(1);   
    SpiReadSpiWrite(RRP);                  // 写入数据接收缓冲区数据命令   
    for (i = 0 ;i<4;i++)   
    {      
      TxRxBuffer[i]=SpiReadSpiWrite(0);     // 读取数据接收缓冲区数据         
    }   
    Hign_nrf905_CSN;   
    Delay(2);                            //   
    Hign_nrf905_TRX_CE;                           
}   
//--------------------------------设置接收模式----------------------------------   
void  RX(void)   
{   
    SetRxMode();                      //设置NRF905接收模式   
    while (CheckDR()==0);            //等待接收完成   
    RxPacket();                     //读取接收数据缓冲区   
    Delay(70);   
}   

   
  
//-------------------------------串口初始化-------------------------------------   
void StartUART(void)   
{   
     UCSRA=0x00;      
     UCSRB=0x18;      
     UCSRC=0x06;      
     UBRRL=0x33;   
     UBRRH=0x00;   
     UCSRA=UCSRA|0x08;     
}   
//------------------------------串口发送----------------------------------------   
void R_S_Byte(uchar R_Byte)   
{      
  UDR= R_Byte;     
}
//端口初始化
void port_init(void)
{
PORTA = 0x00;
DDRA  = 0xFF;//PA全部位设置为输出
PORTB = 0x00;
DDRB  = 0xFF;//PB全部位设置为输出
PORTC = 0xff;
DDRC  = 0x00;//PC全部位设置为输入
PORTD = 0x00;
DDRD  = 0xFC;
}
main ()
{
  port_init();
  Spi_initial();                            //SPI初始化   
  nRF_init();                        //nRF_init初始化   
  Config905();
  while(1)
  {
    uchar K1;
K1=((PINC&0x7c)>>2);
//uchar i;
//K1=0x04;
//TxRxBuffer[0]=0X1f;
RX();
if(1)
   {
      //TxRxBuffer[1]=0Xff;
   //TxRxBuffer[2]=0Xff;
   if(TxRxBuffer[1]&0x01) SET_1(PORTA,7);
   else  CLE_0(PORTA,7);
   if(TxRxBuffer[1]&0x02) SET_1(PORTA,6);
   else  CLE_0(PORTA,6);
   if(TxRxBuffer[1]&0x04) SET_1(PORTA,5);
   else  CLE_0(PORTA,5);
   if(TxRxBuffer[1]&0x08) SET_1(PORTA,4);
   else  CLE_0(PORTA,4);
   if(TxRxBuffer[1]&0x10) SET_1(PORTA,3);
   else  CLE_0(PORTA,3);
   if(TxRxBuffer[1]&0x20) SET_1(PORTA,2);
   else  CLE_0(PORTA,2);
   if(TxRxBuffer[1]&0x40) SET_1(PORTA,1);
   else  CLE_0(PORTA,1);
   if(TxRxBuffer[1]&0x80) SET_1(PORTA,0);
   else  CLE_0(PORTA,0);
   
   if(TxRxBuffer[2]&0x01) SET_1(PORTD,7);
   else  CLE_0(PORTD,7);
   if(TxRxBuffer[2]&0x02) SET_1(PORTD,6);
   else  CLE_0(PORTD,6);
   if(TxRxBuffer[2]&0x04) SET_1(PORTD,5);
   else  CLE_0(PORTD,5);
   if(TxRxBuffer[2]&0x08) SET_1(PORTD,4);
   else  CLE_0(PORTD,4);
   if(TxRxBuffer[2]&0x10) SET_1(PORTD,3);
   else  CLE_0(PORTD,3);
   if(TxRxBuffer[2]&0x20) SET_1(PORTD,2);
   else  CLE_0(PORTD,2);
   if(TxRxBuffer[2]&0x40) SET_1(PORTB,0);
   else  CLE_0(PORTB,0);
   if(TxRxBuffer[2]&0x80) SET_1(PORTB,1);
   else  CLE_0(PORTB,1);
}
  }                        
}  










友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
5条回答
youzizhile
2019-07-16 07:09
void SpiWrite(uchar  byte)
{
uchar i;
DATA_BUF=byte;      
for (i=0;i<8;i++)   
{
   
   if (flag)   
    MOSI=1;
   else
    MOSI=0;
   SCK=1;   
   DATA_BUF=DATA_BUF<<1;
   SCK=0;   
}

要满足spi的时序,先置sck=0,在发送
void SpiWrite(uchar  byte)
{
uchar i;
DATA_BUF=byte;      
for (i=0;i<8;i++)   
{
      SCK=0;   
   if (flag)   
    MOSI=1;
   else
    MOSI=0;
   SCK=1;   
   DATA_BUF=DATA_BUF<<1;
}
你这样试试

一周热门 更多>