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

📄 hdlcdemo.c

📁 基于嵌入式开发环境tornado的基于VxWorks的hdlc的通讯程序
💻 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 + -