📄 transmit.c
字号:
wr_index++;
if(wr_index>=2)
{if((rx_buffer[0]==0xff)&&(rx_buffer[1]==0x81)) //帧头为数据帧开始标志,固定为0FF81H
{
rx_buffer_top= 1;//帧头标志,为1,判断帧头正确
}
else { rx_buffer_top= 0;
wr_index=0;}
}
if((rx_buffer_top== 1)&&(wr_index>2))
{
if ( wr_index > BUFF_SIZE )
//当缓冲器溢出时
{
wr_index= 0 ; //缓冲器写指针=0
}
//当缓冲器未溢出时
else if ( wr_index >= rx_buffer[2]+3 ) //判断是否接收完一帧数据
//(说明:缓冲区第3字节为帧长,代表从帧标志
//开始至本帧结束的所有数据的字节数)
//当一帧数据接受完毕
{
rx_buffer_ok= 1 ; //一帧数据接收完成标志,置1为接收完成
wr_index=0;
rx_buffer_top=0;
}
}
SEI();/////////////////////////
}
else { a=UDR;} //接收完成则将UDR置给一个变量,关闭中断
}
//*****************************波特率设置函数**********************************//
void DataBaudSet(void)
{ if(DataBaud==0x01)
UBRR=416; //Band=2400
else if(DataBaud==0x02)
UBRR=207; //Band=4800
else if(DataBaud==0x03)
UBRR=103; //Band=9600
else if(DataBaud==0x04)
UBRR=68; //Band=14.4K
else if(DataBaud==0x05)
UBRR =51; //Band=19.2K
else if(DataBaud==0x06)
UBRR=34; //Band=28.8K
else if(DataBaud==0x07)
UBRR=25; //Band=38.4K
else if(DataBaud==0x08)
UBRR=16; //Band=57.6K
else if(DataBaud==0x09)
UBRR=12; //Band=76.8K
else if(DataBaud==0x0A)
UBRR=8; //Band=115.2K
//UBRR = fosc/(16*baud)-1;
//fosc=8MHz
}
void transform(unsigned char *p,unsigned char len)
{
unsigned char i,j=5;
for(i=len;i>j; i--)
p[i]^=((p[i-1]<<7)|(p[i]>>1));
p[5]^=p[5]>>1;
}
void trans2(unsigned char *p,unsigned char len)//直接方式向nfr2401a发送len个字节的数据
{
signed char i;
unsigned char len1=0;
while(len1<len)
{
PORTD^=(p[len1]&0x80)>>4; //1.5
delay_2_375us();
PORTD^=(p[len1]&0x40)>>3; // 1.625
delay_2_5us();
PORTD^=(p[len1]&0x20)>>2; //1.5
delay_2_5us();
NOP();
PORTD^=(p[len1]&0x10)>>1; //1.375
delay_2_5us();
NOP();
NOP();
PORTD^=(p[len1]&0x08); //1.25
delay_2_5us();
NOP();
PORTD^=(p[len1]&0x04)<<1;
delay_2_5us();
PORTD^=(p[len1]&0x02)<<2;
delay_2_375us();
PORTD^=(p[len1]&0x01)<<3;
delay_1_875us(); /**/
len1++;
}
NOP();
delay_1us();
clr_data();
}
void transmit()
{
clr_data();
transform(pw_data,data_cnt);
DDRD=0XF8;
set_ce();
delay_us(189);
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
trans2(pw_data,data_cnt);
clr_ce();
}
//-----------------------------------------------------------------------------
//********************************串口初始化函数*****************************//
//-----------------------------------------------------------------------------
void UART_init(void)
{
UCSRB = BIT(RXCIE)| BIT(RXEN) |BIT(TXEN); //允许串口发送和接收,
//并响应接收完成中断
UCSRA = BIT(U2X);//双倍速
//设置串口波特率
DataBaudSet(); //初始化设置成38.4k
UCSRC = BIT(URSEL)|BIT(UCSZ1)|BIT(UCSZ0); //8位数据位+1位stop位
}
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%UART串口模块END%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%//
//**************************I/O口初始化**************************************//
void init_IO(void)
{
PORTA = 0x00;
DDRA = 0x0f;
PORTB = 0x00;
DDRB = 0x02;
PORTC = 0x00;
DDRC = 0x00;
PORTD = 0x00;
DDRD = 0xfa;
}
//****************************** Watchdog定时器初始化***********************//
void watchdog_init(void)
{
WDR(); //防止设置时WATCHDOG超时
WDTCR=0x0f; //使能WATCHDOG,采用1MHz的2048分频
}
//********************************主函数*************************************//
//1、MCU完成接收PC机数据(USART中断接收),将接收到的数据发送给nRF2401a
// nRF2401a将从MCU接收到的数据发送出去
void main(void)
{
unsigned char FrameMark;
unsigned char FrameLength;
CLI(); //关中断
init_IO(); //IO口初始化
UART_init(); //初始化UART
set_pwr_up();
delay_us(3000);//延时3m
init_conf();//初始化NRF2401a配置寄存器
SEI(); //开中断
//transmit();
while(1) //完成MCU接收PC机数据(USART),MCU发送数据至nRF2401a,nRF2401a
//将接收至MCU的数据发送出去
{
buf_cnt=0;
if (rx_buffer_ok==1) //串口一帧数据接收完成
{
unsigned char i;
FrameMark=rx_buffer[3];
FrameLength=rx_buffer[2];
if(FrameMark==0x02) //帧标志为0x02,设置发送的数据,并且发送
{
unsigned char cnt=6;
/*for(i=0;i<cnt;i++)
{
pw_data[i+5]=rx_buffer[i+4] ;//更改NRF2401a发送的数据
}
*/
pw_data[6]=rx_buffer[4] ;
pw_data[7]=rx_buffer[5] ;
pw_data[8]=rx_buffer[6] ;
pw_data[9]=rx_buffer[7] ;
pw_data[10]=rx_buffer[8] ;
pw_data[11]=rx_buffer[9] ;
transmit();
PORTB=~PORTB;
for(i=0;i<cnt;i++)
{
tx_buffer[i]=rx_buffer[i+4];
}
putchar(rx_buffer[2],0x12); //已设置,帧标志定义值12H,返回给PC机
}
if(FrameMark==0x01) //帧标志为0x01,波特率设置(1字节)
{
DataBaud=rx_buffer[4];
tx_buffer[0]=DataBaud;
putchar(0x02,0x11); //波特率已设置,帧标志定义值12H,返回给PC机
delay(10);
DataBaudSet(); //完成波特率设置
}
if(FrameMark==0x03) //帧标志为0x03,读配置寄存器中的配置
{
for(i=0;i<15;i++)
{
tx_buffer[i]=RFConf[i];
}
putchar(0x10,0x13); //已设置,帧标志定义值13H,返回给PC机
}
if(FrameMark==0x04) //帧标志为0x04,写配置寄存器中的配置
{
for(i=0;i<15;i++)
{
RFConf[i]=rx_buffer[i+4];
tx_buffer[i]=rx_buffer[i+4];
}
putchar(0x10,0x14); //已设置,帧标志定义值14H,返回给PC机
init_conf();
}
if(FrameMark==0x05) //帧标志为0x05,发送
{
tx_buffer[0]=rx_buffer[3];
putchar(0x01,0x15); //已设置,帧标志定义值15H,返回给PC机
transmit();
PORTB=~PORTB;
}
if(FrameMark==0x06) //帧标志为0x06,接收数据
{
PORTD&=0xf3;
DDRD&=(~BIT(DATA))&(~BIT(DR1));
set_ce();
putchar(0x01,0x16);//已设置,帧标志定义值16H,返回给PC机
clr_clk1();
}
if(FrameMark==0x07) //帧标志为0x07,停止接收
{
clr_ce();
putchar(0x01,0x17);//已设置,帧标志定义值17H,返回给PC机
}
rx_buffer_ok=0;
wr_index=0;
}
while(chk_dr1())
{
tx_buffer[buf_cnt]=rec_char();
buf_cnt++;
}
if(buf_cnt!=0)
{
PORTB=~PORTB;
putchar(buf_cnt+1,0xff);
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -