📄 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 + -