⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 2401tx_avr.c

📁 AVR-mega16基础上的nRF2401接受和发送程序
💻 C
字号:
#include <iom16.h>
#include <comp_a90.h>
#include  "float.h"
#include  "stdio.h"
#include  "stdlib.h"
#include  "string.h"
#include "intrinsics.h"
#define UCHAR unsigned char
#define UINT unsigned int
void  ByteWrite(UCHAR send);
#define PWR_UP         0x01
#define OUTPUT_PWR_UP  DDRB|=PWR_UP
#define PWR_UP_1       PORTB|=PWR_UP
#define PWR_UP_0       PORTB&=~PWR_UP

#define CE           0x02
#define OUTPUT_CE    DDRB|=CE
#define CE_1         PORTB|=CE
#define CE_0         PORTB&=~CE

#define CS           0x20
#define OUTPUT_CS    DDRB|=CS
#define CS_1         PORTB|=CS
#define CS_0         PORTB&=~CS

#define DR1          0X40
#define OUTPUT_DR1   DDRB|=DR1
#define DR1_1        PORTB|=DR1
#define DR1_0        PORTB&=~DR1

#define CLK1         0X80
#define OUTPUT_CLK1  DDRB|=CLK1
#define CLK1_1       PORTB|=CLK1
#define CLK1_0       PORTB&=~CLK1

#define DATA         0X04
#define OUTPUT_DATA  DDRD|=DATA
#define DATA_1       PORTD|=DATA
#define DATA_0       PORTD&=~DATA

#define INPUT_DATA   DDRD&=~DATA

#define INPUT_DR1    DDRB&=~(0x40)

#define ADDR_W       0x20
#define DATA1_W      0x50

UCHAR InitData[15];
UCHAR TxAddress[4]={0xcc,0xcc,0xcc,0xcc};
UCHAR TxBuf[10]={0xfe,0xfb,0xef,0xff,0xff,0xff,0xff,0xff,0x00,0xbf};
UCHAR RxBuf[10];

UINT count=0;
UCHAR RX_Data[10];
int i=0;
/********************端口初始化****************/
void init_io(void)
{
DDRA=0xff;
PORTA=0xff;
OUTPUT_PWR_UP;
OUTPUT_CE;
OUTPUT_CS;
OUTPUT_CLK1;
OUTPUT_DATA;
INPUT_DR1;
PORTB&=~(0x40);
}

/****************BuildSPIWord*********************/
void buildinit_word(void)
{
  InitData[0]=0x00;//RX receiver 2,Datalength 80bit
  InitData[1]=0x50;//RX receiver 1,Datalength 80bit
  InitData[2]=0x00;
  InitData[3]=0xcc;
  InitData[4]=0xcc;
  InitData[5]=0xcc;
  InitData[6]=0xcc;
  InitData[7]=0x00;
  InitData[8]=0xcc;//RX receive 1 address High byte
  InitData[9]=0xcc;//RX receive 1 address High byte
  InitData[10]=0xcc;//RX receive 1 address Low byte
  InitData[11]=0xcc;//RX receive 1 address Low byte

  InitData[12]=0x83;//this is for 32 bit address(Bit7-Bit2), 16bit CRC(Bit1), CRC enable(Bit0)

  InitData[13]=0x6f;//One receiver(Bit7), shock Mode(Bit6), Datarate(Biit5) 250K, crystal(Bit4-Bit2),RF_Power(Bit1-Bit0)

  InitData[14]=0x05;//Channel Number(Bit7-Bit1), RX/TX mode(Bit0)
}
/************delay*****************/
void  delay(UINT x)
{
  UCHAR  j;
  while((x--)!=0)
   {
    for(j=0;j<125;j++)
    ;
   }
}
void delay_1us(void)
{
  asm("nop");
}
/******************配置操作****************/
void Config2401(void)
{
   PWR_UP_1; //上电
   CS_0;
   CE_0;
   CLK1_0;
   delay(20);
   CS_1;

   int i;
   for(i=0;i<15;i++)
      {
          ByteWrite(InitData[i]);
      }
   delay(6);//延时600us
   CS_0; 
   DATA_0;
}
/////////////////////////////////
void  ByteWrite(UCHAR send)
{
   UCHAR i;
   for (i=0;i<8;i++)
     {
        if (send&0x80)
           {   
               DATA_1;
           }
        else
           {  
               DATA_0;
           }
        asm("nop");
        CLK1_1;
        send=send<<1;
        CLK1_0;
     }
}
/***********设置RF2401 为发送模式**********/
void SetTxMode(void)
{
      CS_1;
      delay_1us();
      delay_1us();
      delay_1us();
      delay_1us();
      delay_1us();
      DATA_0;
      asm("nop");
      CLK1_1;
      asm("nop");
      CLK1_0;
      delay(6);//延时600us
      CS_0;
      CE_1;
      delay_1us();
}
/******nRF2401数据发送函数****/
void RF2401_TxPacket(void)
{
     int i;
     for(i=0;i<(ADDR_W/8);i++)  //写入接收地址(按字节对齐)
         {
             ByteWrite(TxAddress[i]);
         }
     for(i=0;i<(DATA1_W/8);i++) //写入需要发送的数据(按字节对齐)
         {
             ByteWrite(TxBuf[i]);
         }
     CE_0; //CE置低使发送有效
     DATA_0;
     delay(1); 
     delay(1); 
}
/*******设置RF2401 为接收模式********/
void SetRxMode(void)
{
      CS_1;
      delay_1us();
      delay_1us();
      delay_1us();
      delay_1us();
      delay_1us();
      DATA_1;
      asm("nop");
      CLK1_1;
      asm("nop");
      CLK1_0;
      delay(6);//延时600us
      CS_0;
      CE_1;
      delay(1);
}
///////////////////////////
UCHAR ByteRead(void)
{
 UCHAR i;
 UCHAR DATA_BUF;
for(i=0;i<8;i++)
{
   DATA_BUF=DATA_BUF<<1;
   if (PIND&0x04) //读取最高位,保存至最末尾,通过左移位完成整个字节
     {
        DATA_BUF|=0x01;
     }
   else
     {
        DATA_BUF&=~(0x01);
     }
   CLK1_0;
   CLK1_1;
}
   return DATA_BUF;
}
/******nRF2401数据接收函数****/
unsigned char nRF2401_RxPacket(void)
{
  UINT i;
  if(PINB&0x40)
    {
        CLK1_1;
        INPUT_DATA; 
        DATA_0;//PORTD&=~(0x04);
        for (i=0;i<DATA1_W/8;i++)
            {
                RxBuf[i]=ByteRead();
            }
        CLK1_0;
        OUTPUT_DATA;
        DATA_0;
        return 1;
    }
  return 0;
}



/*************************主函数***************************************/
void main(void)
{


    init_io();
    buildinit_word();//生成配置内容
    Config2401(); // 必须执行的配置操作
    SetTxMode(); // 设置为发送模式
    RF2401_TxPacket(); // 发送测试数据


    PORTA&=~(0x10);

    delay(10000); // 延时使LED灯点亮
    PORTA|=0x10;


  //  SetRxMode(); // 设置RF2401 为接收模式
while(1)
{
}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -