📄 gm8125.c
字号:
/********************************************************************************
* 文件:GM8125.C
* 功能:串口一扩五芯片GM8125读写函数库
* 作者:宋智宁
* 日期:2005.3.7
* 备注:晶振fosc = 11.0592MHz,暂不支持波特率115200bps
* 中断接收函数见中断函数库uart.c/uart51.c
*********************************************************************************/
#include "config.h"
//--数据端口和控制端口定义-------------------------
#ifdef C51_MX //P89C669
static unsigned char far UartCtrl _at_ 0x380000;
static unsigned char far UartState _at_ 0x280000;
#else //AT89S52
static unsigned char xdata UartCtrl _at_ 0x3800;
static unsigned char xdata UartState _at_ 0x2800;
#endif
/******************************************************************************
* 名称:DelayXms(uint16 x)
* 功能:延时X毫秒子程序
* 入口参数:uint16 x ----x ms
* 出口参数:无
* 说明:CPU--669(6时钟周期)
* 晶振--11.0592MHz
******************************************************************************/
void DelayXms(uint16 x)
{
uint16 data i;
while(x!=0)
{
for(i=0; i<335; i++);
x--;
}
}
/******************************************************************************
* 名称:GM8125_Init(uint8 frame, uint16 baud)
* 功能:GM8125初始化子程序
* 入口参数:uint8 frame--帧格式(0--10bit/f,1--11bit/f)
* uint16 baud--母串口波特率(多通道模式)
* 出口参数:无
* 说明:串口初始化,用定时器1/波特率发生器, 上电时调用
* 复位后GM8125的帧格式为11bit, 母串口波特率为7200bps
* 晶振fosc = 11.0592MHz,暂不支持波特率115200bps
******************************************************************************/
void GM8125_Init(uint8 frame, uint16 baud)
{
EA = 0; //初始化时关总中断
//----Reset-----------------------------
UartCtrl = 0x7f; //RST=0
DelayXms(200);
UartCtrl = 0xff; //RST=1
Uart_Init(1,3,7200); //复位后GM8125的帧格式为11bit, 母串口波特率为7200bps
GM8125_ChgBaud(frame, baud); //改变GM8125后,同时改变主机的波特率
EA = 1; //开总中断
}
/******************************************************************************
* 名称:GM8125_ChgBaud(uint8 frame, uint16 baud)
* 功能:改变GM8125母串口波特率和帧格式子程序
* 入口参数:uint8 frame--帧格式(0--10bit/f,1--11bit/f)
* uint16 baud--母串口波特率(多通道模式)
* 出口参数:int8 res--1表示成功,-1表示失败
* 说明:改变GM8125后,同时改变主机的波特率(多通道模式)
* 最多写3次控制字,若失败则返回-1
* 晶振fosc = 11.0592MHz,暂不支持波特率115200bps
******************************************************************************/
int8 GM8125_ChgBaud(uint8 frame, uint16 baud)
{
uint8 num=3,cmd=0xf0; //命令控制字(高4位必须全为1)
uint8 temp;
if(frame==1) cmd = cmd | 0x08; //11bit
switch(baud)
{
case 7200: cmd = cmd + 0x00;
break;
case 14400: cmd = cmd + 0x01;
break;
case 28800: cmd = cmd + 0x02;
break;
case 57600: cmd = cmd + 0x03;
break;
//case 115200: cmd = cmd + 0x04;
// break;
default: cmd = cmd + 0x00;
break;
}
for(;num>0;num--) //最多写3次控制字,若失败则返回-1
{
UartCtrl = 0x81; //STADD2~0=000,SRADD2~0=000
DelayXms(1);
UartCtrl = 0x80; //MS=0, 写命令字
DelayXms(1);
Uart_Send_Byte(1, &cmd, 1); //发送命令字
DelayXms(100); //delay
UartCtrl = 0x81; //MS=1, 读命令字
Uart_Rev_Byte(1, &temp, 1); //读命令字
if(temp==cmd) break; //读命令字
}
UartCtrl = 0xf2; //MS=0,STADD2~0=001,SRADD2~0=111,使命令字生效
if(num==0) return -1; //最多写3次控制字,若失败则返回-1
//**改变主机的波特率***************************
EA = 0; //初始化时关总中断
if(frame==0)
Uart_Init(1,1,baud); //mode=1(10bit)
else
Uart_Init(1,3,baud); //mode=3(11bit)
EA = 1; //开总中断
return 1;
}
/******************************************************************************
* 名称:GM8125_Send(uint8 mode, uint8 channel, uint8 buf[], uint8 len)
* 功能:GM8125数据发送子程序
* 入口参数:uint8 mode--工作模式(0--单通道模式, 1--多通道模式)
* uint8 channel--通道号(1~5)
* uint8 buf[]--数据指针
* uint8 len--数据长度
* 出口参数:无
* 说明:
******************************************************************************/
void GM8125_Send(uint8 mode, uint8 channel, uint8 buf[], uint8 len)
{
uint8 i,j,temp=0xff; //端口(RST=1,MS=1)
if(mode==0) //单通道模式
{
temp = (temp&0x81) + (channel<<4) + (channel<<1); //发送和接收通道号(1~5)
UartCtrl = temp; //MS=1,STADD2~0=channel,选择子串口
Uart_Send_Byte(1,buf,len); //发送数据
}
else //多通道模式
{
temp = (temp&0xf0) + (channel<<1); //发送通道号(1~5)
for(i=0; i<len; i++)
{
UartCtrl = temp; //MS=0,STADD2~0=channel,选择子串口
Uart_Send_Byte(1,buf+i,1); //发送1B数据
UartCtrl = 0xf0; //MS=0,STADD2~0=000,不选择子串口
j = 0x00;
Uart_Send_Byte(1,&j,1); //发送5个无效数据
Uart_Send_Byte(1,&j,1);
Uart_Send_Byte(1,&j,1);
Uart_Send_Byte(1,&j,1);
Uart_Send_Byte(1,&j,1);
}
UartCtrl = temp;
}
}
/******************************************************************************
* 名称:GM8125_Rev(GM8125BUF *buffer, uint8 len)
* 功能:GM8125数据接收子程序
* 入口参数:GM8125BUF *buffer--接收缓冲区的结构指针
* uint8 len--数据长度
* 出口参数:int8 res--1表示正常接收, -1表示缓冲区溢出
* 说明:用等待接收方式
******************************************************************************/
int8 GM8125_Rev(GM8125BUF *buffer, uint8 len)
{
uint8 i,j,temp;
for(i=0; i<len; i++)
{
Uart_Rev_Byte(1,&temp,1); //接收1Byte
j = UartState&0x07; //读子串口号
if(buffer->Len[j-1]>=sizeof(buffer->Ch[0]))
return -1; //缓冲区溢出
else
{
buffer->Ch[j-1][buffer->Len[j-1]] = temp;
buffer->Len[j-1]++; //长度加1
}
}
return 1;
}
/******************************************************************************
* 名称:GM8125_Byte_Rev(uint8 dat)
* 功能:GM8125数据接收处理子程序(供中断服务程序调用)
* 入口参数:uint8 dat--接收的数据
* 出口参数:无
* 说明:供中断服务程序调用
* 使用全局变量:GM8125BUF SerBuf--串口接收缓冲区的结构
******************************************************************************/
void GM8125_Byte_Rev(uint8 dat)
{
uint8 j;
j = UartState&0x07; //读子串口号
if(SerBuf.Len[j-1]<sizeof(SerBuf.Ch[0]))
{
SerBuf.Ch[j-1][SerBuf.Len[j-1]] = dat;
SerBuf.Len[j-1]++; //长度加1
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -