📄 hdlcdemo.c
字号:
#include <vxWorks.h>
#include "myHdlc.h"
#include <stdio.h>
#include <stdlib.h>
#include "CS4510.H"
#define TASK_STACK 10000
#define MAX_SIZE 300
struct hdlcFra
{
unsigned int addr ;/*= 0x22222222 ;*/
char cont ;
unsigned char *data ;/*= NULL ;*/
};
struct buffer
{
unsigned int buf;
unsigned int rev;
unsigned int bufL;
struct buffer *nextbuf;
};
struct hdlcFra FrameSend[3];
struct hdlcFra FrameReceive[3];
struct buffer *BufferSend[3];
struct buffer *BufferReceive[3];
int tidTask;
void InitiateFra();
void InitiateSendBuf();
void InitiateReceiveBuf();
void InitiateHdlc();
void Task();
STATUS progStart();
STATUS progStop();
void InitiateFra()
{
int i = 0;
int j;
for(i;i < 3;i++)
{
switch(i)
{
case 0:
/*int j;*/
FrameSend[i].addr = 0x22222222;
FrameSend[i].cont = 0x12;
FrameSend[i].data = (char *)malloc(130);
FrameReceive[i].data = (char *)malloc(130);
FrameSend[i].data[0] = 0x22;
FrameSend[i].data[1] = 0x01;
for(j = 2;j < 130;j ++)
{
FrameSend[i].data[j] = 0x55 ;
FrameReceive[i].data[j] = 0;
}
break;
case 1:
/*int j = 0;*/
FrameSend[i].addr = 0x22222222;
FrameSend[i].cont = 0x12;
FrameSend[i].data = (char *)malloc(202);
FrameReceive[i].data = (char *)malloc(202);
FrameSend[i].data[0] = 0x22;
FrameSend[i].data[1] = 0x01;
for(j = 2;j < 202;j++)
{
FrameSend[i].data[j] = 0xAA;
FrameReceive[i].data[j] = 0;
}
break;
case 2:
/*int j = 0;*/
FrameSend[i].addr = 0x22222222;
FrameSend[i].cont = 0x12;
FrameSend[i].data = (char *)malloc(258);
FrameReceive[i].data = (char *)malloc(258);
FrameSend[i].data[0] = 0x22;
FrameSend[i].data[1] = 0x01;
for(j = 2;j < 258;j++)
{
FrameSend[i].data[j] = j-1;
FrameReceive[i].data[j] = 0;
}
break;
default:break;
}
}
}
void InitiateSendBuf()
{
int k;
for(k = 0;k < 3;k++)
{
BufferSend[k] = (struct buffer *)malloc(1);
BufferSend[k]->buf = ((unsigned int)FrameSend[k].data);
BufferSend[k]->buf = ((unsigned int)FrameSend[k].data)|0x80000000;
BufferSend[k]->rev = 0x0000000A;
switch (k)
{
case 0:BufferSend[k]->bufL = 0x00000080;
break;
case 1:BufferSend[k]->bufL = 0x000000C8;
break;
case 2:BufferSend[k]->bufL = 0x00000100;
break;
default:printf("Wrong!");
}
BufferSend[k]->nextbuf = NULL;
}
return;
}
void InitiateReceiveBuf()
{
int i;
for(i=0;i < 3;i ++)
{
BufferReceive[i] = (struct buffer *)malloc(1);
BufferReceive[i]->buf = (unsigned int)FrameReceive[i].data|0x80000000;
BufferReceive[i]->rev = 0x00000000;
BufferReceive[i]->bufL = 0x00000000;
BufferReceive[i]->nextbuf = NULL;
}
return;
}
void InitiateHdlc()
{
/* CS4510HDLC_HCON |= TxRS| \
RxRS|DTxRS|DRxRS;
CS4510HDLC_HMODE = TxCBO2| \
RxCBO2|BRGMCLK|NRZ;
CS4510HDLC_HCON = Tx1WD|Rx1WD|DTxSTSK|DRxSTSK| \
RxWA0|TxDTR|BRGEN|TxLOOP;
CS4510HDLC_HINTEN = 0x00000000;/*DTxFDIE | \
DRxFDIE | DRxNLIE | DRxNOIE | RxMOVIE;
CS4510HDLC_HMFLR = 1500;
CS4510HDLC_HRBSR = 500;
CS4510HDLC_HSAR0 = 0x00000055;
CS4510HDLC_HSAR1 = 0x000000AA;
CS4510HDLC_HSAR2 = 0x00000022;
CS4510HDLC_HSAR3 = 0x00000022;
CS4510HDLC_HMASK = 0x000000FF;
InitiateFra();
InitiateSendBuf();
InitiateReceiveBuf();
return;*/
/*HDLC通道复位*/
CS4510HDLC_HCON |= TxRS| \
RxRS|DTxRS|DRxRS;
/*通道工作模式配置*/
CS4510HDLC_HMODE = TxCBO2| \
RxCBO2|BRGMCLK|NRZ;
/*通道控制存储器配置*/
CS4510HDLC_HCON = Tx1WD|Rx1WD|DTxSTSK|DRxSTSK| \
RxWA0|TxDTR|BRGEN|TxLOOP;
/*通道中断控制器配置*/
CS4510HDLC_HINTEN = 0x00000000;/*DTxFDIE | \
DRxFDIE | DRxNLIE | DRxNOIE | RxMOVIE;
/*最大帧长度*/
CS4510HDLC_HMFLR = 1500;
/*接受的buffer的大小*/
CS4510HDLC_HRBSR = 500;
/*站址寄存器及站址屏蔽寄存器*/
CS4510HDLC_HSAR0 = 0x00000055;
CS4510HDLC_HSAR1 = 0x000000AA;
CS4510HDLC_HSAR2 = 0x00000022;
CS4510HDLC_HSAR3 = 0x00000022;
CS4510HDLC_HMASK = 0x000000FF;
/*frame的初始化*/
InitiateFra();
InitiateSendBuf();
InitiateReceiveBuf();
/*DMA使能*/
/*HCON |= DRxEN;*/
}
STATUS progStart()
{
tidTask = taskSpawn("task",200,0,TASK_STACK,(FUNCPTR)Task,
0,0,0,0,0,0,0,0,0,0);
if(tidTask == ERROR)
{
printf("\nTask Start Error");
return ERROR;
}
printf("Start Output\n");
return OK;
}
void Task()
{
int m = 0;
int k;
int j;
InitiateHdlc();
for(m;m < 3;m ++)
{
CS4510HDLC_HDMATxPTR = (unsigned int)BufferSend[m];
CS4510HDLC_HDMARxPTR = (unsigned int)BufferReceive[m];
CS4510HDLC_HCON |= DTxEN|TxEN|DRxEN|RxEN;
for(k=0;k<1000000;k++);
}
for(k = 0;k < 3;k ++)
{
switch(k)
{
case 0:
for(j = 0;j < 130;j ++)
{
printf("%c",FrameReceive[k].data[j]);
}
printf("\n******************************************\n");
break;
case 1:
for(j = 0;j < 202;j ++)
{
printf("%x",FrameReceive[k].data[j]);
}
printf("\n******************************************\n");
break;
case 2:
for(j = 0;j < 258;j ++)
{
printf("%d",FrameReceive[k].data[j]);
/*printf("\n");*/
}
printf("\n");
break;
default:break;
}
}
return;
}
STATUS progStop()
{
taskDelete(tidTask);
printf("Goodbye");
return OK;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -