?? modem.c
字號:
/****************************************************************************
* 文件名:MODEM.C
* 功能:MODEM驅動程序。
* 說明:基于LPC2100、LPC2200系列ARM7微控制器的UART1
****************************************************************************/
#define IN_MODEM
#include "config.h"
void __irq UART1_Exception(void);
uint8 WaitCmdAck(void);
static volatile uint8 ModemState=NOT_INIT_MODEM; // 定義MODEM狀態變量
uint8 RecBuff[1024];
volatile uint16 RecPointer=0;
volatile uint16 ReadPointer=0;
extern uint8 Config_Finish;
/****************************************************************************
* 名稱:DelayNS()
* 功能:長軟件延時
* 入口參數:dly 延時參數,值越大,延時越久
* 出口參數:無
****************************************************************************/
void DelayNS(uint32 dly)
{ uint32 i;
for(; dly>0; dly--)
for(i=0; i<10000; i++);
}
void ClearFIFO(void)
{
uint8 temp,i;
for(i=0;i<16;i++)
{
if ( (U1LSR & 0x01) == 0x01 )
{
temp = U1RBR; // 讀空接收FIFO
}
else
{
break;
}
}
return;
}
/****************************************************************************
* 名稱:UART1Init()
* 功能:UART1初始化(MODEM功能)。
* 入口參數:bps 波特率
* 出口參數:無
****************************************************************************/
void UART1Init(uint32 bps)
{
uint16 Fdiv;
PINSEL0 = (PINSEL0 & 0x0000FFFF) | 0x55550000; // 選擇管腳為UART0
U1LCR = 0x83; // 允許訪問分頻因子寄存器
Fdiv = (Fpclk / 16) / bps; // 設置波特率
U1DLM = Fdiv / 256;
U1DLL = Fdiv % 256;
U1LCR = 0x03; // 禁止訪問分頻因子寄存器
// 且設置為8,1,n
U1IER = 0x0D; // 允許接收和MODEM中斷
//U1IER = 0x0F; // 允許接收、發送、MODEM中斷
//U1IER=0x05;
//U1FCR = 0x87; // 初始化FIFO
//U1FCR=0x07; //FIFO里有數據就差生中斷
U1MCR = 0x03; //允許硬件控制流
ClearFIFO();
VICIntSelect = 0x00000000; // 設置所有通道為IRQ中斷
VICVectCntl0 = 0x27; // UART1中斷通道分配到IRQ slot 0,即優先級最高
VICVectAddr0 = (uint32)UART1_Exception; // 設置UART1向量地址
VICIntEnable = 0x00000080; // 使能UART1中斷
}
/****************************************************************************
* 名稱:ModemWrite()
* 功能:向UART1(MODEM)發送多字節數據。
* 入口參數:Data 待發送數據指針
* NByte 發送數據字節個數
* 出口參數:返回當前MODEM狀態值
****************************************************************************/
uint8 ModemWrite(char *Data, uint16 NByte)
{
uint8 i;
while (NByte > 0) // 發送NByte字節數據
{
for (i = 0; i < 8; i++) // 一次發送8個字節(已使能FIFO)
{
U1THR = *Data++;
NByte--;
if (NByte == 0)
{
break;
}
}
while((U1LSR&0x20) == 0); // 等待數據發送完畢
}
return(ModemState);
}
/****************************************************************************
* 名稱:ModemGetch()
* 功能:接收UART1(MODEM)字節數據。
* 入口參數:無
* 出口參數:返回取得的數據
****************************************************************************/
uint8 ModemGetch(void)
{
uint8 rt;
while((U1LSR&0x01) == 0)
{ // 沒有收到數據
U1IER = U1IER | 0x01; // 允許接收中斷
for(rt=0; rt<200; rt++);
}
rt = U1RBR; // 讀取收到的數據
return(rt);
}
/****************************************************************************
* 名稱:ModemCommand()
* 功能:發送MODEM命令。
* 入口參數:Command AT指令(字符串)
* 出口參數:返回當前MODEM狀態值
****************************************************************************/
uint8 ModemCommand(char *Command)
{
char *cp;
uint8 i, err;
if(ModemState == MODEM_CLOSE)
{
while((U1LSR&0x01) != 0) // 讀取完接收到的數據
{
err = U1RBR;
}
cp = Command;
i = 0;
while(*cp++ != 0) // 取得AT指令字符個數
{
i++;
}
ReadPointer=RecPointer=0;
ModemWrite(Command, i); // 發送AT指令
ModemWrite("\r", 1); // 發送命令結束符
ModemState=WaitCmdAck();
return(ModemState);
}
/*i = ModemGetch();
if((i=='A') || (i=='a')) // 若命令回顯,接字符形式等待回應
{
while(1)
{
err = i;
i = ModemGetch();
if((err=='O') || (err=='o'))
if((i=='K') || (i=='k'))
{
i = ModemGetch();
i = ModemGetch();
break;
}
}
}
else // 按數字形式等待回應
{
while(1)
{
if(i == '0')
{
i = ModemGetch();
break;
}
i = ModemGetch();
}
}
}*/
return(ModemState);
}
/****************************************************************************
* 名稱:ModemDialDown()
* 功能:Modem斷開。
* 入口參數:Number 拔號字符串
* 出口參數:返回當前MODEM狀態值
****************************************************************************/
uint8 ModemDialDown(void)
{
U1MCR = 0x02; // 設置DTR為0,使MODEM掛機并返回命令狀態
DelayNS(1); // MODEM中斷會設置ModemState為MODEM_CLOSE
U1MCR = 0x03; // 恢復DTR為1
DelayNS(1);
return(ModemState);
}
/****************************************************************************
* 名稱:ModemDialUp()
* 功能:Modem拔號操作。
* 入口參數:Number 拔號字符串
* 出口參數:返回當前MODEM狀態值
****************************************************************************/
uint8 ModemDialUp(char Number[])
{
char *cp;
uint8 i, err;
if(ModemState == MODEM_CLOSE)
{
while((U1LSR & 0x00000001) != 0) // 讀取完接收到的數據
{
err = U1RBR;
}
ModemWrite("ATD", 3); // 發送拔號命令
i = 0;
cp = Number;
while(*cp++ != 0) // 取得AT指令字符個數
{
i++;
}
ModemWrite(Number, i); // 發送拔號號碼
ModemWrite("\r", 1); // 發送命令結束符
U1IER = U1IER | 0x01; // 允許接收中斷
for (i = 0; i < 200; i++)
{
DelayNS(5);
if (ModemState == MODEM_CONNECT)
{
break;
}
}
}
return(ModemState);
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -