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