?? main_back1.c
字號:
/****************************************Copyright (c)**************************************************
** 蘇州江海通訊發展實業有限公司
** 設計三室
**
**--------------文件信息--------------------------------------------------------------------------------
**文 件 名: main.c
**創 建 人: 黃凱
**最后修改日期: 2006年11月16日
**描 述: 27號機控制軟件
**操作系統版本:uc/os-II v2.52
**
**--------------歷史版本信息----------------------------------------------------------------------------
** 創建人: 黃凱
** 版 本: v1.0
** 日 期: 2006年11月10日
** 描 述: 原始版本
**
**------------------------------------------------------------------------------------------------------
** 修改人: 黃凱
** 版 本: v1.1
** 日 期: 2006年11月14日
** 描 述: 按照標準c格式修改書寫格式
**
**--------------當前版本修訂------------------------------------------------------------------------------
** 修改人: 黃凱
** 日 期: 2006年11月17日
** 描 述:
**
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#include "config.h"
#include "stdlib.h"
#define FreSaveAddr 3
#define PowSaveAddr 5
#define FreConvAddr 20
#define TASK_STK_SIZE 64
#define Buffer_Size 64
#define test_on() { IO1SET = 1<<24; }
#define test_off() { IO1CLR = 1<<24; }
typedef struct _flags {
unsigned warn : 1; //告警標志(0: 正常; 1: 告警)
unsigned key : 1; //鍵盤狀態(0: 按下; 1: 釋放)
unsigned test : 1; //環測標志(0: 拆環; 1: 環測)
unsigned fre : 1; //頻率改變(0: 未變; 1: 改變)
unsigned pow : 1; //功率改變(0: 未變; 1: 改變)
unsigned test_change : 1; //環測事件(0: 無 ; 1: 有)
unsigned state : 1; //設備狀態(0: 定頻; 1: 跳頻)
unsigned commok : 1; //通信標志(0: 失敗; 1: 成功)
unsigned change : 1; //狀態改變(0: 未變; 1: 改變)
} BITS;
BITS flgs;
struct fre0 {
INT8U h;
INT8U l;
} fre ;
struct back0 {
INT8U ffre;
INT8U ppow;
} back ;
INT8U fre_char[41]= { //頻率控制字
0X00,0X01,0X02,0X03,0X04,0X05,0X06,0X07,
0X08,0X09,0X0A,0X0B,0X0C,0X0D,0X0E,0X0F,
0X10,0X11,0X12,0X13,0X14,0X15,0X16,0X17,
0X18,0X19,0X1A,0X1B,0X1C,0X1D,0X1E,0X1F,
0X20,0X21,0X22,0X23,0X24,0X25,0X26,0X27,
0X28,
};
INT8U warn_info; //保存告警信息
INT8U fre_value; //保存頻率信息
INT8U pow_value; //保存功率信息
INT8U test_value; //保存環測信息
INT8U fre_char2[Buffer_Size];//保存跳頻表
INT32U fre_cnt; //保存跳頻計數
OS_STK SendDataStk[TASK_STK_SIZE];
OS_STK ReceDataStk[2*TASK_STK_SIZE];
OS_STK InfoGatherStk[TASK_STK_SIZE];
OS_STK FreConversionStk[TASK_STK_SIZE];
OS_STK Each10sCommStk[TASK_STK_SIZE];
OS_EVENT *SendMbox;
OS_EVENT *ReceMbox;
OS_EVENT *FreSem;
void SendData(void *pdata);
void ReceData(void *pdata);
void FreConversion(void *pdata);
void InfoGather(void *pdata);
void Each10sComm(void *pdata);
void CtrlOut(INT8U ctrl_no);
void LedRefresh(INT8U fresh_no);
void LpcInitialize(void);
void KeyDecode(INT8U key_value);
void FrePowChange(void);
void Eint3Exception(void);
void FreConverInfo(void);
void WarnInfo(void);
void KeyInfo(void);
void ReceDataDecode(INT8U *pp);
void I2cE2rom(INT8U SaveAddr, INT8U const *SaveData, INT8U SaveNo);
/*********************************************************************************************************
** 函數名稱: SendData
** 功能描述: 發送數據
** 輸 入: pdata 任務附加參數(指針)
** 輸 出: 無
** 全局變量: flag.commok
** 調用模塊: OSMboxPend
**
** 作 者: 黃凱
** 日 期: 2006年11月10日
**-------------------------------------------------------------------------------------------------------
** 修改人: 黃凱
** 日 期: 2006年12月06日
** 備 注:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void SendData(void *pdata){
INT8U err;
INT8U cnt;
INT8U *psd;
INT8U Sbuf[10];
uint16 x;
pdata = pdata;
while (1){
psd = (INT8U *)OSMboxPend(SendMbox, 0, &err); /* 接收數據 */
cnt = *psd + 4;
memcpy(Sbuf, psd, cnt);
flgs.commok = 0;
while (!flgs.commok){
err = 0x06;
UART_write(0, &err, 1, 3);
UART_read(0, &err, 1, 4);
if (err == 0x00){
psd = Sbuf;
Sbuf[6]=UART_write(0, psd, cnt, 3);
//UART_write(1, psd, cnt, 2);//debug
x=UART_read(0, &err, 1, 4);
Sbuf[7] = (uint8)(x &0x00ff);
Sbuf[8] = (uint8)( (x&0xff00)>>8);
Sbuf[9] =UART_write(1, Sbuf, 8, 3);//debug
if (err == 0x0f){
flgs.commok = 1;
break;
}
flgs.commok = 0;
OSTimeDly(20);
}
else
{
OSTimeDly(40);
}
}
psd = (INT8U *)0;
//U0IER = U0IER | 0x01;
}
}
/*********************************************************************************************************
** 函數名稱: ReceData
** 功能描述: 從UART0接收數據
** 輸 入: pdata 任務附加參數(指針)
** 輸 出: 無
** 全局變量: 無
** 調用模塊: GetCRC16
**
** 作 者: 黃凱
** 日 期: 2006年11月10日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void ReceData(void *pdata){
INT8U err;
INT8U Buf[Buffer_Size];
INT16U x;
INT16U rxlen;
INT16U buflen;
uint8 *pp;
pdata = pdata; /* 避免編譯警告 */
while (1){
do
{
Buf[0] = 0;
UART_read(0, Buf, 1, 0);
}while (Buf[0] != 0x06);
err = 0x00;
UART_write(0, &err, 1, 3);
UART_read(0, Buf, 1, 4); //receive length
//UART_read(0, &Buf[1], Buf[0]+3, 15);
//**
x = 0;
buflen = ((Buf[0]+3) > Buffer_Size) ? Buffer_Size : (Buf[0]+3);
pp = &Buf[1];
do
{
rxlen = UART_read(0, pp+x, buflen-x, 15);
x += rxlen;
} while ((buflen-x)>0);
/**/
UART_write(1, Buf, Buf[0]+4, 15);
if (GetCRC16(Buf,(INT16U)(Buf[0]+4)) == 0){
err = 0x0f;
UART_write(0, &err, 1, 3);
ReceDataDecode(Buf);
} else {
err = 0xff;
UART_write(0, &err, 1, 3);
}
}
}
/*********************************************************************************************************
** 函數名稱: FreConversion
** 功能描述: 跳頻服務程序
** 輸 入: pdata 任務附加參數(指針)
** 輸 出: 無
** 全局變量: 無
** 調用模塊: OSMboxCreate,OSSemCreate
**
** 作 者: 黃凱
** 日 期: 2006年11月10日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void FreConversion(void *pdata){
INT8U *cp;
INT8U err;
pdata = pdata;
LpcInitialize();
while(1){
OSSemPend(FreSem, 0, &err); /* 等待跳頻開始 */
//************
cp = fre_char2;
fre_value = *(cp + (fre_cnt % fre_char[0] + 1));
if (fre_cnt == 0xffffffff){
fre_cnt = 0;
} else {
fre_cnt++;
}
////CtrlOut(0x03);
/***************/
}
}
/*********************************************************************************************************
** 函數名稱: Each10sComm
** 功能描述: 每隔10s發送一次,來表征設備正在工作
** 輸 入: pdata 任務附加參數(指針)
** 輸 出: 無
** 全局變量: 無
** 調用模塊: 無
**
** 作 者: 黃凱
** 日 期: 2006年11月10日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void Each10sComm(void *pdata){
INT8U err;
pdata = pdata ;
while (1){
OSTimeDly(10*OS_TICKS_PER_SEC);
err = 0x18;
UART_write(0, &err, 1, 3);
}
}
/*********************************************************************************************************
** 函數名稱: ReceDataDecode
** 功能描述: 處理接收到的數據
** 輸 入: pp: 接收數據的指針
** 輸 出: 無
** 全局變量: 無
** 調用模塊: 無
**
** 作 者: 黃凱
** 日 期: 2006年11月10日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void ReceDataDecode(INT8U *pp){
if (*(pp+1) == 0x0a){ //跳頻
*(pp + 1) = *pp;
memcpy(fre_char2, (pp + 1), (*pp+1)); //更新跳頻表
I2cE2rom(FreSaveAddr, (pp + 1), *pp);
UART_write(1, fre_char2, fre_char2[0], 15);
} else if (*(pp+1) == 0x0c){
if (*(pp+2) == 0xf1){ //test
flgs.test = 1;
pow_value = 1;
test_on();
}
if (*(pp+2) == 0xf2){ //work
flgs.test = 0;
pow_value = back.ppow;
test_off();
}
LedRefresh(0x0f);
//CtrlOut(0x0f);
}
}
/*********************************************************************************************************
** 函數名稱: I2cE2rom
** 功能描述: E2rom燒寫
** 輸 入: SaveAddr:數據保存地址;
** SaveData:指向被保存數據的指針;
** SaveNo :需保存數據的個數
** 輸 出: 無
** 全局變量: 無
** 調用模塊: 無
**
** 作 者: 黃凱
** 日 期: 2006年11月10日
**-------------------------------------------------------------------------------------------------------
** 修改人: 黃凱
** 日 期: 2006年11月16日
** 備 注:改正CAT1025燒寫時地址錯誤
**-------------------------------------------------------------------------------------------------------
**
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void I2cE2rom(INT8U SaveAddr, INT8U const *SaveData, INT8U SaveNo){
INT8U i;
INT8U x;
INT8U y;
INT8U *ptr;
INT8U I2ctemp[17];
x = SaveNo / 16;
y = SaveNo % 16;
ptr = I2ctemp;
for (i=0; i<x; i++){
*ptr = SaveAddr + 16*i;
memcpy((ptr + 1), (SaveData + 16*i + 1), 17);
I2cWrite(CAT1025, I2ctemp, 17); //write eerom
OSTimeDly(OS_TICKS_PER_SEC / 100 + 1);
}
if (y != 0){
*ptr = SaveAddr + 16*x;
memcpy((ptr + 1), (SaveData + 16*x +1), y);
I2cWrite(CAT1025, I2ctemp, (y + 1));
OSTimeDly(OS_TICKS_PER_SEC / 100 + 1);
}
}
/*********************************************************************************************************
** 函數名稱: LpcInitialize
** 功能描述: 芯片初始化
** 輸 入: 無
** 輸 出: 無
** 全局變量: 無
** 調用模塊: 無
**
** 作 者: 黃凱
** 日 期: 2006年11月10日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void LpcInitialize(void){
INT8U cp = 0;
FreSem = OSSemCreate(NULL);
SendMbox = OSMboxCreate(NULL);
ReceMbox = OSMboxCreate(NULL);
if (SendMbox == NULL){
while (1);
}
//**********************
if (FreSem == NULL) {
while (1);
}
if (ReceMbox == NULL) {
while (1);
}
/*******************/
TargetInit();
UART_Init(1);
UART_open(1, 19200, 8, 'n', 0);
UART_Init(0);
UART_open(0, 9600, 8, 'n', 0);
PINSEL1 = (PINSEL1 & 0xcfffffff) | (1<<29);//P0.30 is used as EINT3
EXTMODE = 0X08;
EXTPOLAR = 0X08;
//IO0DIR = 0X3d233F00;
IO0DIR = 0X3d230000;
IO1DIR = 0X0F << 16;
IO1DIR |= 0X03 << 24;//p1.16:19,P1.24:25 output
cp = FreSaveAddr;
I2cRead(CAT1025, &fre_value, &cp, 1, 1);
cp = PowSaveAddr;
I2cRead(CAT1025, &pow_value, &cp, 1, 1);
if ((fre_value > 0x29) || (fre_value == 0x00))
{
fre_value = 0x01;
}
if (pow_value > 0x04)
{
pow_value = 0x01;
}
back.ffre = fre_value;
back.ppow = pow_value;
////CtrlOut(0x03);
LedRefresh(0x03);
//CtrlOut(0x0f);
LedRefresh(0x0f);
cp = FreConvAddr;
I2cRead(CAT1025, fre_char2, &cp, 1, 1); //length
cp = FreConvAddr +1;
I2cRead(CAT1025, &fre_char2[1], &cp, 1, fre_char2[0]);
}
/*********************************************************************************************************
** 函數名稱: FreConverInfo
** 功能描述: 定頻,跳頻判斷
** 輸 入: 無
** 輸 出: 無
** 全局變量: 無
** 調用模塊: 無
**
** 作 者: 黃凱
** 日 期: 2006年11月10日
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -