📄 transmit.c
字号:
// 突发模式 30位地址 16CRC 发送6个字节的数据 地址前20为ac 交替出现******************************
//*************************ICCAVR6.31A编译**************************************
//******************************************************************************
#include <iom16v.h>
#include <macros.h>
#define SETBIT(x,y) (x|=(1<<y)) //set bit y in byte x
#define CLRBIT(x,y) (x&=(~(1<<y))) //clear bit y in byte x
#define CHKBIT(x,y) ((x&(1<<y))>>y) //check bit y in byte x
#define PWR_UP PD7
#define CE PD6
#define CS PD5
#define CLK1 PD4
#define DATA PD3
#define DR1 PD2
#define set_pwr_up() SETBIT(PORTD,PWR_UP)
#define clr_pwr_up() CLRBIT(PORTD,PWR_UP)
#define set_ce() SETBIT(PORTD,CE)
#define clr_ce() CLRBIT(PORTD,CE)
#define set_cs() SETBIT(PORTD,CS)
#define clr_cs() CLRBIT(PORTD,CS)
#define set_clk1() SETBIT(PORTD,CLK1)
#define clr_clk1() CLRBIT(PORTD,CLK1)
#define set_data() SETBIT(PORTD,DATA)
#define clr_data() CLRBIT(PORTD,DATA)
#define chk_dr1() CHKBIT(PIND,DR1)
#define chk_data() CHKBIT(PIND,DATA)
//-----------------------------------------------------------------------------
//*************************全局变量定义**************************************//
//-----------------------------------------------------------------------------
#define BUFF_SIZE 36
unsigned char rx_buffer[BUFF_SIZE];//设置UART接收数据缓冲区
unsigned char tx_buffer[BUFF_SIZE];//设置UART发送数据缓冲区
volatile unsigned char rd_index=0; //UART接收缓冲区读指针
volatile unsigned char wr_index=0; //UART接收缓冲区写指针
volatile unsigned char rx_buffer_ok= 0; //UART接收数据完成标志
volatile unsigned char rx_buffer_top=0; //接收数据帧头标志
volatile unsigned char rd_index0=0; //发送缓冲区读指针
volatile unsigned char wr_index0=0; //发送缓冲区写指针
volatile unsigned char tx_buffer_top=0; //发送数据帧头标志
unsigned char DataBaud=0x07; //对应波特率参数
unsigned char pw_data[32]; //nRF2401a发送的数据
unsigned char data_cnt=6; //发送数据的字节数
unsigned char buffer[32]; //接收到shockburstTM发送的数据
unsigned char buf_cnt; //buffer的指针
unsigned char adr[4]={0xfa,0xfa,0xfa,0x17}; //{0xac,0xac,0xac,0x1a} ; //接收方地址
//----------------------------------------------------------------------------
//*********************************延时子函数*********************************
//----------------------------------------------------------------------------
void delay_1ms(void) //1ms延时
{
unsigned int i;
for(i=0;i<(unsigned int)(1142);i++)//晶振为8MHz,1142=143*xtal-2 xtal为晶振
;
}
void delay(unsigned int n) //整数倍ms延时
{
unsigned int i=0;
for(i=0;i<n;i++)
delay_1ms();
}
void delay_us(unsigned int i)//8.000M晶振 延时i+2us
{
if(i==0)
return;
while(i--)
{
NOP();
NOP();
}
}
//------------------------------------------------------------------------------
//********************************RF寄存器配置**********************************
//------------------------------------------------------------------------------
unsigned char RFConf[15]=
{
0x20, //接受频道2有效数据的长度
0x50, //接受频道1有效数据的长度
0x0a,0x0b,0x0c,0x0d,0x0e, //接受频道2的地址,最高为5个字节
0xab,0xac,0x28,0x12,0x1a, //接受频道1的地址,最高为5个字节
0xa3, //接受频道地址位数(6位);8位或16位CRC校验(1位);使能CRC校验(1位)
0x47, //使能第二频道(1位) 通信方式设置(1位) 发射数据速率(1位)
// 晶振频率 3位 发射输出电源功率 2位
0x64 //频道设置 7位 接受或发射操作
};
void trans(unsigned char *p,unsigned char len,signed char ii)//发送len个字节的数据
{
signed char i;
unsigned char len1;
for(len1=0;len1<len;len1++)
{
for(i=ii;i>=0;i--)
{
if(CHKBIT(p[len1],i)!=0)
set_data();
else
clr_data();
NOP();
NOP(); // Ts 延时大于500ns
set_clk1();
NOP();
NOP(); //延时大约500ns
clr_clk1();
}
}
}
void transform(unsigned char *p,unsigned char len)
{
unsigned char i;
for(i=len;i>0; i--)
p[i]^=((p[i-1]<<7)|(p[i]>>1));
p[0]^=p[0]>>1;
}
void trans2(unsigned char *p,unsigned char len)//发送len个字节的数据
{
unsigned char len1=0;
while(len1<len)
{
PORTD^=(p[len1]&0x80)>>4;
NOP();
NOP(); // Ts 延时大于500ns
set_clk1();
NOP();
NOP(); //延时大约500ns
clr_clk1();
PORTD^=(p[len1]&0x40)>>3;
NOP();
NOP(); // Ts 延时大于500ns
set_clk1();
NOP();
NOP(); //延时大约500ns
clr_clk1();
PORTD^=(p[len1]&0x20)>>2;
NOP();
NOP(); // Ts 延时大于500ns
set_clk1();
NOP();
NOP(); //延时大约500ns
clr_clk1();
PORTD^=(p[len1]&0x10)>>1;
NOP();
NOP(); // Ts 延时大于500ns
set_clk1();
NOP();
NOP(); //延时大约500ns
clr_clk1();
PORTD^=(p[len1]&0x08);
NOP();
NOP(); // Ts 延时大于500ns
set_clk1();
NOP();
NOP(); //延时大约500ns
clr_clk1();
PORTD^=(p[len1]&0x04)<<1;
NOP();
NOP(); // Ts 延时大于500ns
set_clk1();
NOP();
NOP(); //延时大约500ns
clr_clk1();
PORTD^=(p[len1]&0x02)<<2;
NOP();
NOP(); // Ts 延时大于500ns
set_clk1();
NOP();
NOP(); //延时大约500ns
clr_clk1();
PORTD^=(p[len1]&0x01)<<3;
NOP();
NOP(); // Ts 延时大于500ns
set_clk1();
NOP();
NOP(); //延时大约500ns
clr_clk1();
len1++;
}
}
void trans3(unsigned char adr)//发送一个字节的后六位
{
PORTD^=(adr&0x20)>>2;
NOP();
NOP(); // Ts 延时大于500ns
set_clk1();
NOP();
NOP(); //延时大约500ns
clr_clk1();
PORTD^=(adr&0x10)>>1;
NOP();
NOP(); // Ts 延时大于500ns
set_clk1();
NOP();
NOP(); //延时大约500ns
clr_clk1();
PORTD^=(adr&0x08);
NOP();
NOP(); // Ts 延时大于500ns
set_clk1();
NOP();
NOP(); //延时大约500ns
clr_clk1();
PORTD^=(adr&0x04)<<1;
NOP();
NOP(); // Ts 延时大于500ns
set_clk1();
NOP();
NOP(); //延时大约500ns
clr_clk1();
PORTD^=(adr&0x02)<<2;
NOP();
NOP(); // Ts 延时大于500ns
set_clk1();
NOP();
NOP(); //延时大约500ns
clr_clk1();
PORTD^=(adr&0x01)<<3;
NOP();
NOP(); // Ts 延时大于500ns
set_clk1();
NOP();
NOP(); //延时大约500ns
clr_clk1();
}
//发送数据
void transmit()
{
DDRD=0XF8;
set_ce();
//delay_us(5);
transform(pw_data,data_cnt-1);
trans3(adr[0]);
trans2(&adr[1],1);
trans2(&adr[2],1);
trans2(&adr[3],1);
trans2(pw_data,data_cnt);
clr_ce();
}
/*void transmit()
{
DDRD=0XF8;
set_ce();
delay_us(5);
trans(&adr[0],1,5);
trans(&adr[1],1,7);
trans(&adr[2],1,7);
trans(&adr[3],1,7);
trans(pw_data,data_cnt,7);
clr_ce();
}*/
unsigned char rec_char() //shockburst方式接受一个字节的数据
{
unsigned char data=0;
signed char i=8;
while(i>=1)
{
--i;
set_clk1();
NOP();
NOP();
NOP();
NOP();
data|=(chk_data()<<i);
clr_clk1();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -