📄 main_0608.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 + -