?? esam.c
字號:
/*****************************************************************************
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+UART_9600BPS/2);
}
interrupt void extern_int(void)
{
if(delay_time_flag == 1)
{
clock_count++;
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -