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

📄 main.c

📁 顺舟SZ05的ZIGBEE模块
💻 C
📖 第 1 页 / 共 2 页
字号:
	/* 设置FIFO,修改触发深度,需要修改相关I最值 */
   	//U0FCR  	 = 0x01;	 // 使能FIFO,并设置FIFO触发深度大小为1个字节
	//U0FCR  	 = 0x41;	 // 使能FIFO,并设置FIFO触发深度大小为4个字节
    U0FCR  	 = 0x81;	 // 使能FIFO,并设置FIFO触发深度大小为8个字节
    //U0FCR  	 = 0xc1;	 // 使能FIFO,并设置FIFO触发深度大小为14个字节

	/* 清除接收FIFO内的数据 */
	ClrRcvFIFO0();

	
	/* 初始化帧格式 */
	U0LCR    = 0x83;				//bit7=1 DLAB=1 允许设置波特率  
	Fdiv =(Fpclk/16)/UART0_BPS;		//设置波特率
	U0DLM =Fdiv/256;
	U0DLL =Fdiv%256;
	U0LCR    = 0x03;				//8位字符长度,1停止位,无校验
	
	
	  /* IRQ,FIQ分配*/
	VICIntSelect  = 0 << UART0_INT;;			// 设置串口0中断分配为IRQ中断
	
		
	/* 初始化UART VIC 中断接口 */
    VICIntEnClr  |= 1 << UART0_INT;	
    	
	VICVectPri6   = 0x05;					
	VICVectAddr6  = (uint32)IRQ_UART0;	
	
	VICIntEnable |= 1 << UART0_INT;		
	IRQEnable();						//打开IRQ中断,IRQ中断使能, .s文件中	
   
   /* 读取除数锁存器的值 */
	U0LCR   = 0x83;							// DLAB=1
	dlm     = U0DLM;
	dll     = U0DLL;
	U0LCR   = 0x03;
	
	baud    = (Fpclk / (16 * (256 * dlm + dll)));
	sprintf(str, "Hello! Uart3's Baud is %4d bps", baud);
	UART0_SendStr(str);						// 向串口发送字符串
    DISP_CHANGEROW0();
       /* 清除接收FIFO内的数据 */
	ClrRcvFIFO0();

   
   
   
    U0IER 	|= 0x03;		//使能RDA和CTI中断 和THRE中断

}

/*********************************************************************************************************
** 函数名称 :UART0_Init
** 函数功能 :令串口0完成全部初始化工作:  波特率 9600		
** 入口参数 :无
** 出口参数 :无
*********************************************************************************************************/
void UART0_set_bps(uint32 uart0_set_bps)
{
	//uint32 bak = 0;
	uint16	Fdiv	=0;
	
	while ((U0LSR & 0x40) == 0);			// 等待数据发送完毕

	U0IER 	&= 0xFC;		//禁能RDA和CTI中断 和THRE中断
	
	/* 初始化帧格式 */
	U0LCR    = 0x83;				//bit7=1 DLAB=1 允许设置波特率  
	Fdiv =(Fpclk/16)/uart0_set_bps;		//设置波特率
	U0DLM =Fdiv/256;
	U0DLL =Fdiv%256;
	U0LCR    = 0x03;				//8位字符长度,1停止位,无校验
	
	
	/* 设置FIFO,修改触发深度,需要修改相关I最值 */
   	U0FCR  	 = 0x01;	 // 使能FIFO,并设置FIFO触发深度大小为1个字节
	//U0FCR  	 = 0x41;	 // 使能FIFO,并设置FIFO触发深度大小为4个字节
    //U0FCR  	 = 0x81;	 // 使能FIFO,并设置FIFO触发深度大小为8个字节
    //U0FCR  	 = 0xc1;	 // 使能FIFO,并设置FIFO触发深度大小为14个字节
	
	/* 清除接收FIFO内的数据 */
	ClrRcvFIFO0();
	
    U0IER 	|= 0x03;		//使能RDA和CTI中断 和THRE中断

}

/*********************************************************************************************************
** 函数名称 :ZIGBEE_GPIO_INIT
** 函数功能 :以查询方式发送一字节数据
** 入口参数 :dat	要发送的数据
** 出口参数 :无
*********************************************************************************************************/

#define p011 (1<<11)
#define p211 (1<<11)
#define p212 (1<<12)
#define p213 (1<<13)


void ZIGBEE_GPIO_INIT(void)
{
 /*
 	7--CENTER--P0.11,输出,低电平有效,或加跳线帽,成为中心节点,如7、8 都为高电平或悬,
	   即为路由节点
	8--DEVICE--P2.13,输出,低电平有效,或加跳线帽,成为终端节点,如7、8 都为高电平或悬空,即为路由节点
	9--CONFIG--P2.12,输出,低电平有效,或加跳线帽,进入系统配置状态
	   右边6、7、9
    6--接用户 232 输入--串口0接收(XCDCT)
    7--接用户 232 输出--输出串口0发送(XCDCT)
	9--低电平复位、P2.11--输出,低电平有效
 */
//SCS |= 0x01;
PINSEL0 &=0xFF3FFFFF;//CENTER--P0.11,输出
PINSEL4 &=0xF03FFFFF;//DEVICE--P2.13,输出
                     //CONFIG--P2.12,输出
                     //复位  --P2.11,输出

IO0DIR |= p011;
FIO2DIR |= p211;
FIO2DIR |= p212;
FIO2DIR |= p213;

/*
//测试,调试成功
IO0SET |= p011;
FIO2SET |= p211;
FIO2SET |= p212;
FIO2SET |= p213;

IO0CLR |= p011;
FIO2CLR |= p211;
FIO2CLR |= p212;
FIO2CLR |= p213;
*/

//根据ZIGBEE配置初始化
IO0CLR |= p011;//ZB_CT
FIO2SET |= p211;//ZB_RESET
FIO2SET |= p212;//ZB_CFG
FIO2SET |= p213;//ZB_DS

}

/*********************************************************************************************************
** 函数名称 :ZIGBEE_INIT
** 函数功能 :ZIGBEE模块初始化
** 入口参数 :无
** 出口参数 :无
*********************************************************************************************************/
void ZIGBEE_INIT(void)
{
   UART0_Init();			//					
   ZIGBEE_GPIO_INIT();
}

uint8 idflag=0;                              // ID号同步标志
uint8 dataflag=0;                            // 数据同步标志
uint8 sysset_id=0;
uint8 recv_buf_valid=0;                      // 数据接收标志
uint32 recv_buf_sum=0;               // 缓冲区接收数据条数
uint32 recv_lose_sum=0;              // 缓冲区丢失数据条数
uint8    recv_ctr=0;               // 数据缓冲区指针
uint8    recv_chksum;              // 输入数据的校验字节
#define SYNC 0xaa
#define CLOCK_ADDR 0xbb
uint8 datalen=0; 				 //数据长度
uint8 syncflag=0;                            // 数据同步标志
#define BUF_SIZE 128
uint8    recv_buf[BUF_SIZE]; // 输入数据缓冲区

//函数名称:zigbee_rcv
//函数功能:接收ZIGBEE数据
//入口参数:
//出口参数:
void zigbee_rcv (void)
{
   uint8 temp;
   if(UART0_getchar(&temp) == FALSE)		//查询是否接收到一个字符	
   return;
   
   if(idflag)
		 {                    //id处理
		     idflag = 0;  			    //清除idflag
		     if((dataflag==0)&&(temp == sysset_id))
			 {	               		     		     
			      if(recv_buf_valid) 
				  {
				     recv_buf_sum++;
				     return;
				  }
			      dataflag = 1;          //开始接收数据       	  	   
                  recv_ctr = 3;	   
                  recv_chksum = SYNC+CLOCK_ADDR+sysset_id;	   
                  datalen = 8;	        //最小长度	                     					  			  	   
                  return;	  	 
             } 	 	   
         }

		 if(temp==SYNC) //0xaa
		 { 
		     syncflag=1;	                //0xaa同步标志,可能是数据
		 }
		 else if(temp==CLOCK_ADDR)  //0xbb
		 {    //0x57同步标志
             if(syncflag) idflag = 1;	// 接收到aabb,下一字节为ID			       
             syncflag = 0;             // 收到非aa字符,标志清0	                      	                		                 	          				                 				                      	                       	                        	    
         }
		 else
		 { 
		     syncflag=0;				//收到非0xaa字符,标志清0 
		 }

		 if(dataflag)
		 {  		     		     		     	
             if(recv_ctr==6)
			 {
			     datalen = temp ;	                   //真实长度
				 if((datalen>BUF_SIZE)||(datalen<8))
				 { 
				     dataflag=0;
					 return;
				 }
			 }
			 if(recv_ctr!=7) recv_chksum += temp;
			 recv_buf[recv_ctr++] = temp;    		                		
             if (recv_ctr == datalen) 
			 {  
			      dataflag = 0;           //数据完整收完,标志置位。
				  recv_ctr=0;
			      if (recv_chksum== recv_buf[7]) recv_buf_valid=1; 
				  else recv_lose_sum++;					   		                  		                   		
             }   
         }

}


/*********************************************************************************************************
** 函数名称 :UART2_TEST()
** 函数功能 :串口2函数测试程序
** 入口参数 :无
** 出口参数 :无
*********************************************************************************************************/
void UART0_TEST(void)
{
 /*中断接收再返回上位机*/
uint8 temp;
 char str[64];

 //uart3_init();
//UART0_set_bps(9600);
 
 if(UART0_getchar(&temp) == FALSE)		//查询是否接收到一个字符	
 	return;
 
 tx_buffer0[0]=temp;
 //tx_buffer0[0]=UART0_RcvByte();
 
 UART0_putBuf(tx_buffer0, 1);
 //DISP_CHANGEROW0();
 sprintf(str, "My name is Tian Youlong !!!");
 //UART0_SendStr(str);						// 向串口发送字符串
 //DISP_CHANGEROW0();


}	


//函数名称:zigbee_into_config
//函数功能:进入配置模式
//入口参数:
//出口参数:
void zigbee_into_config (void)
{
FIO2CLR |= p212;//ZB_CFG
DelayNS(300);
FIO2SET |= p212;//ZB_CFG
}

//函数名称:zigbee_lan_select
//函数功能:语言选择
//入口参数:
//出口参数:
void zigbee_lan_select (void)
{
UART0_putchar(0x02);
}

//函数名称:zigbee_save_code
//函数功能:输入安全码
//入口参数:
//出口参数:
void zigbee_save_code (void)
{
//char str[10];
//sprintf(str, "SHUNCOM");
//UART0_SendStr(str);	
UART0_putstr("SHUNCOM");

}

//函数名称:zigbee_read_set
//函数功能:读取参数
//入口参数:
//出口参数:
void zigbee_read_set (void)
{
UART0_putchar(0x0e);
}



//函数名称:main
//函数功能:主函数:实现ZIGBEE自收自发(数据收发)
int main (void)
{
  unsigned char  temp_buf[128];		  //临时缓冲区

  ZIGBEE_INIT();
  //time0_init();
  //蜂鸣器
  PINSEL2 &= 0xFFFCFFFF;//连接GPIO功能
  IO1DIR |= PIN108;//设置为输出
  IO1SET |= PIN108;//设置为输出
 //1.设置波特率
 UART0_set_bps(38400);
 
 
 
 //2.拉低配置引脚,接收相应数据
 rx_wr_index0=0;
 //rx_counter0=0;
 zigbee_into_config();
 //while(UART0_RcvByte());
 //220
 DelayNS(100);
 
 //3.选择语言,接收相应数据
 rx_wr_index0=0;
 //rx_counter0=0;
 zigbee_lan_select();
 //while(UART0_RcvByte());
 // 25 245
 DelayNS(100);
 
 //4.输入安全代码,接收相应数据
 rx_wr_index0=0;
 //rx_counter0=0;
 zigbee_save_code();
 DelayNS(100);
 //while(UART0_RcvByte());
 // 227 472
 
 //5.发送读取参数命令,读取配置参数
 rx_wr_index0=0;
 //rx_counter0=0;
 zigbee_read_set();
 //while(UART0_RcvByte());
 // 242 714 
 
 /*
 for (i = 0; i < 1; i++)
				{	
				//status=UCSRA;
				data=U0RBR;
				//if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
   				//{
   				if(rx_counter0 < (RX_BUFFER_SIZE0-1))
   				{
   					rx_buffer0[rx_wr_index0]=data;
   					if (++rx_wr_index0 == RX_BUFFER_SIZE0) rx_wr_index0=0;
   					rx_counter0++;
      			}
*/
 
while(1)
{
  //UART0_TEST();
  
 }  
  return 0;

}


/*********************************************************************************************************
**                            End Of File
********************************************************************************************************/

⌨️ 快捷键说明

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