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

📄 sendreceive26good.c

📁 cc2210无线传输
💻 C
字号:
#include <c8051F330.h>
#include <Intrins.h>
sbit LED_send  = P1^2;
sbit CE2 = P1^3;
sbit CS2 = P1^4;
sbit CLK2 = P1^5;
sbit DATA2 = P1^6;
sbit LED = P1^7;

sbit DR=P0^0; 

bdata unsigned char temp;			//可位寻址的变量temp
sbit bflag = temp^7;

char idata InitWord[15];			//初始化配置字
char idata Txword[6];				//发送的数据包


unsigned int i=0;
unsigned int j=3;  
char new_comm = 0;					//通讯完成标志

char rxword[3];           //接收端         
unsigned char comrx=0;
char j_re=1;
char y,flag;
unsigned char m,n;
void Reset_Sources_Init();
void SYSCLK_Init();
void Interrupt_Init();
void Init_IO(void);
void Build_InitWord(void);
void Init_Config(void);
void Init_Send(void);				//初始化发射模块
void init_recieve(void);
void Init_Tim1(void);				//初始化定时器1,做波特率发生器	
void ClockS(void);					//产生发射时钟脉冲
void delay1(unsigned int x);					//软件延时
void delay600ns(void);

void Send(void);//发送数据包

void watchdog_Init(void);
void UART_Init (void);				//配置串口通讯

void main()
{
   //int ii;
	EA=0;
	PCA0MD&=~0x40;					//	Disable Watchdog timer
	PCA0CN=0x40;
	Reset_Sources_Init();
	SYSCLK_Init();
	Init_IO();
	Interrupt_Init ();				//中断配置
	UART_Init ();
	Init_Tim1();
    watchdog_Init();
	Build_InitWord();				//构造初始化配置字
	Init_Config();
	init_recieve();   //配置接收模块       
	delay1(4998);					//delay 3.125ms,Tpd2sby,min 3 ms
	Txword[0]=0xcc;
	Txword[1]=0xcc;
	Txword[2]=0xcc;
	Txword[3]=0;
	Txword[4]=0;
	Txword[5]=0;
	i = 0;
	EA = 1;							//上位机通讯程序robotest接口测试
	while(1)
	{      
	    PCA0CPH2=0x20;
		if(new_comm==1)
		{  
		    Init_Send();					//配置发送模块
           delay1(4998);					//delay 3.125ms,Tpd2sby,min 3 ms
			Send();
			new_comm=0;
			LED_send = ~LED_send;
            init_recieve();
			delay1(4998);
		}
		if(comrx==1)
          { 
		    comrx=0; 
		    LED = ~LED;
		    }
        
	}		
}

void Reset_Sources_Init()
{
    int i_reset = 0;
    VDM0CN    = 0x80;
    for (i_reset = 0; i_reset < 350; i_reset++);  // Wait 100us for initialization
    RSTSRC    = 0x02;    // Enable VDD monitor as a Reset Source
}
void SYSCLK_Init ()
{	
  OSCICN = 0x83;                      // start external oscillator with

 }

void Init_IO()
{
	XBR0=0x01;   // TX,RX分配到P0.0,P0.1
	XBR1=0x40;   //禁止弱上拉,允许交叉开关
	P0MDIN=0xFC;
	P0MDOUT=0x10;
	P0SKIP = 0x03;
    P1MDIN=0xFF;
	P1MDOUT=0xBF;
    //P1MDOUT=0xFF;	
	P2MDOUT=0xFF;
    CPT0MX=0x00;     //P0.0=CP0+  P0.1=CP0-
    CPT0MD=0x20;     //23;     //上升沿允许
	CPT0CN=0x80;
    for(y=0;y<10;y++);
	CPT0CN&=~0x30;				
}
void Build_InitWord()
{

	InitWord[0] = 0x18;
	InitWord[1] = 0x18;					//通道1数据长度8字节
	InitWord[2] = 0x00;
	InitWord[3] = 0x00;
	InitWord[4] = 0xcc;
	InitWord[5] = 0xcc;
	InitWord[6] = 0xcc;
	InitWord[7] = 0x00;						//通道2地址
	InitWord[8] = 0x00;						
	InitWord[9] = 0xcc;						
	InitWord[10] = 0xcc;				
	InitWord[11] = 0xcc;					//通道1地址
	InitWord[12] = 0x63;					//8位地址(位7-2),8位CRC校验(位1),使能CRC(位0)
	InitWord[13] = 0x6f;					//one recieve(Bit7,0),Shock Mode(Bit6,1),Data rate(Bit 5)1M,Crystall(Bit4-2,011),RFPower(Bit1-0)
	InitWord[14] = 0x05;					//channal select(Bit7-1)2450M,RX/TX mode(Bit0,1 reciever mode)	
}

void ClockS()
{
	CLK2 = 1;
	delay600ns();								//延时580ns,Th min 500ns
	CLK2 = 0;	
}

void Init_Config()
{
	char Bytesend,Bitsend;
	/**********配置接收模块*************/
	CE2 = 0;
	delay600ns();					//延时580ns,Td min 50ns
	CS2 = 1;						//配置模式,CS=1,CE=0
	CLK2 = 0;
	delay1(7);						//延时5458ns,Tcs2data min 5us
	for(Bytesend=0;Bytesend<15;Bytesend++)		//前三个测试字节可以不发!!!
	{
		temp=InitWord[Bytesend];
		for(Bitsend=0;Bitsend<8;Bitsend++)
		{
			DATA2 = bflag;
			delay600ns();			//延时580ns
			ClockS(); 
			temp = temp<<1;
		}
	}
	CS2 = 0;
	CE2 = 1;						//配置为工作模式
}



void Init_Send()
{
    InitWord[14] = 0x04;
	Init_Config();
//	P1MDOUT=0xFF;  //发送
}
void init_recieve()
{
    InitWord[14] = 0x05;
	Init_Config();
 	P1MDOUT=0xBF;   //直接影响收到数据与否
   // DATA2=1;
   //	delay1(337);	
}
void Send()
{
	char ByteTx,BitTx;
	for(ByteTx=0;ByteTx<6;ByteTx++)				//真正与小车通讯时为26(23+3)字节,与开发板通讯时为13字节(5+8)
	{
		temp = Txword[ByteTx];
		for(BitTx=0;BitTx<8;BitTx++)
		{
			DATA2=bflag;
			TR0=1;
			delay600ns();			//延时580ns
			ClockS();				//
			temp=temp<<1;
		}
	}
    j=3;
	CE2 = 0;						//启动数据发送
	delay1(1000);//1000
	CE2 = 1;						//置为工作态,为下次发送准备
	delay600ns();					//延时580ns,Td		
}
void delay1(unsigned int x)			//x=1,41个时钟周期,1.7us;x=2,56个周期,2.3us(15个周期0.6us)
{									//该函数延时最长即x=65535为40ms
	unsigned int i;
	for(i=0;i<x;i++);
}
void delay600ns()					//延时580ns,14个时钟周期
{
	_nop_();
	_nop_();
	_nop_();
}

void Interrupt_Init (void)
{
	
//	IP = 0x10;   // Interrupt Priority
	IE = 0x90;   // Interrupt Enable
	EIE1=0x20;
	EIP1=0x20;
	IP=0x00;   // Interrupt Priority
}
void serve_cp0() interrupt 12	//上升沿中断,CMR通讯来临!
{
	char p,q;
	char Rx_Cou;
   	CPT0CN&=~0x30;		//clear interrupt pending flags
   	EA=0;
//	delay1(168);
	delay1(84);						//51us,Td(min 50 ns)+Tdr2clk(min 50 us)
	for(p=0;p<3;p++)
	{
		temp=0;
		for(q=0;q<8;q++)
		{
 			temp=temp<<1;
			CLK2=1;
			delay600ns();
			temp|=DATA2;
			CLK2=0;
			delay600ns();
		}
		rxword[p]=temp;
	}
     
	 for(Rx_Cou=0;Rx_Cou<3;Rx_Cou++)
    {
	 SBUF0=rxword[Rx_Cou];
	 while(TI0==0);
	 TI0=0;
	 }
    
	EA=1;	
    flag=1;
	comrx=1;

}
void comm(void)	interrupt 4
{
	if(RI0==1)
   {
     RI0=0;
     if(j<6) 
	   Txword[j++]=SBUF0;
   }   
    if(j==6) 
	new_comm=1;
}

void UART_Init (void)
{
	SCON0 = 0x70;    // Serial Port Control Register(01110000b),方式1,8位可变波特率
}

void Init_Tim1(void)
{
	TCON = 0x40;
	TMOD = 0x20;
    CKCON=0x02;//2400
//	CKCON=0x08;//115200
	TL1=0x96;
	TH1 = 0x96;
}	

void watchdog_Init(void)
 { 
   PCA0CN=0x40;    //允许PCA计数器功能
   PCA0MD=0x40;    //允许看门狗定时器,并设系统时钟为计数时钟
   PCA0CPL2=0xff;   //设定复位时间为32ms
   PCA0CPH2=0x00;
}

⌨️ 快捷键说明

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