?? rem_main.c
字號:
/*********************************************************************/
/* TMS320F2810 C Language File */
/* The C Language File For REM Main Function Version number: 1.0 */
/* */
/* File name : REM_main.c */
/* Date/Time created: Oct 27 2005 */
/* Author: Anakin.Lee */
/*********************************************************************/
#include <stdio.h>
#include <string.h>
#include "TMS320F2810_REG.h"
// Global symbols defined in the linker command file
extern unsigned int secureRamFuncs_loadstart;
extern unsigned int secureRamFuncs_loadend;
extern unsigned int secureRamFuncs_runstart;
#define CPUCLK 150000000 /* CPUCLK=150MHz */
#define TIMER0L 0x3A98 /* 定時器0的定時周期低位=3A98h */
#define TIMER0H 0x0 /* 定時器0的定時周期高位=0h */
#define UP 1
#define DOWN 2
#define RIGHT 3
#define LEFT 4
#define ESC 5
#define ENTER 6
#define VIDEO 7
#define PASSWORD 0 /* 口令 */
#define BAND 1 /* 波特率 */
#define STOP 2 /* 停止位1/2位 */
#define CHECK 3 /* 無/奇偶校驗 */
#define LONG 4 /* 數據長度7/8位 */
#define ADDRESS 5 /* 通信地址碼 */
#define AZ_CENTER 6 /* 判斷AZ順逆限位中心角度 */
#define EL_CENTER 7 /* 判斷EL上下限位中心角度 */
#define AZ_STEP 8 /* 方位手控步長選擇 */
#define EL_STEP 9 /* 俯仰手控步長選擇 */
#define POL_STEP 10 /* 極化手控步長選擇 */
#define POS_TAB 11 /* 存儲位置表首地址 */
unsigned int msec,programcyc,led_bit;
unsigned int t0int_flag; /* 聲明t0int_flag為定時中斷標志寄存器 */
unsigned int key_flag; /* 聲明key_flag為按鍵計數標志寄存器 */
unsigned int keyin_tf; /* 聲明keyin_tf為鍵入操作標志寄存器 */
unsigned int keyin_r[8]={2,0,0,0,0,0,0,0}; /* 定義含8個元素的數組,用于鍵入命令的緩存 */
unsigned int led_buf[32]={8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8}; /* 定義含20個元素的數組,用于顯示內容的緩存 */
//unsigned int led_buf[20]={8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8};
unsigned int fault_number[28]; /* 故障號存儲區 */
unsigned int az_speed; /* 方位速度 */
unsigned int el_speed; /* 俯仰速度 */
unsigned int pol_speed; /* 極化速度 */
unsigned int antenna_dir; /* 旋轉方向寄存器 */
unsigned long fault_error; /* 定義32位的故障錯誤標志寄存器fault_error */
long az_position; /* 天線方位位置緩存 */
long az_object; /* 天線方位目標位置 */
long el_position; /* 天線俯仰位置緩存 */
long el_object; /* 天線俯仰目標位置 */
int pol1_position; /* 天線極化1位置緩存 */
int pol1_object; /* 極化1目標位置 */
int pol2_position; /* 天線極化2位置緩存 */
int pol3_position; /* 天線極化3位置緩存 */
int pol4_position; /* 天線極化4位置緩存 */
int all_R0; /* 通用緩存0~3 */
int all_R1;
int all_R2;
int all_R3;
unsigned int para_limit[22]={0,9999,2400,38400,1,2,1,3,7,8,0,120,0,35999,0,8999,1,100,1,100,1,100}; /* 參數數值限制 */
int table[128]; /* 定義含128個元素的數組,用于保存參數及位置表 */
/**********************************/
/**** Subprogram Function ****/
/**********************************/
extern void Delay_us(unsigned long); /* 該函數產生Xus的延時 */
extern void Vector_Table_Copy(void); /* 該函數將PIE中斷向量表拷貝進PIE中斷向量RAM區 */
extern void Flash_Reg_Modify(void); /* 該函數用于配置Flash寄存器 */
/**** Mod Function ****/
int mod(unsigned long x,int y) /* 該函數求整數x的:個,十,百,千,萬....位的數字 */
{ unsigned long m;
int n;
do
{m=x/10;
n=x%10;
x=m;
y--;
}
while(y>=1);
return(n);
}
/**** Index Function ****/
unsigned long index(unsigned int x) /* 該函數用于求2的x次方 */
{ unsigned int j;
unsigned long i;
i=1;
if(x==0) ;
else
for(j=1;j<=x;j++) i=i*2;
return(i);
}
/**** Multiplication Function ****/
long mul(long x,long y)
{ long l;
l=x*y;
return(l);
}
/**** Fault Number Save Function ****/
unsigned int fault_number_func(void)
{ unsigned int a,m;
unsigned long n;
a=0;
for(m=4;m<=26;m++)
{n=index(m);
if((fault_error & n)!=0)
{fault_number[a]=m-4;
a++;
}
}
return(a);
}
/**** Read EEPROM Function ****/
void Read_eeprom(void) /* 該函數將EEPROM的0頁256B的8bit數讀出到0x400為首地址的RAM */
{ unsigned int shift,device_address,word_address,reg;
int m,n;
int *p;
p=&table[0]; /* 將參數表首地址賦給指針 */
device_address=0xA0; /* 第0位為0,表示寫 */
word_address=0x0;
shift=0x80;
*GPFDAT=*GPFDAT & 0xFFBF; /* 設置24C08的SDA腳為低電平 */ /*****************/
Delay_us(5); /* 產生START信號 */
*GPFDAT=*GPFDAT & 0xFF7F; /* 設置24C08的SCL腳為低電平 */ /*****************/
Delay_us(5);
for(n=7;n>=0;n--) /* 發送device_address */
{if((device_address & shift)==0)
*GPFDAT=*GPFDAT & 0xFFBF; /* SDA輸出0 */
else *GPFDAT=*GPFDAT | 0x40; /* SDA輸出1 */
*GPFDAT=*GPFDAT | 0x80; /* 設置24C08的SCL腳為高電平 */ /*******************/
Delay_us(5); /* 產生CLK時鐘信號 */
*GPFDAT=*GPFDAT & 0xFF7F; /* 設置24C08的SCL腳為低電平 */ /*******************/
Delay_us(5);
shift=shift/2; /* 即使移位控制位右移1位 */
}
EALLOW; /* 允許訪問 EALLOW 保護區域 */
*GPFDIR=*GPFDIR & 0xFFBF; /* 設置DSP的I/O腳為輸入,準備接收ACK信號 */
*GPFDAT=*GPFDAT | 0x80; /* 設置24C08的SCL腳為高電平 */ /************************/
Delay_us(5); /* 第9個時鐘產生ACK信號 */
*GPFDAT=*GPFDAT & 0xFF7F; /* 設置24C08的SCL腳為低電平 */ /************************/
Delay_us(5);
*GPFDIR=*GPFDIR | 0x40; /* 設置DSP的I/O腳為輸出 */
EDIS;
shift=0x80;
for(n=7;n>=0;n--) /* 發送word_address */
{if((word_address & shift)==0)
*GPFDAT=*GPFDAT & 0xFFBF; /* 即SDA輸出0 */
else *GPFDAT=*GPFDAT | 0x40; /* 即SDA輸出1 */
*GPFDAT=*GPFDAT | 0x80; /* 設置24C08的SCL腳為高電平 */ /*******************/
Delay_us(5); /* 產生CLK時鐘信號 */
*GPFDAT=*GPFDAT & 0xFF7F; /* 設置24C08的SCL腳為低電平 */ /*******************/
Delay_us(5);
shift=shift/2;
}
EALLOW; /* 允許訪問 EALLOW 保護區域 */
*GPFDIR=*GPFDIR & 0xFFBF; /* 設置DSP的I/O腳為輸入,準備接收ACK信號 */
*GPFDAT=*GPFDAT | 0x80; /* 設置24C08的SCL腳為高電平 */ /************************/
Delay_us(5); /* 第9個時鐘產生ACK信號 */
*GPFDAT=*GPFDAT & 0xFF7F; /* 設置24C08的SCL腳為低電平 */ /************************/
Delay_us(5);
*GPFDIR=*GPFDIR | 0x40; /* 設置DSP的I/O腳為輸出 */
EDIS;
device_address=0xA1; /* 第0位為1,表示讀 */
shift=0x80;
*GPFDAT=*GPFDAT & 0xFFBF; /* 設置24C08的SDA腳為低電平 */ /*********************/
Delay_us(5); /* 重新產生START信號 */
*GPFDAT=*GPFDAT & 0xFF7F; /* 設置24C08的SCL腳為低電平 */ /*********************/
Delay_us(5);
shift=0x80;
for(n=7;n>=0;n--) /* 發送device_address */
{if((device_address & shift)==0)
*GPFDAT=*GPFDAT & 0xFFBF; /* 即SDA輸出0 */
else *GPFDAT=*GPFDAT | 0x40; /* 即SDA輸出1 */
*GPFDAT=*GPFDAT | 0x80; /* 設置24C08的SCL腳為高電平 */ /*******************/
Delay_us(5); /* 產生CLK時鐘信號 */
*GPFDAT=*GPFDAT & 0xFF7F; /* 設置24C08的SCL腳為低電平 */ /*******************/
Delay_us(5);
shift=shift/2; /* 即使移位控制位右移1位 */
}
EALLOW; /* 允許訪問 EALLOW 保護區域 */
*GPFDIR=*GPFDIR & 0xFFBF; /* 設置DSP的I/O腳為輸入,準備接收ACK信號 */
*GPFDAT=*GPFDAT | 0x80; /* 設置24C08的SCL腳為高電平 */ /************************/
Delay_us(5); /* 第9個時鐘產生ACK信號 */
*GPFDAT=*GPFDAT & 0xFF7F; /* 設置24C08的SCL腳為低電平 */ /************************/
Delay_us(5);
EDIS;
for(m=0;m<=255;m++)
{reg=0;
shift=0x80;
for(n=7;n>=0;n--)
{*GPFDAT=*GPFDAT | 0x80; /* 設置24C08的SCL腳為高電平 */
Delay_us(5); /* 延時5us */
if((*GPFDAT & 0x40)>0)
reg=reg+1;
*GPFDAT=*GPFDAT & 0xFF7F; /* 設置24C08的SCL腳為低電平 */
Delay_us(5);
if(n!=0) reg=reg*2; /* 即使reg每次循環左移1位 */
}
if(m!=255)
{*GPFDAT=*GPFDAT | 0x80; /* 設置24C08的SCL腳為高電平 */ /************************/
Delay_us(5); /* 第9個時鐘產生ACK信號 */
*GPFDAT=*GPFDAT & 0xFF7F; /* 設置24C08的SCL腳為低電平 */ /************************/
Delay_us(5);
}
else
{EALLOW; /* 允許訪問 EALLOW 保護區域 */
*GPFDIR=*GPFDIR | 0x40; /* 設置DSP的I/O腳為輸出,準備產生NO ACK信號 */
*GPFDAT=*GPFDAT | 0x40; /* 即SDA輸出1 */
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -