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

📄 main_0608.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,Overflow=0 ,ctrl1=0,URUN=0;
 long fs=0,hcjd=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;
	for (i=0 ; i < len  ; i++)
	{
			*(BHDLC[ch_num].addr + FIFO_DATA)=(unsigned char)para[i];	
	}
	fs++;
	return  0;
}
char write_HS_buf_last(unsigned char para[],unsigned len,unsigned int ch_num)
{
	unsigned int i;
	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)=*(BHDLC[ch_num].addr + FIFO_CONTROL) | 0x1;	
   *(BHDLC[ch_num].addr + FIFO_DATA)=(unsigned char)para[i];	
   *(BHDLC[ch_num].addr + FIFO_CONTROL)=*(BHDLC[ch_num].addr + FIFO_CONTROL) | 0x80;
	}
	else
	{
	*(BHDLC[ch_num].addr + FIFO_DATA)=(unsigned char)para[0];	
   *(BHDLC[ch_num].addr + FIFO_CONTROL)=*(BHDLC[ch_num].addr + FIFO_CONTROL) | 0x1;	
   *(BHDLC[ch_num].addr + FIFO_DATA)=0;	
   *(BHDLC[ch_num].addr + FIFO_CONTROL)=*(BHDLC[ch_num].addr + FIFO_CONTROL) | 0x80;
	}
   return 0;
}
char hdlc_write_data(unsigned char data[],int size,unsigned int ch_num)
{
int i, len,flag=0;
unsigned char 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;
*(BHDLC[ch_num].addr + FIFO_CONTROL)=*(BHDLC[ch_num].addr + FIFO_CONTROL) | 0x80;
while(len < size+6)
{
   Status= *(BHDLC[0].addr + FIFO_INTERRUPT_FLAG);
   if (((Status & 0x08)==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 >=15)
		flag=1;
   }
   else
   {
     if ((Status & 0x08)!=0)
	 {
      if(((size+6)-len)>15)
	  {
	   write_HS_buf(&buff[len],10,ch_num);
	   len=len+15;
	  }
	  else
	  {
       write_HS_buf_last(&buff[len],(size+6)-len,ch_num);
	   len=len+(size+6)-len;
	  }
	 }
	 else
	 {
       if ((Status & 0x04)!=0)
		   URUN++;
	 }
   }
}

}

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;
   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++;
		search_one_field(i) ;
		break;
	  }
	 
 	   if (int_status[i] & 0x10) /*** FA  ***/
	  {
	      search_bad_field (i) ;
		  break;
		 	    
	  }
	   if (int_status[i] & 0x40 )		/*** End of Packed **/
	 {
	    search_one_field_last (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);
}
}	
  search_one_field( unsigned char ch_num)
{
   int i;
   for (i=0;i<14;i++)
	   BHDLC[ch_num].Rx_buff[BHDLC[ch_num].R_Length++] =*(unsigned char*)(BHDLC[ch_num].addr+FIFO_STATUS);
 
}
  search_one_field_last( unsigned char ch_num)
{

  unsigned char i,status,ff;
  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++]= *(BHDLC[ch_num].addr+FIFO_DATA);
     status=0;
     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) ;
     js++; 
  }
  else if((status & 0xc0)==0xc0)//bad
  {
	badjs++;
    BHDLC[ch_num].Rx_buff[BHDLC[ch_num].R_Length++] = *(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[1000];
int len=100,hdlc=0,i=0,j=0,count=0,count1=0,send=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();
 
 for(i=0;i<1000;i++)
   ch1[i]=i;

// THREAD_T5=CreateThread(NULL,0,Jud_HDLC_Int_Status,(LPVOID)NULL,0,&dwThreadId3);
	  Sleep(1000);

 while(loop)
 {   
if (hcjd>=1000)
    hcjd=0; 

hc[hcjd]='A';
 hcjd++;
if(send)
{ 
if (count<10 )
{
	count++;

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

⌨️ 快捷键说明

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