⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gm8125.c

📁 基于51平台的串口一扩五芯片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 + -