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

📄 esam.c.bak

📁 dsp常见的扩展外设的框架程序和测试程序
💻 BAK
字号:
/*****************************************************************************
	FILENAME:	ESAM.C
	DESIGNER:	戴展波
	DATE:		2004/09/25
******************************************************************************/

#include <stdio.h>
#include <csl.h>
#include <csl_irq.h>
#include <csl_chip.h>
#include <csl_gpio.h>

#include "ESAM.h"

static Uint32 gpgc = GPIO_GPGC_RMK(
	GPIO_GPGC_GP0M_GPIOMODE,
	GPIO_GPGC_GPINT0M_DEFAULT,
	GPIO_GPGC_GPINTPOL_DEFAULT,
	GPIO_GPGC_LOGIC_DEFAULT,
	GPIO_GPGC_GPINTDV_DEFAULT
);

static Uint32 gpen = GPIO_GPEN_OF(0x8840);
static Uint32 gpdir = GPIO_GPDIR_OF(0x0800);
static Uint32 gpval = GPIO_GPVAL_OF(0x0800);
static Uint32 gphm = GPIO_GPHM_RMK(GPIO_GPHM_GPXHM_DEFAULT);
static Uint32 gplm = GPIO_GPLM_RMK(GPIO_GPLM_GPXLM_DEFAULT);
static Uint32 gppol = GPIO_GPPOL_RMK(GPIO_GPPOL_GPINTXPOL_OF(0x00));

GPIO_Handle hGpio;

unsigned int count = 0;

void main()
{
	//初始化CSL
	CSL_init();
	//关闭总中断
	IRQ_globalDisable();
	//打开GPIO句柄
	hGpio = GPIO_open(GPIO_DEV0,GPIO_OPEN_RESET);
	//GPIO配置
	GPIO_configArgs(hGpio,gpgc,gpen,gpdir,gpval,gphm,gplm,gppol);
	//初始化参数
	Init_Variable();
	//设置中断矢量表地址
	IRQ_setVecs(vectors);
	//设置中断通道
	IRQ_map(IRQ_EVT_EXTINT6,6);
	//中断使能
	IRQ_enable(IRQ_EVT_EXTINT6);
	//使能NMI中断
    	IRQ_nmiEnable();
    	//打开总中断
    	IRQ_globalEnable();
    	
    	//复位ESAM
    	Reset_Esam(&signal[0]);

	for(;;)
	{

	}
	
}

/**********************************************************************
	函数名:	Init_Variable()
	功能:		初始化ESAM参数
	参数:		无
	返回值:	无
**********************************************************************/

void Init_Variable(void)
{
	delay_time_flag = 0;
}

/**********************************************************************
	函数名:	Reset_Esam()
	功能:		对Esam卡复位,并取得返回的复位应答信息
	参数:		DataPtr:指向存放序列号的数组的指针
	返回值:	返回
**********************************************************************/

unsigned int Reset_Esam(unsigned int *DataPtr)
{
	unsigned int i;
	//复位PIN为低
	GPIO_pinWrite(hGpio,GPIO_PIN11,0);
	//启动200CLK记数
	Delay_Time(200);
	//打开ESAM_IO控制方向为输入
	GPIO_pinDirection(hGpio,GPIO_PIN15,GPIO_INPUT);
	//启动200个CLK记数
	Delay_Time(200);
	//ESAM的RST退出
	GPIO_pinWrite(hGpio,GPIO_PIN11,1);
	//由于ESAM的I/O应答在RST信号上升之后的400~40000个时钟周期开始
	//启动500个时钟记数
//	Delay_Time(400);
	//读ESAM复位应答信号
	Read_ESAM(response_data,13);
	//
	for(i = 0; i < 8; i++)
	{
		*(DataPtr+i) = response_data[i + 5];
	}
	//获取状态字
	return 0x9000;
}

void Delay_Time(unsigned int count)
{
	delay_time_flag = 1;
	clock_count = 0;
	//判断延时时间到否
	do{
	}while(clock_count != count);
	//
	delay_time_flag = 0;
}

void Read_ESAM(unsigned int *data,unsigned int length)
{
	unsigned int i;
	for(i = 0; i < length; i++)
	{
		//
		UART_Data_Read();
		*(data+i) = return_value;
	}
}

void UART_Data_Read(void)
{
	unsigned int i,temp = 0;
	//打开ESAM_IO控制方向为输入
	GPIO_pinDirection(hGpio,GPIO_PIN15,GPIO_INPUT);
	//延时
	for(i = 0; i < 100; i++);
	//判断ESAM的IO口是否为HIGH
	if(GPIO_pinRead(hGpio,GPIO_PIN15) == 0)
	{
		for(;;);
	}
	//等待ESAM的IO口变低
	do{
	}while(GPIO_pinRead(hGpio,GPIO_PIN15) == 1);
	//UART通讯协议的START位,9600波特率记时开始
	Delay_Time(UART_9600BPS+UART_9600BPS/2);
	//读ESAM的数据
	for(i = 0; i < 8; i++)
	{
		//读
		if(GPIO_pinRead(hGpio,GPIO_PIN15) == 1)
		{
			temp = temp | (1 << i);
		}
		//延时
		Delay_Time(UART_9600BPS);
	}
	//判断是否为偶校验
	if(GPIO_pinRead(hGpio,GPIO_PIN15) == 0)
	{
		for(;;);
	}
	//延时
	Delay_Time(UART_9600BPS);
	//判断2个停止位
	if(GPIO_pinRead(hGpio,GPIO_PIN15) == 0)
	{
		for(;;);
	}
	//延时
	Delay_Time(UART_9600BPS);
	//判断停止位
	if(GPIO_pinRead(hGpio,GPIO_PIN15) == 0)
	{
		for(;;);
	}
	//延时
	Delay_Time(UART_9600BPS/2);
	//成功
	return_value = temp;
}

void Write_ESAM(unsigned int *data,unsigned length)
{
	unsigned int i;
	
	for(i = 0; i < length; i++)
	{
		write_value = *(data+i);
		UART_Data_Write(*(data+i));
	}
}

void UART_Data_Write(unsigned int data)
{
	unsigned int i,temp = 0;
	//打开ESAM_IO控制方向为输入
	GPIO_pinDirection(hGpio,GPIO_PIN15,GPIO_OUTPUT);
	//延时
	for(i = 0; i < 100; i++);
	//ESAM的IO口输出为HIGH
	GPIO_pinWrite(hGpio,GPIO_PIN15,1);
	//延时
	Delay_Time(100);
	//写开始位
	GPIO_pinWrite(hGpio,GPIO_PIN15,0);
	//延时
	Delay_Time(UART_9600BPS);
	//写数据
	for(i = 0; i < 8; i++)
	{
		temp = data >>(7-i);
		if((temp & 1) == 1)
		{
			GPIO_pinWrite(hGpio,GPIO_PIN15,1);
		}
		else
		{
			GPIO_pinWrite(hGpio,GPIO_PIN15,0);
		}
		//延时
		Delay_Time(UART_9600BPS);
	}
	//写PARITY位,偶校验
	GPIO_pinWrite(hGpio,GPIO_PIN15,1);
	//延时
	Delay_Time(UART_9600BPS);
	//2个停止位
	GPIO_pinWrite(hGpio,GPIO_PIN15,1);
	Delay_Time(UART_9600BPS);
	GPIO_pinWrite(hGpio,GPIO_PIN15,1);
	Delay_Time(UART_9600BPS);
}

interrupt void extern_int(void)
{
	if(delay_time_flag == 1)
	{
		clock_count++;
	}
}

⌨️ 快捷键说明

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