打印
[ZLG-ARM]

LPC2132的串口,同样的CODE串口0运行正常,可是串口1不能用!

[复制链接]
1548|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
aaron238|  楼主 | 2007-5-6 18:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
aaron238|  楼主 | 2007-5-6 18:54 | 只看该作者

dd


#include "D:xiechunfuprojectarm empoldersoftLPC213Xsystem.h"


//UART1
static uint8 txd1sta=0;
static uint8 txd1end=0;
static uint8 uart1txd[100];
//////////////////////////////////////////////////////////////////////////////////
//接收$开始*结束的数据串.如果数据串超过100个后面的数据将删掉
//如果三个BUFFER都是装满了,UART1停止接收
//等处理了数据过后在接收下一个有效的数据串
//处理完数据过后将响应的shuju1wei置0    uart1rxd0[0][X]    置0
uint8 uart1rxdnb=0;   //表示可用的数组
//最大值为3  ,0为空3为满
uint8 uart1rxd0[100][3];
uint8 shuju1wei0;        
//表示这个数据串接收了几个字节uart1rxd0[100][0]
uint8 shuju1wei1;       
//表示这个数据串接收了几个字节uart1rxd0[100][1]
uint8 shuju1wei2;       
//表示这个数据串接收了几个字节uart1rxd0[100][2]
//UART0  
/********************************************************************************************

********************************************************************************************/
static uint8 txd0sta=0;
static uint8 txd0end=0;
static uint8 uart0txd[100];
//////////////////////////////////////////////////////////////////////////////////
//接收$开始*结束的数据串.如果数据串超过100个后面的数据将删掉
//如果三个BUFFER都是装满了,UART0停止接收
//等处理了数据过后在接收下一个有效的数据串
//处理完数据过后将响应的shuju0wei置0    uart0rxd0[0][X]    置0
uint8 uart0rxdnb=0;   //表示可用的数组
//最大值为3  ,0为空3为满
uint8 uart0rxd0[100][3];
uint8 shuju0wei0;        
//表示这个数据串接收了几个字节uart0rxd0[100][0]
uint8 shuju0wei1;       
//表示这个数据串接收了几个字节uart0rxd0[100][1]
uint8 shuju0wei2;       
//表示这个数据串接收了几个字节uart0rxd0[100][2]
////////////////////////////////////////////////////////////////////
//
/**************************************************************************************

***************************************************************************************/
extern uchar myprintf0(uchar *ip,uchar n)
{
 uchar i,j;
 uchar *p;
 if( txd0end!=0)return 0;
 p = ip ;
 if(U0LSR&0X40)  //发送器为空
     {
      j = n-1;
       for(i=0;i<j;i++)
           {  
           p++;
           uart0txd = *p ;      
           }
       txd0end=j;
       txd0sta=0;
       U0THR = *ip;
     }
 else
     {
     for(i=0;i<n;i++)
           {  
           uart0txd = *p ;      
        p++;
           }
       txd0end=n;
       txd0sta=0;
     }
IO0SET  = 0X80000000 ;   //RS4850CN  1  发送状态
 return 1 ;
}
/**************************************************************************************

***************************************************************************************/
void uart0int (void) __irq 
{
uchar i,j,m;
uchar shuzhu[14];
uchar stendzh;      
//0表示接收到了开始位1表示接收到了数据2表示接收到了结束位
static uchar rxtstatic=0; //保存当前接收的字节数
static uchar uart0rxdip=0;  //当前保存的数组
//判断是什么中断
i = U0IIR&0x0F;        
switch(i)
   {
   //接收数据可用有14个字节
   case 0x04:  //  
    //接收的数据可用有字节但是发生了中断小于14个字节
   case 0x0C:  //
                   stendzh = 1 ;
                   for(j=0;j<14;j++)
                        {
                        shuzhu[j] =  U0RBR ;
             if(shuzhu[j] ==RXD0STA) {stendzh = 0 ;break;}
             if(shuzhu[j] ==RXD0END) {stendzh = 2 ;break;}
             if(!(U0LSR&0x01)) break;
                        }
                   //表示接收到了开始位或结束位
             if(j<14)   
                 {
                 if(stendzh == 0)//KAI SHI
                     {
                if(uart0rxdnb<3)  /*当前接收的数组为空*/
                    {
                    if(shuju0wei0==0)   uart0rxdip=0;
                    if(shuju0wei1==0)   uart0rxdip=1;
                    if(shuju0wei2==0)   uart0rxdip=2;
                    uart0rxd0[0] [uart0rxdip] =  RXD0STA;
                    rxtstatic  =  1 ;
                    break;
                    }
                else break;
                     }
            if(stendzh == 2)   //STOP
                {
                   if(rxtstatic==0)break;  /*这个结束字符没有开始字符*/
                m  = j +1;
                for(j=0;j<m;j++)
                                     {
                                     uart0rxd0[rxtstatic] [uart0rxdip] =  shuzhu[j];   /*当前数组已经装满超过100的数据删掉*/
                          if(rxtstatic<99)rxtstatic++;     
                                     } 
                uart0rxdnb++;
                if(uart0rxdip==0)shuju0wei0  = rxtstatic ;
                if(uart0rxdip==1)shuju0wei1  = rxtstatic ;
                if(uart0rxdip==2)shuju0wei2  = rxtstatic ;
                rxtstatic = 0 ;
                if(shuju0wei0==0)   uart0rxdip=0;/*指向空的数组*/
                if(shuju0wei1==0)   uart0rxdip=1; 
                if(shuju0wei2==0)   uart0rxdip=2;
                
                break;
                }
            if(stendzh == 1)   /*正常结束的数据shuju */
                {
                j++;
                }
                 }
             //正常数据j为接收的数据个数
             m  = j ;
                   if(uart0rxdnb<3)//当前接收的数组为空
                        {
                        if(uart0rxd0[0] [uart0rxdip] !=RXD0STA) break; /*shuju wu xiao 无开始字符*/
                        for(j=0;j<m;j++)
                           {
                            uart0rxd0[rxtstatic] [uart0rxdip] =  shuzhu[j]; /*当前数组已经装满超过100的数据删掉*/
                 if(rxtstatic<99)rxtstatic++;     
                           } 
                        }
                   break;
   //发送中断
   case 0x02:  // 
                   if( txd0end!=txd0sta)
                        {
                        for(j=0;j<14;j++)
                            {
                              U0THR = uart0txd[txd0sta];
                txd0sta++;
                   if(txd0sta ==  txd0end )
                   {
                   txd0end=0;
                   txd0sta =0;
                   break;
                      }
                            }
                        }
                   break;
   }
 VICVectAddr = 0x00;                            // 通知VIC中断处理结束

/**************************************************************************************
初始化串口0
***************************************************************************************/
extern void uart0init(void)
{
U0LCR = 0x80;                        // DLAB位置1
//bak = (FPCLK>>4)/baud;   
U0DLM = 0;     //9600
U0DLL = 0xc3;    
 /* 设置串口模式 */ 
 U0LCR = 0X03;  /* 1开始位8位数据1个停止位*/
 U0FCR = 0xc1;                        /*使能FIFO,并设置触发点为14字节*/
  U0TER= 0x80;  
 U0IER = 0x03;                        /* 允许RBR中断,即接收中断*/
                                              //允许发送中断
 IO0CLR= 0X80000000 ;   /*RS4850CN  0   接收P0.31*/
 VICVectCntl0 = 0x26;                 /* UART0通道分配到IRQ slot 0,即优先级最高*/
 VICVectAddr0 = (uint32)uart0int;         //UART0中断    
 VICIntEnable = 0x00000040;        // 使能 中断
}
/********************************************************************************************************

********************************************************************************************************/
extern uchar myprintf1(uchar *ip,uchar n)
{
 uchar i,j;
 uchar *p;
 if( txd1end!=0)return 0;
 p = ip ;
 if(U1LSR&0X40)  //发送器为空
     {
     while(myprintf0("R",1)==0);
      j = n-1;
       for(i=0;i<j;i++)
           {  
           p++;
           uart1txd = *p ; 
           U1THR = *p;
           }
       txd1end=j;
       txd1sta=0;    
       //U1THR = *ip;
     }
 else
     {
     while(myprintf0("S",1)==0);
     for(i=0;i<n;i++)
           {  
           uart1txd = *p ;      
        p++;
           }
       txd1end=n;
       txd1sta=0;
     }
 while(myprintf0("T",1)==0);
IO0SET = 0X00800000 ;   //RS4851CN  0   发送P0.23
 return 1 ;
}
/********************************************************************************************************

********************************************************************************************************/
void uart1int (void) __irq   //UART1中断
{
uchar i,j,m;
uchar shuzhu[14];
uchar stendzh;      
//0表示接收到了开始位1表示接收到了数据2表示接收到了结束位
static uchar rxtstatic=0; //保存当前接收的字节数
static uchar uart0rxdip=0;  //当前保存的数组
//判断是什么中断
while(myprintf0("X",1)==0);
i = U1IIR&0x0F;        
switch(i)
   {
   //接收数据可用有14个字节
   case 0x04:  //  
    //接收的数据可用有字节但是发生了中断小于14个字节
   case 0x0C:  //
                   stendzh = 1 ;
                   for(j=0;j<14;j++)
                        {
                        shuzhu[j] =  U1RBR ;
             if(shuzhu[j] ==RXD1STA) {stendzh = 0 ;break;}
             if(shuzhu[j] ==RXD1END) {stendzh = 2 ;break;}
             if(!(U1LSR&0x01)) break;
                        }
                   //表示接收到了开始位或结束位
             if(j<14)   
                 {
                 if(stendzh == 0)//KAI SHI
                     {
                if(uart1rxdnb<3)  /*当前接收的数组为空*/
                    {
                    if(shuju1wei0==0)   uart0rxdip=0;
                    if(shuju1wei1==0)   uart0rxdip=1;
                    if(shuju1wei2==0)   uart0rxdip=2;
                    uart1rxd0[0] [uart0rxdip] =  RXD0STA;
                    rxtstatic  =  1 ;
                    break;
                    }
                else break;
                     }
            if(stendzh == 2)   //STOP
                {
                   if(rxtstatic==0)break;  /*这个结束字符没有开始字符*/
                m  = j +1;
                for(j=0;j<m;j++)
                                     {
                                     uart1rxd0[rxtstatic] [uart0rxdip] =  shuzhu[j];   /*当前数组已经装满超过100的数据删掉*/
                          if(rxtstatic<99)rxtstatic++;     
                                     } 
                uart1rxdnb++;
                if(uart0rxdip==0)shuju1wei0  = rxtstatic ;
                if(uart0rxdip==1)shuju1wei1  = rxtstatic ;
                if(uart0rxdip==2)shuju1wei2  = rxtstatic ;
                rxtstatic = 0 ;
                if(shuju1wei0==0)   uart0rxdip=0;/*指向空的数组*/
                if(shuju1wei1==0)   uart0rxdip=1; 
                if(shuju1wei2==0)   uart0rxdip=2;
                
                break;
                }
            if(stendzh == 1)   /*正常结束的数据shuju */
                {
                j++;
                }
                 }
             //正常数据j为接收的数据个数
             m  = j ;
                   if(uart1rxdnb<3)//当前接收的数组为空
                        {
                        if(uart1rxd0[0] [uart0rxdip] !=RXD1STA) break; /*shuju wu xiao 无开始字符*/
                        for(j=0;j<m;j++)
                           {
                            uart1rxd0[rxtstatic] [uart0rxdip] =  shuzhu[j]; /*当前数组已经装满超过100的数据删掉*/
                 if(rxtstatic<99)rxtstatic++;     
                           } 
                        }
                   break;
   //发送中断
   case 0x02:  // 
                   if( txd1end!=txd1sta)
                        {
                        for(j=0;j<14;j++)
                            {
                              U1THR = uart1txd[txd1sta];
                txd1sta++;
                   if(txd1sta ==  txd1end )
                   {
                   txd1end=0;
                   txd1sta =0;
                   break;
                      }
                            }
                        }
                   break;
   }
 VICVectAddr = 0x00;                            // 通知VIC中断处理结束
}     
/********************************************************************************************************

********************************************************************************************************/
//初始化串口1
extern void uart1init(void)
{
U1LCR = 0x80;                        // DLAB位置1
//bak = (FPCLK>>4)/baud;   
U1DLM = 0;     //9600
U1DLL = 0xc3;    
 /* 设置串口模式 */ 
 U1LCR = 0X03;  /* 1开始位8位数据1个停止位*/
 U1FCR = 0xc1;                        /*使能FIFO,并设置触发点为14字节*/
  U1TER= 0x80; 
 U1IER = 0x03;                        /* 允许RBR中断,即接收中断*/
                                              //允许发送中断
 IO0CLR= 0X00800000 ;   //RS4851CN  0   接收P0.23
 VICVectCntl1 = 0x27;                      // UART1通道分配到IRQ slot 1,
 VICVectAddr1 = (uint32)uart1int;  
 VICIntEnable = 0x00000080;        // 使能 中断
}

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

57

主题

488

帖子

1

粉丝