📄 esam.c.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 + -