?? gprs.c
字號:
/****************************************Copyright (c)**************************************************
** 廣州周立功單片機發展有限公司
** 研 究 所
** 產品一部
**
** http://www.zlgmcu.com
**
**--------------文件信息--------------------------------------------------------------------------------
**文 件 名: GPRS.c
**創 建 人: 葉皓賁
**最后修改日期: 2005年7月4日
**描 述: μCOS-II下LPC2000的GPRS底層驅動
**
**--------------歷史版本信息----------------------------------------------------------------------------
** 創建人: Yehaoben
** 版 本: v1.0
** 日 期: 2007年2月25日
** 描 述: 原始版本
**
**------------------------------------------------------------------------------------------------------
** 修改人:
** 版 本:
** 日 期:
** 描 述:
**
**--------------當前版本修訂------------------------------------------------------------------------------
** 修改人:
** 日 期:
** 描 述:
**
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#define IN_MODEM
#include "config.h"
#define GPRS_TASK_STK_SIZE 128
OS_STK GPRSTaskStartStk[GPRS_TASK_STK_SIZE];
static OS_EVENT *ModemSem, *Uart1Send, *Uart1Get,*HaveCall;
static uint8 ModemState;
/*********************************************************************************************************
** 函數名稱: UART1Init
** 功能描述: 初始化UART0
** 輸 入: bps:波特率
**
** 輸 出:TRUE :成功
** FALSE:失敗
** 全局變量: Uart0Sem
** 調用模塊: OSSemCreate
**
** 作 者: 陳明計
** 日 期: 2004年2月25日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
** 修改人: 陳明計
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void UART1Init(uint32 bps)
{
uint16 Fdiv;
PINSEL0 = (PINSEL0 & 0x0000ffff) | 0x55550000; /* 選擇管腳為UART0 */
U1LCR = 0x80; /* 允許訪問分頻因子寄存器 */
Fdiv = (Fpclk / 16) / bps; /* 設置波特率 */
U1DLM = Fdiv / 256;
U1DLL = Fdiv % 256;
U1LCR = 0x03; /* 禁止訪問分頻因子寄存器 */
/* 且設置為8,1,n */
U1IER = 0x01; /* 允許接收和發送中斷 */
U1FCR = 0x87; /* 初始化FIFO */
U1MCR = 0x03;
Uart1Send = OSSemCreate(1);
Uart1Get = OSSemCreate(0);
}
/*********************************************************************************************************
** 函數名稱: GetModemState
** 功能描述: 獲取MODEM狀態
** 輸 入: 無
**
** 輸 出: MODEM狀態
** 全局變量: 無
** 調用模塊: 無
**
** 作 者: 陳明計
** 日 期: 2004年2月25日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
uint8 GetModemState(void)
{
return ModemState;
}
/*********************************************************************************************************
** 函數名稱: ModemWrite
** 功能描述: 發送多個字節數據
** 輸 入: Data:發送數據存儲位置
** NByte:發送數據個數
** 輸 出:無
** 全局變量: 無
** 調用模塊: UART0Putch
**
** 作 者: 陳明計
** 日 期: 2004年2月25日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
uint8 ModemWrite(char *Data, uint16 NByte)
{
uint8 err,i;
while (NByte > 0)
{
while((U1LSR&0X40) == 0);
for (i = 0; i < 8; i++)
{
U1THR = *Data++;
NByte--;
if (NByte == 0)
{
break;
}
}
}
return ModemState;
}
/*********************************************************************************************************
** 函數名稱: UART0Getch
** 功能描述: 接收一個字節
** 輸 入: 無
** 輸 出: 接收到的數據
** 全局變量: 無
** 調用模塊: 無
**
** 作 者: 陳明計
** 日 期: 2004年2月25日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
uint8 ModemGetch(void)
{
uint8 rt;
OS_ENTER_CRITICAL();
while ((U1LSR & 0x00000001) == 0)
{ /* 沒有收到數據 */
U1IER = U1IER | 0x01; /* 允許接收中斷 */
OSSemPend(Uart1Get,OS_TICKS_PER_SEC/2, &rt);
break;
}
if(rt == OS_TIMEOUT)
rt = 0;
else
rt = U1RBR; /* 讀取收到的數據 */
OS_EXIT_CRITICAL();
return rt;
}
/*********************************************************************************************************
** 函數名稱: GetAllChar
** 功能描述: 接收當前的所有字節
** 輸 入: 無
** 輸 出: 無
** 全局變量: 無
** 調用模塊: 無
**
** 作 者: Yehaoben
** 日 期: 2005年2月25日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void GetAllChar()
{
uint8 i,j;
OS_ENTER_CRITICAL();
U1IER = U1IER | 0x01; /* 允許接收中斷 */
OS_EXIT_CRITICAL();
for (i = 0; i < 120; i++)
{
j = ModemGetch();
if (j == 0)
break;
}
}
/*********************************************************************************************************
** 函數名稱: ModemDialUp
** 功能描述: 通過modem撥號
** 輸 入: 電話號碼
**
** 輸 出: modem狀態
**
** 全局變量: ModemState
** 調用模塊: ModemWrite,OSTimeDly
**
** 作 者: Yehaoben
** 日 期: 2005年2月25日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
uint8 ModemDialUp(char Number[])
{
char *cp;
uint8 i;
uint8 err;
OSSemPend(ModemSem, 0, &err);
if (ModemState == MODEM_CLOSE)
{
while ((U1LSR & 0x00000001) != 0)
{
err = U1RBR;
}
ModemWrite("ATD", 3);
i = 0;
cp = Number;
while (*cp++ != 0)
{
i++;
}
ModemWrite(Number, i);
ModemWrite(";\r\n", 3);
GetAllChar();
}
OSSemPost(ModemSem);
return ModemState;
}
/*********************************************************************************************************
** 函數名稱: ModemDialDown
** 功能描述: 掛斷modem
** 輸 入: 無
**
** 輸 出: modem狀態
**
** 全局變量: ModemState
** 調用模塊: OSTimeDly
**
** 作 者: 陳明計
** 日 期: 2004年2月25日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
uint8 ModemDialDown(void)
{
U1MCR = 0x02;
OSTimeDly(OS_TICKS_PER_SEC / 10);
U1MCR = 0x03;
OSTimeDly(OS_TICKS_PER_SEC / 10);
return ModemState;
}
/*********************************************************************************************************
** 函數名稱: ModemCommand
** 功能描述: 向modem發送命令
** 輸 入: 命令字符串
**
** 輸 出: modem狀態
**
** 全局變量: ModemState
** 調用模塊: ModemWrite,ModemGetch,
**
** 作 者: yehaoben
** 日 期: 2005年2月25日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
uint8 ModemCommand(char *Command)
{
uint8 i,err;
uint16 j;
OSSemPend(ModemSem, 0, &err);
GetAllChar();
if (ModemState == MODEM_CLOSE)
{
while(1)
{
while ((U1LSR & 0x00000001) != 0)
{
err = U1RBR;
}
ModemWrite("AT\r\n", 4);
i = ModemGetch();
j = 0;
while ( j <= 20 )
{
err = i;
i = ModemGetch();
if (err == 'O' || err == 'o')
if (i == 'K' || i == 'k')
{
i = ModemGetch();
i = ModemGetch();
break;
}
if( (i == 0) && (j == 3) )
{
j=20;
}
j++;
}
if(j >=20 )
{
continue;
}
else
break;
}
ModemWrite(Command, strlen(Command));
ModemWrite("\r\n", 2);
i = ModemGetch();
j=0;
while (1)
{
err = i;
i = ModemGetch();
if (err == 'O' || err == 'o')
if (i == 'K' || i == 'k')
{
i = ModemGetch();
i = ModemGetch();
break;
}
if(i == 0)
j++;
if(j >= 3 )
break;
}
GetAllChar();
}
OSSemPost(ModemSem);
return ModemState;
}
/*********************************************************************************************************
** 函數名稱: GPRSCheckTask
** 功能描述: GPRS檢查是否有電話來和檢查是否有新的短信。
** 輸 入: 無
**
** 輸 出: 無
**
** 全局變量: ModemState
** 調用模塊: UART1Init,OSTimeDly,ModemCommand,
**
** 作 者: Yehaoben
** 日 期: 2005年7月2日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void GPRSCheckTask(void *pdata)
{
uint8 i,err,temp[3];
while(1)
{
OSTimeDly(OS_TICKS_PER_SEC*2);
OSSemPend(ModemSem, 0, &err);
do
{
i = ModemGetch();
if( i == 'R' )
{
temp[0] = ModemGetch();
temp[1] = ModemGetch();
temp[2] = ModemGetch();
if( temp[0] == 'I' )
if( temp[1] == 'N' )
if( temp[2] == 'G' )
OSSemPost(HaveCall);
}
}while( i != 0 );
OSSemPost(ModemSem);
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -