?? modem.c
字號:
/**---------------------版權 (c)----------------------------------------------------------***
*** 作者:顏章健 ***
*** 郵件:jenkinyan@163.com ***
*** ***
***---------------------File Info---------------------------------------------------------***
*** 創 建 人: 顏章健 ***
*** 創建日期: 2008-03-08 ***
*** 創建版本: ***
*** 文件描述: ***
***---------------------------------------------------------------------------------------***
*** 修 訂 人: ***
*** 修訂日期: ***
*** 修訂版本: ***
*** 修訂描述: ***
***---------------------------------------------------------------------------------------**/
#include "config.h"
// 全局變量
PHY_LAYER PhyLayer;
//static uint8 EventUp;
/********************************************************************************************
*** 函數名稱: StrToInt
*** 函數描述: 字符串轉換成32位整形變量
*** 入 口: s:字符串
*** 出 口: 轉換數值
********************************************************************************************/
/*
static uint32 StrToInt(char *s)
{
const uint32 tab[10] = {1,10,100,1000,10000,100000,1000000,10000000,100000000,1000000000};
uint32 val = 0;
int8 i;
uint8 cnt,tmp;
char *bak;
bak = s;
while(*s)
{
tmp = *s++;
if((tmp < 0x30) || (tmp > 0x39)) return 0; // 字符無效
cnt++;
}
cnt--;
for(i=cnt; i>=0; i--)
{
tmp = (*bak++) - 0x30;
val = val + tmp * tab[i];
}
return val;
}*/
/********************************************************************************************
*** 函數名稱: Delay
*** 函數描述: 軟件延時
*** 入 口: t:延時參數
*** 出 口: 無
********************************************************************************************/
static void Delay(uint32 t) {while(--t);}
/********************************************************************************************
*** 函數名稱: ModemLinkOk
*** 函數描述: 檢查 MODEM 是否已建立載波連接
*** 入 口: 無
*** 出 口: 1:成功 0:失敗
********************************************************************************************/
uint8 ModemLinkOk(void)
{
if(IO0PIN & UART1_DCD) return 0;
else return 1;
}
/********************************************************************************************
*** 函數名稱: ModemSetBaud
*** 函數描述: 設置MODEM 波特率
*** 入 口: baud:波特率(單位:bps)
*** 出 口: 無
********************************************************************************************/
/*
static void Uart1SetBaud(uint32 baud)
{
uint16 Fdiv;
uint8 bak;
Fdiv = (Fpclk >> 4) / baud; // 計算波特率計數器
bak = U1LCR; // 備份 U1LCR
U1LCR = bak & 0x7f; // 允許訪問分頻因子寄存器
U1DLM = Fdiv >> 8; // 設置波特率計數器
U1DLL = Fdiv & 0xff; // 設置波特率計數器
U1LCR = bak; // 恢復U1LCR
}*/
/********************************************************************************************
*** 函數名稱: Uart1Init
*** 函數描述: UART1初始化
*** 入 口: baud:波特率(單位:bps)
*** 出 口: 無
********************************************************************************************/
void Uart1Init(uint32 baud)
{
uint16 Fdiv;
PINSEL0 = (PINSEL0 & (~(0x03<<16 )))|(0x01<<16); // P0.8 設置為 UART1 TXD
PINSEL0 = (PINSEL0 & (~(0x03<<18 )))|(0x01<<18); // P0.9 設置為 UART1 RXD
PINSEL0 = (PINSEL0 & (~(0x03<<20 )))|(0x00<<20); // P0.10 設置為 UART1 DTR (GPIO)
PINSEL0 = (PINSEL0 & (~(0x03<<22 )))|(0x00<<22); // P0.11 設置為 UART1 DCD (GPIO)
IO0DIR |= UART1_DTR; // DTR 設置為輸出
IO0DIR &= (~(UART1_DCD)); // DCD 設置為輸入
IO0SET = UART1_DTR; // 數據終端(UART1)準備好
U1LCR = 0x83; // DLAB=1,允許設置波特率
Fdiv = (Fpclk / 16) / baud; // 設置波特率
U1DLM = Fdiv / 256;
U1DLL = Fdiv % 256;
U1LCR = 0x03; // 設置為8,1,n 格式
U1IER = 0x01; // 僅允許 RBR 中斷
U1FCR = 0xc1; // 初始化FIFO,觸發點為14個字節
}
/********************************************************************************************
*** 函數名稱: ModemWriteByte
*** 函數描述: 發送單個字節數據
*** 入 口: dat: 要發送的數據
*** 出 口: 無
********************************************************************************************/
void ModemWriteByte(uint8 dat)
{
U1THR = dat;
while ((U1LSR & 0x40) == 0);
}
/********************************************************************************************
*** 函數名稱: ModemPutCmd
*** 函數描述: 發送命令
*** 入 口: *command AT命令
*** 出 口: 無
********************************************************************************************/
void ModemPutCmd(char *command)
{
while(*command) ModemWriteByte(*command++);
}
/********************************************************************************************
*** 函數名稱: ModemGetCmd
*** 函數描述: 檢查回顯命令中是否包含有指定字符串
*** 入 口: *command AT命令
*** 出 口: 返回指定字符串所處偏移量
********************************************************************************************/
uint16 ModemGetCmd(char *command)
{
uint8 success = 0;
char *cmd;
uint16 ofs = 0xffff;
uint16 offset = 0;
if(RxFifo.DatLen == 0) return 0xffff;
while(1)
{
if(offset > RxFifo.DatLen) return 0xffff;
//if(RxFifo.Read(offset) == *command) // 搜索到字符串第一個字符
if(ModemFifoRead(offset) == *command)
{
ofs = offset;
cmd = command;
success = 1;
while(*cmd) // 檢查整個字符串是否匹配
{
if(ofs > RxFifo.DatLen) return 0xffff;
//if(RxFifo.Read(ofs++) != *cmd++) // 字符串不匹配,停止檢查
if(ModemFifoRead(ofs++) != *cmd++)
{
success = 0;
break;
}
}
if(success == 1) return offset;
}
offset++; // 繼續搜索下一個
}
}
/********************************************************************************************
*** 函數名稱: ModemOpen
*** 函數描述: MODEM 撥號
*** 入 口: 無
*** 出 口: 1:成功 0:失敗
********************************************************************************************/
uint8 ModemOpen(void)
{
if(ModemLinkOk()) return 1;
ModemPutCmd("AT+CGATT=1\r\n");
while(ModemGetCmd("OK") > RxFifo.DatLen);
//RxFifo.Release(RxFifo.BufLen);
ModemFifoRelease(RxFifo.BufLen);
ModemPutCmd("AT+CGDCONT=1,IP,CMNET\r\n"); // China Mobile
//ModemPutCmd("AT+CGDCONT=1,IP,UNIWAP\r\n"); // China Unicom
while(ModemGetCmd("OK") > RxFifo.DatLen);
//RxFifo.Release(RxFifo.BufLen);
ModemFifoRelease(RxFifo.BufLen);
ModemPutCmd("AT+CGACT=1\r\n");
while(ModemGetCmd("OK") > RxFifo.DatLen);
//RxFifo.Release(RxFifo.BufLen);
ModemFifoRelease(RxFifo.BufLen);
ModemPutCmd("ATD*99***1#\r\n");
while(ModemGetCmd("CONNECT") > RxFifo.DatLen);
//RxFifo.Release(RxFifo.BufLen);
ModemFifoRelease(RxFifo.BufLen);
if(ModemLinkOk()) return 1;
else return 0;
}
/********************************************************************************************
*** 函數名稱: ModemClose
*** 函數描述: MODEM 掛機
*** 入 口: 無
*** 出 口: 1:成功 0:失敗
********************************************************************************************/
uint8 ModemClose(void)
{
IO0CLR = UART1_DTR; Delay(10000);
IO0SET = UART1_DTR; Delay(5000000);
if(ModemLinkOk())
{
return 0;
}
else
{
//RxFifo.Release(RxFifo.BufLen);
ModemFifoRelease(RxFifo.BufLen);
return 1;
}
}
/********************************************************************************************
*** 函數名稱:
*** 函數描述:
*** 入 口:
*** 出 口:
********************************************************************************************/
/*
uint8 ReadEvent(void)
{
uint8 Event;
Event = EventUp;
EventUp = PHYE_NONE;
return Event;
}*/
/********************************************************************************************
*** 函數名稱:
*** 函數描述:
*** 入 口:
*** 出 口:
********************************************************************************************/
uint8 ModemInit(char *baud)
{
//EventUp = PHYE_NONE;
FifoInit();
PINSEL0 = (PINSEL0 & (~(0x03<<14 )))|(0x00<<14); // P0.10 設置為 MC35_IGT (GPIO)
IO0DIR |= MC35_IGT;
IO0CLR = MC35_IGT; Delay(1000000);
IO0SET = MC35_IGT; Delay(80000000);
// 物理層初始化
//EventUp = PHYE_NONE;
//PhyLayer.Event = ReadEvent;
/*
PhyLayer.Pop = RxFifo.Pop;
PhyLayer.Read = RxFifo.Read;
PhyLayer.Relea = RxFifo.Release;
*/
PhyLayer.Pop = ModemFifoPop;
PhyLayer.Read = ModemFifoRead;
PhyLayer.Relea = ModemFifoRelease;
PhyLayer.Open = ModemOpen;
PhyLayer.Close = ModemClose;
PhyLayer.PutCmd = ModemPutCmd;
PhyLayer.GetCmd = ModemGetCmd;
PhyLayer.Write = ModemWriteByte;
ModemClose();
Uart1Init(56000);
//RxFifo.Release(RxFifo.BufLen); // 清空FIFO
ModemFifoRelease(RxFifo.BufLen);
return 1;
}
/********************************************************************************************
*** 函數名稱:
*** 函數描述:
*** 入 口:
*** 出 口:
********************************************************************************************/
void __irq IRQ_MODEM (void)
{
uint8 i;
switch(U1IIR & 0x0f)
{
case 0x04: // FIFO 達到觸發點
for(i=0; i<14; i++)
{
ModemFifoPush(U1RBR);
}
break;
case 0x0c: // FIFO 字符超時
while(U1LSR & 0x01)
{
ModemFifoPush(U1RBR);
}
break;
default: break;
}
VICVectAddr = 0x00;
}
/********************************************************************************************
*** 文件結束 ***
********************************************************************************************/
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -