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

📄 main.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 
 
HANDLE	m_hevInterrupt;
DWORD dwSysIntr_Keybd;
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,Overflow=0 ,ctrl1=0,ctrl2=0,URUN=0,fa=0;
 long fs=0,hcjd=0,log_js,send=1,init_count=0;
 //char logjs[2][200];
 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[1100] ;
    unsigned char Rx_buff[1100] ;
	unsigned int T_Length ;
	unsigned int R_Length ;
	unsigned int R_Len;
}BHDLC[2];
int HDLC_TxEn[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 |  0x121;
//rDCLKCON=rDCLKCON |  0x361;
//rDCLKCON=rDCLKCON |  0x7e1;

temp=rBWSCON;
//rBWSCON=rBWSCON & 0xff00ffff;
//rBWSCON |=0x40000;
rBWSCON=rBWSCON & 0xff00ffff;
rBWSCON |=0x400000;

//temp=rBANKCON4;
//rBANKCON4 |=0x7fc0;
//rBANKCON4 |=0x7c0;
rBANKCON5 |=0x7fc0;
temp=rGPFDAT;
temp=rGPFUP;
temp=rEXTINT0;
temp=rINTMSK;
temp=rSRCPND;
temp=rINTPND;
temp=rINTMSK;
rINTMSK &=~BIT_EINT1;
temp=rINTPND;
temp=rGPECON;
rGPECON &=0xffffcfff;
rGPECON |=0xffff1fff;
temp=rGPECON;

  }
void init_8052(void)
{
	int i,j; 
BHDLC[0].R_Length =0;
BHDLC[1].R_Length =0;
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
for (j=0;j<2;j++)
{
*(BHDLC[j].addr + FIFO_TIMING_CONTROL)=0x80;
	for (i=0 ; i<255 ; i++) ;
*(BHDLC[j].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[j].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[j].addr + FIFO_CONTROL)=0xc4;
*(BHDLC[j].addr + FIFO_INTERRUPT_ENABLE)=0x7f;
HDLC_TxEn[j]=0;
}
}
char write_HS_buf(unsigned char para[],unsigned len,unsigned int ch_num)
{
	unsigned int i ,j ;
	unsigned char status,CONTROL;
	HDLC_TxEn[ch_num]=0x1 ;
	if (len != 1)
	{
	  for (i=0 ; i < len  ; i++)
	  {
			*(BHDLC[ch_num].addr + FIFO_DATA)=(unsigned char)para[i];	
	  }
      *(BHDLC[ch_num].addr + FIFO_CONTROL) |=0x80;
	}
	else
	{
	  *(BHDLC[ch_num].addr + FIFO_DATA)=(unsigned char)para[0];	
      *(BHDLC[ch_num].addr + FIFO_CONTROL) |=0x80;
	}
	return  0;
}
char write_HS_buf_last(unsigned char para[],unsigned len,unsigned int ch_num)
{
	unsigned int i;
	HDLC_TxEn[ch_num]=0x1 ;
	if (len != 1)
	{
	for (i=0 ; i < len-1  ; i++)
	{
			*(BHDLC[ch_num].addr + FIFO_DATA)=(unsigned char)para[i];	
	}
   *(BHDLC[ch_num].addr + FIFO_CONTROL) |=0x1;	
   *(BHDLC[ch_num].addr + FIFO_DATA)=(unsigned char)para[i];	
   *(BHDLC[ch_num].addr + FIFO_CONTROL) |=0x80;
	}
	else
	{
	*(BHDLC[ch_num].addr + FIFO_DATA)=(unsigned char)para[0];	
   *(BHDLC[ch_num].addr + FIFO_CONTROL) |=0x1;	
   *(BHDLC[ch_num].addr + FIFO_DATA)=0;	
   *(BHDLC[ch_num].addr + FIFO_CONTROL) |=0x80;
	}
   return 0;
}
/*
char hdlc_write_data(unsigned char data[],int size,unsigned int ch_num)
{
int i,j, len;
int flag=0;
unsigned char Status,Status1,sum=0,bytes=15;
 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_INTERRUPT_FLAG);
   if ((Status==0) && (flag==0))
   {  

//	if (((len%18)==0) && (len!=0))
//		write_HS_buf_last(&buff[len],1,ch_num);
//	else
       write_HS_buf(&buff[len],1,ch_num);
	   len++;
	   if (len >=bytes)
	   {
	  	flag=1;
	   }
   }
   else
   {
   if (((Status & 0xff)==8) && (flag!=0))
	 {
//	       write_HS_buf(&buff[len],1,ch_num);
//	       len++;

      if(((size+6)-len)>bytes)
	  {
	   write_HS_buf(&buff[len],bytes,ch_num);
	   len=len+bytes;
	  }
	  else
	  {
       write_HS_buf_last(&buff[len],(size+6)-len,ch_num);
	   len=len+(size+6)-len;
	  }
	 }

       if (Status ==0)
		   URUN++;
   }
}

}
*/
char hdlc_write_data(unsigned char data[],int size,unsigned int ch_num)
{
int i,j, len;
int flag=0;
unsigned char Status,Status1,sum=0,bytes=15;
 if (size>1024)
   return -1;
 buff[0]=0xb1;
 buff[1]=0xb2;
 buff[2]=0xb3;
 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);
//   if (((Status & 0x0c)==8) && (flag==0))
/*
    if (HDLC_TxEn[0]==0)
   {  

       write_HS_buf(&buff[len],1,ch_num);
	   len++;
	   if (len >=bytes)
	   {
	  	flag=1;
	   }
   }
   else*/
   {
//   if (((Status & 0x0c)==8) && (flag!=0))
    if (HDLC_TxEn[ch_num]==0)
	 {

      if(((size+6)-len)>bytes)
	  {
	   write_HS_buf(&buff[len],bytes,ch_num);
	   len=len+bytes;
	  }
	  else
	  {
       write_HS_buf_last(&buff[len],(size+6)-len,ch_num);
	   len=len+(size+6)-len;
	  }
	 }

   }
}
 
}

void 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 i,ff=0,tem=0,status=0;
	DWORD dwPriority;
    dwPriority=240;

   i=0;
   m_hevInterrupt = CreateEvent(NULL,FALSE,FALSE,NULL);
    if (m_hevInterrupt == INVALID_HANDLE_VALUE) {
    return 1;
	}
	dwSysIntr_Keybd=0x10;
	if (!InterruptInitialize(dwSysIntr_Keybd,m_hevInterrupt,NULL,0)) 
	{
    return 1;
	}
	CeSetThreadPriority(GetCurrentThread(), (int)dwPriority);
   while(1)
{
	if ( WaitForSingleObject(m_hevInterrupt, INFINITE) == WAIT_TIMEOUT )
	    Uart_Printf("timeout\n");
	else
	{

     init_count++;
     int_status[i]= *(BHDLC[i].addr + FIFO_INTERRUPT_FLAG);
//     rINTMSK &=~BIT_EINT1;
    
    if (int_status[i]!=0)    		
    {
	   if (int_status[i] & 0x01)		/*** Rx Overflow **/
	   {  
		   //logjs[0][log_js]=1;
	       // log_js++;
		   Overflow++;
	    search_bad_field (i) ;
//	   Uart_Printf("OV\n");
//		break;
	   }
	 
 	   if (int_status[i] & 0x10) /*** FA  ***/
	   {  
		   fa++;
	      search_bad_field (i) ;
//	   Uart_Printf("FA\n");
//		  break;
		 	    
	  }
 	  if (int_status[i] & 0x02)  /*** RX  FULL  ***/
	  {
		//logjs[1][log_js]=1;
	    //log_js++;
	    ctrl1++;
//		search_one_field(i) ;
//	    Uart_Printf("RX\n");
//		break;
	  }
	 
	   if (int_status[i] & 0x40 )		/*** End of Packed **/
	 {
		   ctrl2++;
//	    search_one_field_last (i) ;
//	    Uart_Printf("END\n");
//		break;
	 }
	
	   if (int_status[i] &0x04)  /***   Tx URUN   ***/
	  {
		   URUN++;
            //  search_bad_field (i) ;
//		   break;
	  }
	 
	 
	 if (int_status[i] & 0x20)		/** Tx  DONE ***/	 
	 {
	   HDLC_TxEn[i]=0;
//		 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) ;  
   }
	InterruptDone(dwSysIntr_Keybd);
	}
   }  
}	
  search_one_field( unsigned char ch_num)
{
  int i=0,status=0;
  unsigned char sum=0;
 //  for (i=0;i<14;i++)
	   //BHDLC[ch_num].Rx_buff[BHDLC[ch_num].R_Length++] =*(unsigned char*)(BHDLC[ch_num].addr+FIFO_STATUS);
   status = *( unsigned char*)(BHDLC[ch_num].addr+FIFO_STATUS) ;
  while ((((status & 0x80)==0) && ((status & 0x30)!=0)) )//|| ((status & 0xc0)==0x40)
  {
     BHDLC[ch_num].Rx_buff[BHDLC[ch_num].R_Length++] =*(unsigned char*)(BHDLC[ch_num].addr+FIFO_DATA);
     i++;
	 if (i==14)
	 break;
	// status=0;
     status = *(BHDLC[ch_num].addr+FIFO_STATUS) ;
  }
}
  search_one_field_last( unsigned char ch_num)
{

  unsigned char status,ff,sum=0;
  int i;
  status = *( unsigned char*)(BHDLC[ch_num].addr+FIFO_STATUS) ;
  while (((status & 0x80)==0) && ((status & 0x30)!=0) )
  {
	 BHDLC[ch_num].Rx_buff[BHDLC[ch_num].R_Length++]= *(BHDLC[ch_num].addr+FIFO_DATA);
     status = *(BHDLC[ch_num].addr+FIFO_STATUS) ;
  }
  
  status = *(BHDLC[ch_num].addr+FIFO_STATUS) ;
  if  ((status & 0xc0)==0x80) //good
  {
     BHDLC[ch_num].Rx_buff[BHDLC[ch_num].R_Length++] = *(BHDLC[ch_num].addr+FIFO_DATA) ;

     if((BHDLC[ch_num].Rx_buff[0]==0xf1) && (BHDLC[ch_num].Rx_buff[1]==0xf2)  && (BHDLC[ch_num].Rx_buff[2]==0xf3))
	    {
		  BHDLC[ch_num].R_Len=BHDLC[ch_num].Rx_buff[3]+(BHDLC[ch_num].Rx_buff[4] <<8);
		  for(i=0;i<BHDLC[ch_num].R_Len;i++)
		  {
             sum=sum | BHDLC[ch_num].Rx_buff[i+5];
		  }
          sum=~sum;
		  if (sum==BHDLC[ch_num].Rx_buff[i+5])
		  {
			 js++;
	         Uart_Printf("OK\n");
		  }
		  else
		  {
           sum=-1;
		  }
	   }
       else
           sum=-1;

  }
  else 
  {
	  badjs++;
    BHDLC[ch_num].Rx_buff[BHDLC[ch_num].R_Length++] = *(BHDLC[ch_num].addr+FIFO_DATA) ;
  }
   BHDLC[ch_num].R_Length =0;
//   for (i=0 ; i < 1024; i++)   
//       BHDLC[ch_num].Rx_buff[i]=0 ;

}

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[1024];
int len=13,hdlc=0,i=0,j=0,count=0,count1=0,temp;
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();
     Uart_Init(0,115200);
    Uart_Select(0);

 for(i=0;i<1024;i++)
   ch1[i]=i;

 THREAD_T5=CreateThread(NULL,0,Jud_HDLC_Int_Status,(LPVOID)NULL,0,&dwThreadId3);
	  Sleep(1000);
     i= *(BHDLC[0].addr + FIFO_INTERRUPT_FLAG);
 while(loop)
 {   

if(1)
{ 
//	send=0;
if (count<16 )
{
	count++;
//  WaitForSingleObject(semaA, INFINITE);
  hdlc_write_data(ch1,len,hdlc);
// ReleaseSemaphore(semaA,1,0);
Sleep(9);
}
else 
{
	count1++;
	if (count1==0x10)
		count1=0;
	count=0;
//	Sleep(100);
	send=1;
//Sleep(10);
}
}
else
Sleep(10);
 }
return 0;

}

⌨️ 快捷键说明

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