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

📄 timer_send.c.bak

📁 AVR控制的SAB82525——HDLC通信 循环队列处理 完全是自己写的
💻 BAK
字号:
//主机发I桢m-m,从机用透明模式

//------------------------------------------------------------------


#include "iom128v.h"
#include "macros.h"

//------------------------------------------------------------------

#define XFIFO ((volatile unsigned char *)0)
#define XBYTE ((volatile unsigned char *)0) 
#define MASK (*(volatile unsigned char *)0x2020)
#define MASB (*(volatile unsigned char *)0x2060)
#define ISTA (*(volatile unsigned char *)0x2020)
#define ISTB (*(volatile unsigned char *)0x2060)
#define CMDR (*(volatile unsigned char *)0x2021)
#define STAR (*(volatile unsigned char *)0x2021)
#define MODE (*(volatile unsigned char *)0x2022)
#define TIMR (*(volatile unsigned char *)0x2023)
#define XAD1 (*(volatile unsigned char *)0x2023)
#define EXIR (*(volatile unsigned char *)0x2024)
#define XAD2 (*(volatile unsigned char *)0x2025)
#define RBCL (*(volatile unsigned char *)0x2025)
#define RAH1 (*(volatile unsigned char *)0x2026)
#define RAH2 (*(volatile unsigned char *)0x2027)
#define RSTA (*(volatile unsigned char *)0x2027)
#define RAL1 (*(volatile unsigned char *)0x2028)
#define RAL2 (*(volatile unsigned char *)0x2029)
#define RHCR (*(volatile unsigned char *)0x2029)
#define XBCL (*(volatile unsigned char *)0x202a)
#define BGR  (*(volatile unsigned char *)0x202b)
#define CCR2 (*(volatile unsigned char *)0x202c)
#define XBCH (*(volatile unsigned char *)0x202d)
#define RBCH (*(volatile unsigned char *)0x202d)
#define RLCR (*(volatile unsigned char *)0x202e)
#define VSTR (*(volatile unsigned char *)0x202e)
#define CCR1 (*(volatile unsigned char *)0x202f)
#define XFW  (STAR&0x40)>>6                     //发送FIFO可写
#define CEC  (STAR&0x04)>>2                     //CEC=1,CMDR不可写;CEC=0,CMDR可写
#define RME  (ISTA&0x80)>>7                     //信息接收结束
#define RPF  (ISTA&0x40)>>6                     //32Bytes接受池满
#define RSC  (ISTA&0x20)>>5                     //自动模式下对方的状态
#define XPR  (ISTA&0x10)>>4                     //发送池正空
#define TIN  (ISTA&0x08)>>3                     //定时器中断
#define XMR  (EXIR&0x80)>>7                     //发送需要重复
#define XDU  (EXIR&0x40)>>6                     //发送中途中止
#define PCE  (EXIR&0x20)>>5                     //协议错误
#define RFO  (EXIR&0x10)>>4                     //接收数据无法存入RFIFO造成溢出
#define CSC  (EXIR&0x08)>>3                     //CTS状态改变
#define RFS  (EXIR&0x04)>>2                     //接收到帧头
//---------------------------------------------------------------------
unsigned char flag_txd;
unsigned char pre_txd[33];
unsigned char count;
extern unsigned char front,rear;
//-----------------------------------------------------------------------------

//Queue_2D Declaration Start===================================================
void InitQueue();
unsigned char QueueEmpty();
unsigned char QueueFull();
void EnQueue(unsigned char txd_data[32],unsigned char num_enQ);    //入队
void DeQueue();        //出队
//Queue_2D Declaration End=====================================================

//DATA Array for Test Start====================================================
unsigned char data_array01[32]={0x02,0x93};
unsigned char data_array02[32]={0x02,0x00,0xff,0xee};
unsigned char data_array03[32]={0x03,0x00,0x66};
unsigned char data_array04[32]={0x04,0x00,0xff};
//DATA Array for Test End======================================================

//-----------------------------------------------------------------------------
void chipinit(void)
{ 
	 DDRB|=0xcf;		//1100_1111
	 PORTB|=0xcf;		//同上
	 
	 DDRD=0xfc;			//1111_1100		**
	 //PORTD=0x3f;
	 
	 DDRE=0x07;			//0000_0011
	 PORTE=0xfc;		//1111_1100
	 
	 DDRF=0x00;			//0000_0000
	 PORTF=0xff;		//1111_1111
	 
   DDRG=0xff;			//1111_1111
	 PORTG=0x1f;		//0001_1111

    //enable the interrupt
	 //SREG|=0x80;		//1000_0000
	 //enable the external ram
	 MCUCR=(1<<SRE);//使能外部RAM线路
	 
	 EICRA=0x00;
	 EIMSK=0x00;
	 //EIMSK=0x01;
     
   return;
}
//-------------------------------------------------------------
void resethdlc(void)
{
   PORTD|=0x40;			//0100_0000
   //PORTD&=0xbf;
} 
//--------------------------------------------------------------
void cshdlc(void)
{  
   PORTD&=0x3f;			//0011_1111
}
    
//-------------------------------------------------------------
void int_open(void)
{
	_SEI();
	asm("nop");
}
//--------------------------------------------------------------
void clk(void)
{
	PORTD&=0xdf;				//1101_1111					片选8254
	
	//送入计数方式	
	XBYTE[0x3300]=0x36;	//地址11_0000_0000	数据0011_0110
	XBYTE[0x3000]=0x02;	//地址00_0000_0000	数据0000_0010
	XBYTE[0x3000]=0x00;	//地址00_0000_0000	数据0000_0000
	
	XBYTE[0x3300]=0x76;	//									数据0111_0110
	XBYTE[0x3100]=0x02;	//地址01_0000_0000	数据0000_0010
	XBYTE[0x3100]=0x00;	//地址01_0000_0000	数据0000_0000
	
	XBYTE[0x3300]=0xB6;	//									数据1011_0110
	XBYTE[0x3200]=0x02;	//地址10_0000_0000	数据0000_0010
	XBYTE[0x3200]=0x00;	//地址10_0000_0000	数据0000_0000
	
	//启动分频计数器
	PORTD|=0x1c;				//0001_1100	
	
	//取消片选
	PORTD|=0x20;				//0010_0000
	return;
}
//------------------------------------------------------------------
void automode(void)
{    
    CCR1=0x98;			//1001_1000
    
	  MASB=0xfb;			//1111_1011
	  MASK=0x27;			//0010_0111
	  MODE=0x18;			//0001_1100		数据传输由HSCX自动管理
    TIMR=0x7f;			//监控帧自动重试的次数
    
    XAD1=0x00;			//未知
    XAD2=0x03;			//未知
    RAH1=0x02;			//IMPORMANT!!!
    RAH2=0x00;			//IMPORTANT!!!
    RAL1=0x01; 			//未知
    RAL2=0x01;			//未知
    CCR2=0x00;			//
    
    
    XBCH=0x00;
    while(CEC==1);	//等待CMDR可写
    CMDR=0x41;		//重启收发器
}
//-----------------------------------------------------------------------
void delay_nms(unsigned int tm)
{
	unsigned int i_dms;
	for(i_dms=tm;i_dms>0;i_dms--)
		delay_1ms();
}
//------------------------------------------------------------------
void delay_1ms(void)
{
	unsigned int i_dl;
	for(i_dl=1;i_dl<(unsigned int)(4*143-2);i_dl++)
	;
}
//------------------------------------------------------------------
void transmit(void)
{
	unsigned char it=0;
	unsigned char xfw;
	
	flag_txd=1;
	
	if(count!=0)
		{
			DeQueue();
			
			while(CEC==1);
			do
			{
				xfw=XFW;
			}while(xfw!=1);

			for(it=0;it<pre_txd[32];it++)
			{
				XFIFO[0x2000+it]=pre_txd[it];
			}
	
			while(CEC==1);//等待CMDR可写
			CMDR|=0x0a;		//写入,引起发送
	
		}
	
	delay_1ms();
	flag_txd=0;

}
//-----------------------------------------------------------------------
main()
{
  int im=0;
  
  chipinit();
  clk();
  resethdlc();
  cshdlc();
  automode();
  InitQueue();
  timer0_init();
  int_open();
	
	/*txd[0]=0x02;
	txd[1]=0x93;
	EnQueue(txd,2);
	
	txd[0]=0x02;
	txd[1]=0x00;
	for(im=2;im<17;im++)
		txd[im]=0x99;
	EnQueue(txd,17);
	for(im=0;im<27;im++)
		txd[im]=0xaa;
	EnQueue(txd,27);
	
	delay_nms(1000);
	EnQueue(txd,27);
	
	while(flag_txd);
	transmit();
	while(flag_txd);
	transmit();
	while(flag_txd);
	transmit();*/

}

⌨️ 快捷键说明

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