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

📄 seeddm642_esam.c

📁 这是一个在DM642上测试ESAM程序的软件
💻 C
字号:
/********************************************************************/
/*  Copyright 2004 by SEED Incorporated.							*/
/*  All rights reserved. Property of SEED Incorporated.				*/
/*  Restricted rights to use, duplicate or disclose this code are	*/
/*  granted through contract.									    */
/*  															    */
/********************************************************************/


#include "seeddm642.h"
#include "seeddm642_esam.h"

//---------Global constants---------
//Maximum count value
#define TIMER_CNT  20

//Timer control register (CTL)
Uint32 TimerControl = 
			
	TIMER_CTL_RMK
	(
		TIMER_CTL_SPND_EMUSTOP,
  		TIMER_CTL_INVINP_NO, 		// TINP inverter control(INVINP)
  		TIMER_CTL_CLKSRC_CPUOVR8,	// Timer input clock source (CLKSRC)
		TIMER_CTL_CP_PULSE, 		// Clock/pulse mode(CP)
		TIMER_CTL_HLD_YES, 			// Hold(HLD)
		TIMER_CTL_GO_NO, 			// Go bit(GO)-
									//   resets & starts timer counter
		TIMER_CTL_PWID_ONE, 		// Pulse width(PWID)-
									//   used only in pulse mode
		TIMER_CTL_DATOUT_0, 		// Data output (DATOUT)
		TIMER_CTL_INVOUT_NO, 		// TOUT inverter control (INVOUT) 
		TIMER_CTL_FUNC_GPIO 		// Function of TOUT pin(FUNC)
	);
	
//---------Function prototypes---------
void TimerEventHandler(void);


//---------Global data definition---------
TIMER_Handle hTimer1;
TIMER_Config myTimConfig;
Uint32 TimerEventId;
int cnt = 0;
Uint32 esamCnt = 0;
Bool cntfirst = TRUE;
Bool esam_rrdy = FALSE;
Bool esam_xrdy = FALSE;
Bool esam_wen  = FALSE;
Bool esam_dnew = FALSE;

/***********************************************************************/
/*																	   */
/*	seeddm642_esam_open												   */
/*		描述:	初始化定时器,为读写ESAM进行初始化					   */
/*      参数:  无													   */
/*      返回:  无													   */
/*																	   */
/***********************************************************************/
void seeddm642_esam_open()
{ 
	//Open TIMER1 device, and reset it to power-on default state
	hTimer1 = TIMER_open(TIMER_DEV1, TIMER_OPEN_RESET);
	//Obtain the event ID for the timer device
	TimerEventId = TIMER_getEventId(hTimer1);
	//Map TIMER events to physical interrupt number
	IRQ_map(TimerEventId, 14);
	//Map External int4 to physical interrupt number
	IRQ_map(IRQ_EVT_EXTINT4,4);
	//Reset the timer events
	IRQ_reset(TimerEventId);
    IRQ_reset(IRQ_EVT_EXTINT4);
	//---------Configure the timer devices---------	
	//Start count value at zero
	myTimConfig.cnt = 0x0;
	//Use predefined control value  */
	myTimConfig.ctl = TimerControl;	
	//Set period,周期为(1/9600)/2
	myTimConfig.prd = 0xF42;

	IRQ_globalEnable();
	//Enable the timer events(events are disabled while resetting)
	IRQ_enable(TimerEventId);
	IRQ_enable(IRQ_EVT_EXTINT4);
}
/***********************************************************************/
/*																	   */
/*	seeddm642_esam_reset 											   */
/*		描述:	使ESAM卡复位										   */
/*      参数:  无													   */
/*      返回:  无													   */
/*																	   */
/***********************************************************************/
void seeddm642_esam_reset()
{
	//将复位信号置低,ESAM处于复位状态
	SEEDDM642_rset(SEEDDM642_ESAMW, 0x0);
	//延时1ms
	SEEDDM642_waitusec(5000);
	//将复位信号置高,ESAM脱离复位状态
	SEEDDM642_rset(SEEDDM642_ESAMW, 0x4);
}
/***********************************************************************/
/*																	   */
/*	seeddm642_esam_read 											   */
/*		描述:	读取ESAM的数据										   */
/*      参数:  src  :接收数据缓冲区								   */
/*              length :接收到的数据的个数                             */
/*      返回:  1:无新数据产生										   */
/*				2:有新数据产生                                         */
/*				3:接收错误										       */
/*																	   */
/***********************************************************************/
int seeddm642_esam_read(Uint32 src, Uint32 length )
{
	Uint8 *pdst;
	Uint8 *plength;
	Uint8 esamdata = 0;
	Uint8 esambit  = 0;
	Uint8 esamcheck = 0;
	Uint8 esamcount =0;
    Uint32 i;
    Uint32 n= 0;
    
    /* Establish ricieve pointer */
    pdst = (Uint8 *)src;
    plength = (Uint8 *)length;
    *plength = 0;
    //打开中断
	IRQ_enable(IRQ_EVT_EXTINT4);
	//将IO口配置成为输入模式
	SEEDDM642_rset(SEEDDM642_ESAMW, 0x4);
	//如果读取标志置1,读取数据的一个BIT,共读9次,拼成一个字节
	//第九个BIT为偶较验位
	while(1)
	{
		if(esam_dnew == FALSE)
		{
			//超时即数据接收完成,再无新数据产生
			n++;
			if(n == 1000)
			{
				n = 0;
				esamCnt++;
			}		
			if(esamCnt == 300)
			{
				esamCnt = 0;
				if(esamcount ==0)
				{
					return 1;//无数据接收到
				}
				else
				{
					*plength = esamcount;
					return 2;
				}
			} 
		}
		else
		{
			//有新数据的产生,启动计数器
			esam_dnew = FALSE;			
			//记数重新开始
			esamCnt = 0;
			for(i = 0;i<8;i++)
			{
				while(esam_rrdy == FALSE){}
				esam_rrdy = FALSE;
				esambit = SEEDDM642_rget(SEEDDM642_ESAMR);
				esamcheck = esamcheck + (esambit & 0x1);
				esamdata = esamdata + ((esambit & 0x1)<<i);
			}
			/*读较验位*/
			while(esam_rrdy == FALSE){}
			esam_rrdy = FALSE;
			esambit = SEEDDM642_rget(SEEDDM642_ESAMR);
			esamcheck = esamcheck + (esambit & 0x1);
			if((esamcheck & 0x1) == 1)
			{
				return 0;
			}
			*pdst++ = esamdata;
			esamcount++;
			esamdata = 0;
			esamcheck = 0;
			esambit = 0;
			//停止计数器
			TIMER_pause(hTimer1);
			//打开中断
			IRQ_reset(IRQ_EVT_EXTINT4);
			IRQ_enable(IRQ_EVT_EXTINT4);
		}			
	}		
}
/***********************************************************************/
/*																	   */
/*	seeddm642_esam_write 											   */
/*		描述:	写入ESAM的数据										   */
/*      参数:  src  :接收数据缓冲区								   */
/*              length :发送的数据的个数                               */
/*      返回:  无													   */
/***********************************************************************/
void seeddm642_esam_write(Uint32 src, Uint32 length)
{
	Uint32 i,j,k;
	Uint8 esam_xd;
	Uint8 esam_xbit;
	Uint8 esam_xcheck = 0;
	Uint8 *pdst;
	//使能写操作
	esam_wen = TRUE;
	/* Establish ricieve pointer */
    pdst = (Uint8 *)src;
	//禁止ESAM中断
	IRQ_disable(IRQ_EVT_EXTINT4);
	//启动计数器
	TIMER_config(hTimer1, &myTimConfig);
	//Start the timers
	TIMER_start(hTimer1);
	
	/*发送数据*/
	for(i = 0;i<length;i++)
	{
		esam_xd = *pdst++;
		/*将ESAMIO置为高电平*/
		SEEDDM642_rset(SEEDDM642_ESAMW, 0x7);
		/*延时一段时间,做为两个字节间的间隔*/
		for(k= 0;k<4;k++)
		{
			while(esam_xrdy ==FALSE){}
			esam_xrdy = FALSE;	
		}
		/*发出起始位*/
		while(esam_xrdy ==FALSE){}
		esam_xrdy = FALSE;
		SEEDDM642_rset(SEEDDM642_ESAMW, 0x6);
		for(j = 0; j<8;j++)
		{
			while(esam_xrdy ==FALSE){}
			esam_xrdy = FALSE;
			esam_xbit = (esam_xd >>j) & 0x1;
			esam_xcheck = esam_xcheck + esam_xbit;
			SEEDDM642_rset(SEEDDM642_ESAMW, (0x6 + esam_xbit));
		}
		//设置偶较验位
		while(esam_xrdy ==FALSE){}
		esam_xrdy = FALSE;
		if((esam_xcheck & 0x1)==0)
		{
			SEEDDM642_rset(SEEDDM642_ESAMW, 0x6);
		}
		else
		{
			SEEDDM642_rset(SEEDDM642_ESAMW, 0x7);
		}
		while(esam_xrdy ==FALSE){}
		esam_xrdy = FALSE;
		SEEDDM642_rset(SEEDDM642_ESAMW, 0x7);			
	}
	//停止计数器
	TIMER_pause(hTimer1);
	//禁止写
	esam_wen = FALSE;
}
//---------Subroutine definition---------

//Function called from TIMER1 ISR. Just increments the count by
//  one each time it enters this function. Exit from the program
//  after certain count value is reached.
void TimerEventHandler(void)
{
	//Process timer event here
	if(esam_wen ==TRUE)
	{
		cnt++;
		if(cnt == 2)
		{
			cnt = 0;
			esam_xrdy = TRUE;
		}  	
	}
	else
	{
		if(cntfirst == TRUE)
		{
			cnt++;
			if(cnt ==3)
			{
				esam_rrdy = TRUE;
				cntfirst = FALSE;
				cnt= 0;
			}	
		}
		else
		{
			cnt++;
			if(cnt == 2)
			{
				cnt = 0;
				esam_rrdy = TRUE;
			}  
		}
	}
}

//ISR to service TIMERINT1. 
//  vecs_dm642.asm must be modified to include c_int14 entry.
interrupt void c_int14(void)    
{
	TimerEventHandler();
	return;
}
//ISR to service EXTERN INT1. 
//  ves_dm642.asm must be modified to include c_int04 entry.
interrupt void c_int04(void)    
{
	//禁止ESAM中断
	IRQ_disable(IRQ_EVT_EXTINT4);
	//设置有新的数据的标志
	esam_dnew = TRUE;
	cntfirst = TRUE;
	//Reset the timer events
	IRQ_reset(TimerEventId);
	//Enable the timer events(events are disabled while resetting)
	IRQ_enable(TimerEventId);
	TIMER_config(hTimer1, &myTimConfig);
	//Start the timers
	TIMER_start(hTimer1);
	cnt = 0;
	return;
}

⌨️ 快捷键说明

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