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

📄 main.c

📁 串口扩展,又一个UART扩张成为五个,GM8125驱动程序
💻 C
字号:
/****************************************Copyright (c)**************************************************
**                               Guangzou ZLG-MCU Development Co.,LTD.
**                                      graduate school
**                                 http://www.zlgmcu.com
**
**--------------File Info-------------------------------------------------------------------------------
** File name:			main.c
** Last modified Date:  2004-09-16
** Last Version:		1.0
** Descriptions:		The main() function example template
**
**------------------------------------------------------------------------------------------------------
** Created by:			Chenmingji
** Created date:		2004-09-16
** Version:				1.0
** Descriptions:		The original version
**
**------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
** Version:
** Descriptions:
**
********************************************************************************************************/
#include "config.h"

#define STADD  0x07
#define SRADD  0x07
#define MS     (1<<30)
#define sRST   (1<<29)
uint8 p=0x01;
uint8 receivedata1=0x00;
void  delayNS(uint32  dly) 
{ 
  
   while(dly--) ; 
      
} 

/*------------------------------------------------------------------------------------------------------
**串口中断服务函数
--------------------------------------------------------------------------------------------------------*/
void __irq IRQ_RxD1(){
   
   uint8 i,num;
   if(0x04==(U1IIR&0x0f)){//加条件判断才能正确中断因为RBR中断包括两个中断源:一个是数据可用(RDA)010(IIR3:1);一个是字符超时指示(CTI),110(IIR3:1)
      for(i=0;i<8;i++){
        p=U1RBR;
      // UART1_send_1Byte(p);
       }
   }
   
    num=((IO0PIN&(SRADD<<19))>>19);
    switch(num){
       case 1:
              break;
              
       case 2:
             break;
       case 3:
              break;
       case 4:
              break;
       case 5:
              break;
        default:break;
       }
//   p=dat;
   //delayNS(1000000);
   VICVectAddr=0x00;
}
/*--------------------------------------------------------------------------------------------------------
**串口初始化函数
--------------------------------------------------------------------------------------------------------*/
void UART1_int(){

    uint16 Fdiv;
   
   
    U0LCR=0x87;//设置接受发送的数据格式//先要设置成11为格式
    Fdiv=Fpclk/16/1200*6;//母串口波特率是字串口6倍,先要用1200bps进行初始化设置
    
    U1DLM=Fdiv/256;
    U1DLL=Fdiv%256;//Baud=Fpclk/(16*N) N=Fpclk/(Baud*N)
    U1LCR=0x07;//11为数据格式
    
    U1IER=0x05;//使能接受中断
    U1FCR=0x01;//使能FIFO 8字节中断
    
    VICIntSelect=0x00000000;
    VICDefVectAddr=(int)IRQ_RxD1;
    VICIntEnable=(1<<6);
 } 
 /*------------------------------------------------------------------------------------------------------
**IO口初始化
--------------------------------------------------------------------------------------------------------*/
void IO_init(){
   PINSEL0=0x00000005|(1<<16)|(1<<18);//P0.0 TxD 01; P0.1 RxD 01; P0.8 TxD1 01;P0.9 RxD1 01;
   PINSEL1=0x00000000;
   
   IO0DIR=0x01c03c00|MS|sRST;//P0继电器输出,MS,sRST
   IO2DIR=(STADD<<16);//P2口 STADD0~2输出
   IO1DIR=0x000000000;//P1输入
   
}
/*--------------------------------------------------------------------------------------------------------
**GM8125初始化
---------------------------------------------------------------------------------------------------------*/
void GM8125_init(){
    uint8 cont_data,receivedata;
   
    uint16 Fdiv;
//////////////////////////////////设置串口1为设置GM8125模式    
    U1LCR=0x87;//设置接受发送的数据格式//先要设置成11为格式
    Fdiv=Fpclk/16/(1200*6);//母串口波特率是字串口6倍,先要用7200bps进行初始化设置
    U1DLM=Fdiv/256;
    U1DLL=Fdiv%256;//Baud=Fpclk/(16*N) N=Fpclk/(Baud*N)
    U1LCR=0x07;//11为数据格式 
    U1FCR=0x01;//使能FIFO 1字节中断
 //////////////////////////////////////对GM8125初始化  
    IO0CLR=sRST;
   
    IO0SET=sRST;//对8125进行复位
    delayNS(60000000);
    cont_data=0xf2;   //控制字
    IO2CLR=(STADD<<16);//置 GM8125 命令字地址 
    delayNS(6000);
    do{ 
    IO0CLR=MS;        //GM8125 工作在写命令字模式下 
    delayNS(1000);
    U1THR=cont_data;  
    while((U1LSR&0x40)==0);  //设置 GM8125 子串口波特率为 4800bps 
    delayNS(1000);
    IO0SET=MS;//读命令字 
    while(U1LSR&0x01==0); //查询等待数据到来 ,是否要判断RDA?
    receivedata=U1RBR;
    receivedata1=receivedata;
    }while(receivedata!=cont_data);
    delayNS(6000);
    IO0CLR=MS;//工作在多通道模式下
    delayNS(6000);
    IO2SET=((STADD&0x01)<<16);//地址不能为0
    delayNS(600000);
///////////////////////////////下面设置串口正常工作模式    
    U0LCR=0x83;//设置接受发送的数据格式 10bit 无校验
    Fdiv=Fpclk/16/(4800*6);//母串口波特率是字串口6倍,
    U1DLM=Fdiv/256;
    U1DLL=Fdiv%256;//Baud=Fpclk/(16*N) N=Fpclk/(Baud*N)
    U1LCR=0x03;
    U1IER=0x05;//使能接受中断
    U1FCR=0x01;//使能FIFO 1字节中断
    VICIntSelect=0x00000000;
    VICDefVectAddr=(int)IRQ_RxD1;
    VICIntEnable=(1<<7);
          
}
/*---------------------------------------------------------------------------------------------------------
**函数名:GM8125_send_1byte
**功能: 使用扩展串口发送一字节
**参数:data 要发送的数据 num 使用的串口号(取1----5)
**返回:void
----------------------------------------------------------------------------------------------------------*/
void GM8125_send_1Byte(uint8 data,uint8 num){ 
   uint8 i;
   IO2SET=((STADD&num)<<16); 
   delayNS(100000);
   
   U1THR=data;
   while((U1LSR&0x40)==0);
   delayNS(1000);
 /*  IO2CLR=(STADD<<16);
   for(i=0;i<5;i++){
     U1THR=0x00;
     while((U1LSR&0x40)==0);
 }*/
   
   
   }
/*-------------------------------------------------------------------------------------------------------
**函数名:send_nByte
**功能: 使用扩展串口发送n字节
**参数:buff 要发送的数数组;len:数据长度   num通道号(取1----5)
**返回:void
----------------------------------------------------------------------------------------------------------*/
void GM8125_send_nByte(uint8 buff[],uint8 len,uint8 num){
    uint8 i,j;
    for(i=0;i<len;i++){
    
        IO2SET=(STADD&num)<<16; 
        delayNS(500);
        
        U1THR=buff[i];//发送有效数据
        while((U1LSR&0x40)==0);
        
    IO2CLR=(STADD<<16);
        for(j=0;j<5;j++){  //发送5个延时数据
           U1THR=0x00;
           while((U1LSR&0x40)==0);
        }    
        
     }
}

        int main (void)
{// add user source code 
  
    
    UART1_int();
    IO_init();
    GM8125_init();
     while(1){
     GM8125_send_1Byte(0x55,1);
    
     delayNS(500000);
     }
    
     
    return 0;
}
/*********************************************************************************************************
**                            End Of File
********************************************************************************************************/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -