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

📄 main_0606.c

📁 arm 2410上的hdlc server 通信程序
💻 C
字号:
#include "stdafx.h"
#include<windows.h> 
#include<stdio.h> 
#include<msgqueue.h>
#include <winbase.h>
#include <kfuncs.h>
#include "2410addr.h"
 
#include <stdio.h>
 #define HDLC0_BASE 0xa8000000//0xe02000   /*****pcm1 hdlc0 hw9 ts16,TS=0x130*****/
 #define HDLC1_BASE 0xa8000100//0xe03000   /*****pcm0 hdlc1 hw8 ts16,TS=0x110*****/
 #define  IDLE  0
 #define  ACTI  0xf
 #define	MAX_OF_HDLC_LENGTH	1024
 #define FIFO_STATUS              0     //FIFO_Status   0
 #define FIFO_DATA                1     //Receive_Data  Write  
 #define FIFO_CONTROL             2     //Control  Write 
 #define FIFO_ADDRESS             3     //Receive_Address  Write
 #define FIFO_CHANNEL_CONTROL     4     //Channel Control (Transmit)  Write
 #define FIFO_TIMING_CONTROL      5     //Timing Control  Write
 #define FIFO_INTERRUPT_FLAG      6     //Interrupt Flag  Write
 #define FIFO_INTERRUPT_ENABLE    7     //Interrupt Enable  Write
 #define FIFO_GENERAL_STATUS      8     //General Status  8
 #define FIFO_CHANNEL_STATUS      9     //C-Channel Status (Receive)  9 
 
extern void
Jud_HDLC_Int_Status (void);
HANDLE  THREAD_T5,THREAD_T6,THREAD_T7,THREAD_T8,MAIN_HANDLE,semaA;
 long js=0,badjs=0,bad=0,badFirst=0;
 long fs=0,hcjd=0;
 long send=0;
 unsigned char buff[1030];
  unsigned char hc[1030];
  struct HDLC_BASE
{	unsigned char *addr ;
	unsigned char status ;
	unsigned char Int_clr ;
	unsigned char Tx_buff[1024] ;
    unsigned char Rx_buff[1024] ;
	unsigned int T_Length ;
	unsigned int R_Length ;
	unsigned int R_Len;
}BHDLC[2];
//unsigned char hdlc_start[]={3,0xFE,0xFE,0xFE};
//unsigned char hdlc_end[]={1,0,};
  void dclk_init()
{
	int temp,temp1;
  temp=rMISCCR;
  temp1=rGPHCON;
  rGPHCON=rGPHCON & 0xffff;
  rGPHCON=rGPHCON | 0x280000;
  rMISCCR=rMISCCR & 0xfff8f;
  rMISCCR=rMISCCR | 0x50;

  temp1=rDCLKCON;
rDCLKCON=rDCLKCON & 0x0f;
rDCLKCON=rDCLKCON |  0x361;

temp=rBWSCON;
rBWSCON=rBWSCON & 0xff00ffff;
rBWSCON |=0x40000;
}
void init_8052(void)
{
	int i;
BHDLC[0].addr = (unsigned char *)HDLC0_BASE ;
BHDLC[1].addr = (unsigned char *)HDLC1_BASE ;
BHDLC[0].status = IDLE ;
BHDLC[1].status = IDLE ;	
//D7  D6 D5   D4   D3  D2  D1  D0
//RST IC C1EN BRCK TC3 TC2 TC1 TC0
//1   0  0    0    0   0   0   0
*(BHDLC[0].addr + FIFO_TIMING_CONTROL)=0x80;
	for (i=0 ; i<255 ; i++) ;
*(BHDLC[0].addr + FIFO_TIMING_CONTROL)=0x00;
//D7   D6   D5   D4    D3    D2    D1 D0
//TxEN RxEN RxAD RA6/7 IFTF1 IFTF0 FA EOP
//0    0    0    0     0      0    0  0
//*(BHDLC[0].addr + FIFO_CONTROL)=0x00;	
//D7  D6 D5   D4   D3  D2  D1  D0
//RST IC C1EN BRCK TC3 TC2 TC1 TC0
//0   1  0    0    1   0   1   1
*(BHDLC[0].addr + FIFO_TIMING_CONTROL)=0x00;	
//D7   D6   D5   D4    D3    D2    D1 D0
//TxEN RxEN RxAD RA6/7 IFTF1 IFTF0 FA EOP
//1     1    0    0     0      1    0  0
*(BHDLC[0].addr + FIFO_CONTROL)=0x44;
}

char write_HS_buf(unsigned char para[],unsigned len,unsigned int ch_num)
{
	unsigned int i ,j ;unsigned char status,CONTROL;
	
  if (len > 19)
	  {
	   return -1;
	  }
	else
	{

	*(BHDLC[0].addr + FIFO_CONTROL)=0x44;	
//      status =*(BHDLC[ch_num].addr+FIFO_STATUS);
//	  *(BHDLC[ch_num].addr + FIFO_DATA)=(unsigned char)para[1];	
		for (i=0 ; i < len-1  ; i++)
		{
			*(BHDLC[ch_num].addr + FIFO_DATA)=(unsigned char)para[i];	
//				for (j=0 ; j<10 ; j++) ;
		}
		//CONTROL=*(BHDLC[ch_num].addr + FIFO_CONTROL);
	  *(BHDLC[ch_num].addr + FIFO_CONTROL)=*(BHDLC[ch_num].addr + FIFO_CONTROL) | 0x1;	
		//CONTROL=*(BHDLC[ch_num].addr + FIFO_CONTROL);
//	for (j=0 ; j<10 ; j++) ;

		*(BHDLC[ch_num].addr + FIFO_DATA)=(unsigned char)para[i];	
 		//CONTROL=*(BHDLC[ch_num].addr + FIFO_CONTROL);
//			for (j=0 ; j<10 ; j++) ;
		*(BHDLC[ch_num].addr + FIFO_CONTROL)=*(BHDLC[ch_num].addr + FIFO_CONTROL) | 0x80;
     	//	CONTROL=*(BHDLC[ch_num].addr + FIFO_CONTROL);
			fs++;
	}		
	return  0;
}
char hdlc_write_data(unsigned char data[],int size,unsigned int ch_num)
{
int i, len ;
unsigned char /*buf[1030],*/Status,sum=0;
 if (size>1024)
   return -1;
 buff[0]=0xf1;
 buff[1]=0xf2;
 buff[2]=0xf3;
 buff[3]=size & 0x00ff;
 buff[4]=size >> 8;
 for (i=0;i<size;i++) 
 {
	  buff[i+5]=data[i];
      sum=sum | data[i];
 }
buff[i+5]=sum;
len=0;

while(len < size+6)
{
//  Status=*(BHDLC[ch_num].addr+FIFO_STATUS); 
     Status= *(BHDLC[0].addr + FIFO_INTERRUPT_FLAG);
  if (((Status & 0x08)==0))
  {  
	  //if ((size+6)-len>19)
	  //{
     //  write_HS_buf(&buff[len],19,ch_num);
	 //  len=len+19;
	 // }
	 // else
	  {

	    write_HS_buf(&buff[len],(size+6)-len,ch_num);
        len=len+(size+6)-len;
	  
	  
	  }
  }
  else
  Sleep(1);

  //Status=*(BHDLC[ch_num].addr+FIFO_STATUS); 
  
}

}
search_bad_field (unsigned char i)
{
 unsigned char para;
 unsigned char status ;

  status = *(BHDLC[i].addr+FIFO_STATUS) ;
 
  while ((status & 0x30)!=0)
  {
     para = *(BHDLC[i].addr + FIFO_DATA ) ;
     status = *(BHDLC[i].addr+FIFO_STATUS) ;	 
  }
}
/////////////////////////////////////////////////////////////////////////////////////
void Jud_HDLC_Int_Status(void)
{
unsigned char int_status[2],vect_int[2] ;
unsigned char ctrl1=0,i,ff=0,tem=0,Overflow=0 ,URUN=0;
   i=0;
while(1)
{
	   WaitForSingleObject(semaA, INFINITE); 
	
     int_status[i]= *(BHDLC[0].addr + FIFO_INTERRUPT_FLAG);
     
   while (int_status[0]!=0)    		
   {
	   if (int_status[i] & 0x01)		/*** Rx Overflow **/
	   {
		   Overflow++;
	    search_bad_field (i) ;
		break;
	   }
	 
 	  if (int_status[i] & 0x02)  /*** RX  FULL  ***/
	  {
	    ctrl1++;
		  ; 
		  break;//search_bad_field (i) ;
		  
	  }
	 
 	   if (int_status[i] & 0x10) /*** FA  ***/
	  {
	      search_bad_field (i) ;
		  break;
		 	    
	  }
	   if (int_status[i] & 0x40 )		/*** End of Packed **/
	 {
	    search_one_field (i) ;
		break;
	 }
	
	   if (int_status[i] &0x04)  /*** RX  Tx URUN   ***/
	  {
		   URUN++;
            //  search_bad_field (i) ;
		   break;
	  }
	 
	 
	 if (int_status[i] & 0x20)		/** Tx  DONE ***/	 
	 {
	     ;
		 break;
	 }
	 
	
	 if (int_status[i] & 0x08) 		/** Tx 4/19 FULL ***/
	 {
	    ;// HDLC_TxEn[i]=0 ;
		break;
	 }
	
	 if (int_status[i] & 0x80)	 /** GA ***/	
	 {	    
	  ;
	  break;
	 }
	 int_status[i] =*(BHDLC[i].addr+FIFO_INTERRUPT_FLAG) ;  
	  
   }
ReleaseSemaphore(semaA,1,0); 
}
}	
//////////////////////////////////////////////////////////////////////////////////////////
/*void Jud_HDLC_Int_Status(void)
{
 unsigned char fifo_status[2];
 unsigned char ff;
 int len=0,i;
 for (i=0 ; i < 1024; i++)   
	 BHDLC[0].Rx_buff[i]=0 ;
 
   while(1)
   {
	   if(WaitForSingleObject(semaA, INFINITE) == WAIT_FAILED) 
	   {
      //printf("Wait in ALREADY_EXISTS child failed err=%d\n",
      //GetLastError());
      return 1;
	   }
      fifo_status[0] =*(BHDLC[0].addr+FIFO_STATUS); 
      *(BHDLC[0].addr + FIFO_CONTROL)=*(BHDLC[0].addr + FIFO_CONTROL) | 0x40;
	   /*
 if (((fifo_status[0] & 0x80)==0) && ((fifo_status[0] & 0x30)!=0))
{
    ff=*(BHDLC[0].addr + FIFO_DATA ) ;
}
 if((fifo_status[0] & 0xc0)==0xc0)//bad
	   {
	     ff=*(BHDLC[0].addr + FIFO_DATA ) ;
	   }else
  if ((fifo_status[0] & 0x80)==0x80)//good
	   {
	     ff=*(BHDLC[0].addr + FIFO_DATA ) ;
	   }else
	{
	 ff=*(BHDLC[0].addr + FIFO_DATA ) ;
	  }
		*/
	 /*  hc[hcjd]='B'; 
         hcjd++;
if (hcjd>=1000)
     hcjd=0;

    if ((fifo_status[0] & 0xc0)==0x40)//First Byte
    {
      search_one_field(0);
    }
    else if ((fifo_status[0] & 0xc0)==0xc0)
    {
     search_bad_field(0);
    }
	else 
	 ff=*(BHDLC[0].addr + FIFO_DATA );
    //fifo_status[0] =*(BHDLC[0].addr+FIFO_STATUS); 
	//Sleep(10);
 if(!ReleaseSemaphore(semaA,1,0)) 
   {
      //printf("ReleaseSema failed: error=%d\n",GetLastError());
         return 1;
   }

   }
 }	*/
search_one_field( unsigned char ch_num)
{
 USHORT i,nlen,sum=0;
 unsigned char status, buf1[20],ff;
  //for (i=0 ; i < 128; i++)   
//	 BHDLC[0].Rx_buff[i]=0 ;
   nlen = 0 ;
    // buf1[nlen] = *(BHDLC[ch_num].addr+FIFO_DATA) ;
  //   nlen++;

	 status = *( unsigned char*)(BHDLC[ch_num].addr+FIFO_STATUS) ;
  while ((((status & 0x80)==0) && ((status & 0x30)!=0)) )//|| ((status & 0xc0)==0x40)
  {
	 if (nlen >=20)
        //nlen=0;
	    break; 
	 buf1[nlen] = *(BHDLC[ch_num].addr+FIFO_DATA);
     nlen++;
	 status=0;
     status = *(BHDLC[ch_num].addr+FIFO_STATUS) ;
	 
  }
  
  status = *(BHDLC[ch_num].addr+FIFO_STATUS) ;
  if  ((status & 0xc0)==0x80) //good
   {
     buf1[nlen] = *(BHDLC[ch_num].addr+FIFO_DATA) ;
	 nlen++;
     if (BHDLC[ch_num].status==IDLE)
	 {
	   if((buf1[0]==0xf1) && (buf1[1]==0xf2)  && (buf1[2]==0xf3))
	   {
        BHDLC[ch_num].R_Len=buf1[3]+(buf1[4] <<8);
		BHDLC[ch_num].status=ACTI;
        //BHDLC[ch_num].R_Length=nlen-5;
			
		for(i=5;i<(nlen-1);i++)
		 {
           //if(BHDLC[ch_num].R_Length <=BHDLC[ch_num].R_Len)
			  BHDLC[ch_num].Rx_buff[BHDLC[ch_num].R_Length++]=buf1[i] ;
			  //////////////
             sum=sum | buf1[i];
			  ///////////////
         }
          
		 if (sum==buf1[i])
		 {
			// BHDLC[ch_num].Rx_buff[BHDLC[ch_num].R_Length++]=buf1[i] ;
           if(BHDLC[ch_num].R_Length ==BHDLC[ch_num].R_Len)
		   {
            //send mess
			 js++;
            BHDLC[ch_num].status=IDLE;
            BHDLC[ch_num].R_Length =0;
//			if (js==1)
//			send=1;
	        //for (i=0 ; i < 1024; i++)   
    	   //    BHDLC[ch_num].Rx_buff[i]=0 ;
		   }
         }
		 else
		 {
           sum=-1;
		 }
	   }
	 }else if(BHDLC[ch_num].status==ACTI)
	 {
		  for(i=0;i<nlen;i++)
		 {
			  BHDLC[ch_num].Rx_buff[BHDLC[ch_num].R_Length++]=buf1[i] ;
              if (BHDLC[ch_num].R_Length ==BHDLC[ch_num].R_Len)
				   break;
		  }
         if(BHDLC[ch_num].R_Length ==BHDLC[ch_num].R_Len)
		 {
            //send mess
			  js++;
            BHDLC[ch_num].status=IDLE;
            BHDLC[ch_num].R_Length =0;
	        for (i=0 ; i < 1024; i++)   
    	       BHDLC[ch_num].Rx_buff[i]=0 ;
		 }

	    
	 }
   }
  else if((status & 0xc0)==0xc0)//bad
  {
	  badjs++;
    ff = *(BHDLC[0].addr+FIFO_DATA) ;
  }
  else if((status & 0xc0)==0x40)
  {
   badFirst++;
  //ff = *(BHDLC[0].addr+FIFO_DATA) ;
  }
  else
  {
	  bad++;
    //ff = *(BHDLC[0].addr+FIFO_DATA) ;
  }
}

int WINAPI WinMain(	HINSTANCE hInstance,
					HINSTANCE hPrevInstance,
					LPTSTR    lpCmdLine,
					int       nCmdShow)
{
DWORD dwThreadId3;
unsigned char ch[]={'a','b','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T'};
unsigned char ch1[]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
int len=8,hdlc=0,i=0,j=0,count=0,count1=0;
char loop=1;

        semaA = CreateSemaphore(NULL, 1, 1, NULL);//(NULL, 0, 1, "semaABC");
    if(semaA == NULL) {
        printf("CreateSemaphore \"semaABC\" failed ERROR=%d\n", GetLastError());
        return 1;
    }


dclk_init();
 init_8052();
 THREAD_T5=CreateThread(NULL,0,Jud_HDLC_Int_Status,(LPVOID)NULL,0,&dwThreadId3);
	  Sleep(1000);
 while(loop)
 {   //if (j>=100)
     //   j=0;
	// for (i=0;i<10;i++)
	//	 ch[i]=j++;
//if(WaitForSingleObject(semaA, INFINITE) == WAIT_FAILED) 
//{
      //printf("Wait in ALREADY_EXISTS child failed err=%d\n",
      //GetLastError());
 //     return 1;
// }
if (hcjd>=1000)
    hcjd=0; 

hc[hcjd]='A';
 hcjd++;

if (send)
{
//send=0;
if (count<1000)
{
	count++;
WaitForSingleObject(semaA, INFINITE);
  hdlc_write_data(ch,len,hdlc);
ReleaseSemaphore(semaA,1,0);
//  for (i=0;i<1000;i++);
Sleep(1);
//  hdlc_write_data(ch,len,hdlc);
}
else 
{
	count1++;
	count=0;
	Sleep(100);
    send=0;
Sleep(10);
}
}
else
Sleep(10);
// if(!ReleaseSemaphore(semaA,1,0)) 
 // {
      //printf("ReleaseSema failed: error=%d\n",GetLastError());
//         return 1;
//  }

//  Jud_HDLC_Int_Status();/
 //Sleep(10000);
 }
 //Jud_HDLC_Int_Status();
return 0;
}

⌨️ 快捷键说明

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