📄 sci.c
字号:
/*******************************************
*SCI.c
*Author:echo
********************************************/
//头文件
#include <string.h>
#include "SCI.h"
#include <hidef.h> /* for EnableInterrupts macro */
#include <MC9S08GB60.h> /* include peripheral declarations */
#include "wait.h"
#include "FLASH.h"
#include "GPIO.h"
#include "main.h"
//全局变量
//wpj,串口1
UINT8 SciRxBuf[SCI_RX_BUF_TC]={0};
UINT8 volatile SciRxPtr=0;
//UINT8 volatile SciRxLen=0;
UINT8 SciTxBuf[SCI_TX_BUF_TC]={0};
UINT8 volatile SciTxPtr=0;
UINT8 volatile SciTxLen=0;
UINT8 volatile SciTxFlag=0;
UINT8 volatile RxTimeoutFlag=0; //接收超时包完成
extern UINT8 FLASHBUFFER[20];
extern UINT8 Flag_P;
extern UINT8 Flag_S;
//wxy ,串口2
UINT8 SciRxBufZb[SCI_RX_BUF_ZB]={0};
UINT8 Sci2RxPtr=0;
char Rx2Status=0;
UINT8 PrepareTime=0;
UINT8 PrepareTimeFlag=0;
UINT8 GoTime=0;
UINT8 GoTimeFlag=0;
UINT8 RingTime=0;
UINT8 RingTimeFlag=0;
UINT8 HangTime=0;
UINT8 HangTimeFlag=0;
UINT8 LostCount=0;
UINT8 LostAlarmBuff[15]={0};
UINT8 PowerCount=0;
UINT8 PowerAlarmBuff[15]={0};
UINT8 MoveCount=0;
UINT8 MoveAlarmBuff[15]={0};
UINT8 MasterCount=0;//用来标记有ZIGBEE报警
UINT8 MasterPowerLoss=0;//用来标记有主机掉电
UINT8 AlarmTime=0;
UINT8 first = 1;
void SCIInit(void){
/* Initial SCI1*/
//16M外部晶振,8M总线频率
ICGC1_RANGE = 1;
ICGC1_REFS = 1;
ICGC1_CLKS1 = 1;
ICGC1_CLKS0 = 1;
ICGC1_OSCSTEN = 0;
ICGC2_MFD2 = 0;
ICGC2_MFD1 = 1;
ICGC2_MFD0 = 0;
ICGC2_RFD2 = 0;
ICGC2_RFD1 = 0;
ICGC2_RFD0 = 0;
SCI1BDH = 0x00;
// SCI1BDL = baud38400;
SCI1BDL = MyBaud9600 ;
// SCI1BDL = baud4800 ;
// SCI1BDL = baud2400;
SCI2BDH = 0x00;
// SCI2BDL = baud38400;
SCI2BDL = MyBaud9600 ;
// SCI2BDL = baud4800 ;
// SCI1BDL = baud2400;
SCI1C2 = 0x2C; /*允许接收中断,允许发送器,允许接收器*/
SCI2C2 = 0x2C; /*允许接收中断,允许发送器,允许接收器*/
}
//中断方式接收zigbee模块返回的信息
interrupt void SCI2(void){
unsigned char status,dummy,datatemp;
do{
status = SCI2S1;
} while ((status & 0x20) == 0);
//Check for Errors (Framing, Noise, Parity)
if ((status & 0x07) != 0) {
dummy = SCI2D;
return;
}
//Good Data.
datatemp = SCI2D;
if(Sci2RxPtr >= SCI_RX_BUF_ZB) {
return;
}
if((Sci2RxPtr == 0 && datatemp == 0xC0)||(Sci2RxPtr != 0 && datatemp != 0xC0)){
SciRxBufZb[Sci2RxPtr] = datatemp; // load SCI register to data
Sci2RxPtr++;
}
if(Sci2RxPtr == SCI_RX_BUF_ZB) {
Rx2Status=SUCCESS;
}
}
/*向连接PC机的SCI传送一个byte,使用串口1*/
void Transmit_SCI_Byte(UINT8 T_Byte){
while (!SCI1S1_TDRE); // ensure Tx data buffer empty
SCI1D = T_Byte; // load data to SCI2 register
while (!SCI1S1_TC); // wait for Tx complete
}
//向IPlink 1221-2164模块发送一个字符,使用串口2
void Transmit_SCI2_Byte(UINT8 T_Byte2){
while (!SCI2S1_TDRE); // ensure Tx data buffer empty
SCI2D = T_Byte2; // load data to SCI2 register
while (!SCI2S1_TC); // wait for Tx complete
}
//向IPlink 1221-2164模块发送一串字符
void Transmit_SCI2_Str(UINT8 *pStr,UINT8 nLen)
{
int i;
Sci2RxPtr =0;
for (i=0; i<nLen; i++) {
Transmit_SCI2_Byte(pStr[i]);
}
}
/**********************************************************
* 函数名: Transmitt
* 作者: zgq
* 时间: 2007.12.7
* 版本号: 1.0
* 功能:
* 修改时间
*
*************************************************************/
void UARTTransmitt(void) {
//Feed_SoftDog(); //喂软狗
Feed_HardDog();
while(SciTxFlag == TRANSMITT_ING);
DelayMS(5);
if(SciTxFlag == TRANSMITT_READY){
SCI1D = SciTxBuf[0];
SCI1C2_TCIE = 1; //允许发送中断
SciTxFlag = TRANSMITT_ING;
}
}
//从串口1接收数据的中断程序,tc35
interrupt void VScirx(void){
UINT8 u8status;
// ensure Rx data buffer is full
do{
u8status = SCI1S1;
} while ((u8status & 0x20) == 0);
DisableInterrupts;
LED9ON();
// load SCI register to data buffer
if(SciRxPtr >= SCI_RX_BUF_TC) return;
SciRxBuf[SciRxPtr] = SCI1D;
SciRxPtr++;
RxTimeoutFlag = 1;
LED9OFF();
EnableInterrupts;
}
//通过串口1向tc35发送数据的中断程序
interrupt void VScitx(void) {
UINT8 u8status;
/////////////////////////////////////////////////////////////
/////由于不明原因(通过查询手册感觉是芯片设计原因),////////////
/////如果打开发送中断将会不断有数据进入,因此只在需要发送时打///////
/////开中断允许,发送完成后关闭 /////////////////////////////////
// ensure Tx complete
do{
u8status = SCI1S1;
}while ((u8status & 0x40) == 0);
LED9ON();
//测试
/*
for(;;){
if(SciTxPtr >= SciTxLen)SciTxPtr=0;
SCI1D = SciTxBuf[SciTxPtr];
SciTxPtr++;
}*/
//发送下一个字节
if(SciTxPtr < SciTxLen){
SCI1D = SciTxBuf[SciTxPtr];
SciTxPtr++;
SciTxFlag = TRANSMITT_ING;
}else{
DelayMS(5);
SCI1C2_TCIE = 0; //关闭发送中断
SciTxPtr = 1;
SciTxFlag = TRANSMITT_READY;
LED9OFF();
}
}
/********************************************************
* 函数名: 等待PC的配置命令
* 作者:wpj
* 时间:2008.5.10
* 功能:根据与PC相连的串口接收下来的包,对Flash进行读写
*********************************************************/
void ProcessPcLoop(void)
{
UINT8 i;
if(RxTimeoutFlag >= RX_TIMEOUT)
{ //确定收了一个整包
BELL=0;
RxTimeoutFlag = 0;
SciRxPtr = 0;
//if((((SciRxBuf[0] < 0x5A)&&(SciRxBuf[0]>=0x50))||(SciRxBuf[0]==0x5F))||(SciRxBuf[0]==0x60))//有开始命令
if(((SciRxBuf[0] < 0x5A)&&(SciRxBuf[0]>=0x50))||(SciRxBuf[0]==0x5F))//没有开始命令
{
WriteConfig(&SciRxBuf[7], SciRxBuf[6], SciRxBuf[0]);
}
else if((SciRxBuf[0]<0x5F)&&(SciRxBuf[0]>0x59))
{
WriteAlarmInfo(&SciRxBuf[7], SciRxBuf[6], SciRxBuf[0]);
}
for(i=0;i<SCI_TX_BUF_TC;i++){
SciTxBuf[i]=0;
}
for(i=0;i<SCI_RX_BUF_TC;i++){
SciRxBuf[i]=0;
}
}
}
void MessagePrepare(void)
{
UINT16 i;
BELL = 1;
if(first != 1) //第一次发送,不用等
{
//Feed_SoftDog(); //喂软狗
while(SciTxFlag==TRANSMITT_ING);//等待上一次发送完毕
while(RxTimeoutFlag < 3);
RxTimeoutFlag=0;
Feed_HardDog();
}
//Feed_SoftDog(); //喂软狗
for(i=0;i<SCI_TX_BUF_TC;i++){
SciTxBuf[i]=0;
}
for(i=0;i<SCI_RX_BUF_TC;i++){
SciRxBuf[i]=0;
}
(void)strcpy(SciTxBuf,"AT+CMGS=069\r");
SciTxLen = 12;
SciRxPtr = 0;
UARTTransmitt(); //串口发送
}
void MessageGo(UINT8 cmd, UINT8 TelNum)
{
UINT8 i,k,flag;
BELL = 0;
while(SciTxFlag==TRANSMITT_ING);//等待上一次发送完毕
//Feed_SoftDog(); //喂软狗
while(RxTimeoutFlag < 3);
RxTimeoutFlag=0;
Feed_HardDog();
do{
flag=0;
for(i=0;i<SCI_RX_BUF_TC;i++) {
if(SciRxBuf[i]== '>')//再写短信内容
{
//Feed_SoftDog(); //喂软狗
flag=1;
for(i=0;i<SCI_TX_BUF_TC;i++){
SciTxBuf[i]=0;
}
switch(cmd){
case LOST_ALARM:
strcpy(SciTxBuf,"08916800000000000011000D91680000000000000008A736000000000000000000000000000000005B50673A4E225931002000200020002000200020002000200020002000200020002000200020");
/////////////////填地点///////////////
ReadFlash(ALARM_INFO1);
for(i=0;i<24;i++)
{
SciTxBuf[48+i] = FLASHBUFFER[i];
}
/////////////////填个数///////////////
for(i=0;i<8;i++)
{
SciTxBuf[72+i] = 0x30;
}
SciTxBuf[74] = 0x33;
SciTxBuf[78] = 0x33;
if(LostCount >= 10)
{
SciTxBuf[75] = 0x31;
SciTxBuf[79] = LostCount - 0x0A + 0x30;
}
else
{
SciTxBuf[75] = 0x30;
SciTxBuf[79] = LostCount + 0x30;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -