📄 2401tx_avr.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 + -