首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

有用过16C550这款芯片的吗?麻烦解答一下

有用过16C550这款芯片的吗?麻烦解答一下

本帖最后由 raoxianbin 于 2014-1-11 17:14 编辑



最近用2812外扩的16C550异步串行通信芯片驱动一款液晶,但是现在发现一个问题,就是相应的发送移位寄存器不会置位
希望高手帮忙解答下,谢谢了!


一下是相应的原理图:




相应的一些代码

#include   "DSP28_Device.h"
#include    "DSP28_Globalprototypes.h"
#include "166c50.h"
//#define    N   8
unsigned int N=9;
float  adc[16];//用于存储ADC的转换结果
float  adcl0;
// unsigned  int Sci_varRx[100];
unsigned int i;
unsigned int j;

//#define     led1    GpioDataRegs.GPADAT.bit.GPIOA5
void  delay1 (void);


//========================================
//LCD函数中的变量的定义
//========================================
void k16c550_initial(void);  
void  UART16C550_Senddate(char c);
void UART16C550_Send_Frame_End(void);  //帧尾
void UART16C550_Send_Frame_End(void);  //帧尾
void Judge_LSR(void);
void  UART16C550_SendStr(unsigned char  *str, unsigned int strlen);
void UART16C550_SendOrder(unsigned int Order, unsigned int X1,unsigned int Y1,unsigned int X2,unsigned int Y2);   
Uint8  lsr_rd=0;
Uint8  wr_LCD_num=0;
Uint8  LCD_com_busy=0;
#define    Set_palette       0x040;  //该命令设置的颜色将作为字符串显示、画图等命令的前景色和背景色
#define    Set_rectangular   0x05A;  //用背景色画坐标为(Xs,Ys)和(Xe,Ye)的组成的矩形区域
#define    Draw_rectangle    0x05A;  //画矩形框
#define    Painting_line     0x056;  //画线段
#define    Set_Baud_Rate     0x0E0;  //设置波特率
unsigned char send_LCD_length;
unsigned char send_LCD_data[25]={0xaa,0x55,0x11,0x2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
//float send_LCD_data[17]={0xaa,0x55,0x11,0x2,0,0,0,0,0,0,0,0,0,0,0,0,0};
void  LCD_Draw(void);
void  LCD_Float_Dis(void);
Uint8 LCD_Data1;
Uint8 LCD_Data2;
Uint8 LCD_Data3;
Uint8 LCD_Data4;
unsigned short int LCD_DIS_Num;
unsigned short int LCD_DIS_Num_Copy;
float LCD_DIS_Float;
void *LCD_Float_Add;
Uint8 LCD_Time_Num=0;
//***********************************************************************//
//========================================
//     延迟函数的变量的定义,delay
//========================================
void delay(long int delay_num);
long int delay_Com_num;

//==============================
//  XINTF接口初始化
//==============================
void InitXintf(void);

void main(void)
{
int kk;
DINT;
InitSysCtrl();
InitGpio();
DINT;
IER=0x0000;
IFR=0x0000;
InitPieCtrl();
InitPieVectTable();    //初始化PIE模块中的CPU定时器0的中断
InitAdc();
InitEv();
//初始化Xintf
InitXintf();
//  init the 16C550, This function is found in ultra.c   
k16c550_initial();
UART16C550_SendOrder(0xE0,0x0000,0x0000,0x0000,0x0000);
UART16C550_SendOrder(0x40,0x0021,0x0024,0xC4A3,0x0000);
//LCD_Draw();
// adcl0=0;



PieCtrl.PIEIER1.bit.INTx6=1;//使能PIE模块中的ADC采样中断
IER |=M_INT1;

   EINT;
   ERTM;
EvaRegs.T1CON.bit.TENABLE=1;//启动T1计数
  

  while(1)
{   
EvaRegs.T1CON.bit.TENABLE=1;
EvaRegs.T2CON.bit.TENABLE=1;
GpioDataRegs.GPASET.bit.GPIOA5=1;
for(kk=0;kk<100;kk++)
         delay1();
   GpioDataRegs.GPACLEAR.bit.GPIOA5=1;
   for(kk=0;kk<100;kk++)
   delay1();



}

}
void delay1 (void)
{
short i;
for(i=0;i<10000;i++)
{}


void k16c550_initial()  
{

GpioDataRegs.GPASET.bit.GPIOA15=1;//REDE
GpioDataRegs.GPACLEAR.bit.GPIOA6=1;//CS
GpioDataRegs.GPACLEAR.bit.GPIOA7=1;//AS
K16C_FCR=0x06;//0x0f;//允许并复位FIFO  :K16C_FCR=0x07;/FIFO控制寄存器,使FIFO ENABLE=0,清除FIFO
GpioDataRegs.GPASET.bit.GPIOA6=1;//CS
GpioDataRegs.GPASET.bit.GPIOA7=1;//AS

GpioDataRegs.GPASET.bit.GPIOA15=1;//REDE
GpioDataRegs.GPACLEAR.bit.GPIOA6=1;//CS
GpioDataRegs.GPACLEAR.bit.GPIOA7=1;//AS
K16C_IER=0x00;//K16C_IER=0x04 不好使,必须使能FIFO中断;
GpioDataRegs.GPASET.bit.GPIOA6=1;//CS
GpioDataRegs.GPASET.bit.GPIOA7=1;//AS

GpioDataRegs.GPASET.bit.GPIOA15=1;//REDE
GpioDataRegs.GPACLEAR.bit.GPIOA6=1;//CS
GpioDataRegs.GPACLEAR.bit.GPIOA7=1;//AS
K16C_LCR=0x80;//Line Control Register,A2,A1,A0=0,1,1,
//80=Logic 1 = Divisor latch and enhanced feature register enabled.
//LCR[5] Set parity,LCR[4] Even parity,LCR[1] LCR[0]=1,1,Word length=8
GpioDataRegs.GPASET.bit.GPIOA6=1;//CS
GpioDataRegs.GPASET.bit.GPIOA7=1;//AS
GpioDataRegs.GPASET.bit.GPIOA15=1;//REDE
GpioDataRegs.GPACLEAR.bit.GPIOA6=1;//CS
GpioDataRegs.GPACLEAR.bit.GPIOA7=1;//AS
K16C_DLL=0x0C;//A2,A1,A0=0,0,0;1.8432M--波特率38.4khz;Divisor (in decimal)=XTAL1 clock frequency/(serial data rate*16)
GpioDataRegs.GPASET.bit.GPIOA6=1;//CS
GpioDataRegs.GPASET.bit.GPIOA7=1;//AS
GpioDataRegs.GPASET.bit.GPIOA15=1;//REDE
GpioDataRegs.GPACLEAR.bit.GPIOA6=1;//CS
GpioDataRegs.GPACLEAR.bit.GPIOA7=1;//AS
K16C_DLM=0x00;//A2,A1,A0=0,0,1
GpioDataRegs.GPASET.bit.GPIOA6=1;//CS
GpioDataRegs.GPASET.bit.GPIOA7=1;//AS
GpioDataRegs.GPASET.bit.GPIOA15=1;//REDE
GpioDataRegs.GPACLEAR.bit.GPIOA6=1;//CS
GpioDataRegs.GPACLEAR.bit.GPIOA7=1;//AS
K16C_LCR=0x03;//8位数据,1位停止位,无奇偶,
GpioDataRegs.GPASET.bit.GPIOA6=1;//CS
GpioDataRegs.GPASET.bit.GPIOA7=1;//AS


GpioDataRegs.GPASET.bit.GPIOA15=1;//REDE
GpioDataRegs.GPACLEAR.bit.GPIOA6=1;//CS
GpioDataRegs.GPACLEAR.bit.GPIOA7=1;//AS
K16C_SPR=0x00;
GpioDataRegs.GPASET.bit.GPIOA6=1;//CS
GpioDataRegs.GPASET.bit.GPIOA7=1;//AS

GpioDataRegs.GPASET.bit.GPIOA15=1;//REDE
GpioDataRegs.GPACLEAR.bit.GPIOA6=1;//CS
GpioDataRegs.GPACLEAR.bit.GPIOA7=1;//AS
K16C_MCR=0x00;
GpioDataRegs.GPASET.bit.GPIOA6=1;//CS
GpioDataRegs.GPASET.bit.GPIOA7=1;//AS
/* GpioDataRegs.GPASET.bit.GPIOA15=1;//REDE
GpioDataRegs.GPACLEAR.bit.GPIOA6=1;//CS
GpioDataRegs.GPACLEAR.bit.GPIOA7=1;//AS
send_LCD_length=K16C_RHR;
GpioDataRegs.GPASET.bit.GPIOA6=1;//CS
GpioDataRegs.GPASET.bit.GPIOA7=1;//AS*/








/*
// delay(10);
    //K16C_MCR=0x08;

K16C_LCR=0x80;//Line Control Register,A2,A1,A0=0,1,1,
//80=Logic 1 = Divisor latch and enhanced feature register enabled.
//LCR[5] Set parity,LCR[4] Even parity,LCR[1] LCR[0]=1,1,Word length=8
K16C_DLL=0x03;//A2,A1,A0=0,0,0;1.8432M--波特率38.4khz;Divisor (in decimal)=XTAL1 clock frequency/(serial data rate*16)
K16C_DLM=0x00;//A2,A1,A0=0,0,1
K16C_LCR=0x03;//8位数据,1位停止位,无奇偶,
K16C_FCR=0x07;//允许并复位FIFO  :K16C_FCR=0x07;
K16C_IER=0x02;//K16C_IER=0x04 不好使,必须使能FIFO中断;
K16C_SPR=0x00;
K16C_MCR=0x00;//CS->2812Pin102=A6,REDE->2812Pin124=A15
  //A6作为16C550CS2,A7作为16C550AS->2812Pin104=A7*/
      
}
////////////////////////////////////////////////////////////
/****************发送命令函数**********************************/
///////////
void  UART16C550_Senddate(char c)
{
char t;

do
{  //K16C_LSR=0x40;
t=  K16C_LSR;
}while((t&0x40)!=0x40);
      K16C_THR=c;
}

void Judge_LSR(void)
{
  char t;
     do{   
         t = K16C_LSR;   
     }while((t & 0x40)==0);   
}
void  UART16C550_SendStr(unsigned char * str, unsigned int strlen)   
{   
    unsigned int k = 0;   
    do{   
        UART16C550_Senddate(* (str+k));   
       k++;   
    }while(k<strlen);   
}   
   
void UART16C550_Send_Header(void)      //帧头
{
    Judge_LSR();
     K16C_THR = 0xAA;
}

void UART16C550_Send_Frame_End(void)  //帧尾
{
    Judge_LSR();
    K16C_THR = 0xCC ;
   
    Judge_LSR();
     K16C_THR = 0x33 ;
   
    Judge_LSR();
     K16C_THR = 0xC3;
   
    Judge_LSR();
     K16C_THR =0x3C;
                        
}


/****************************************串口发送给LCD*****************************************************/
void  UART16C550_SendOrder(unsigned int Order, unsigned int X1,unsigned int Y1,unsigned int X2,unsigned int Y2)   
{   
   unsigned int XY[8]={0};
   unsigned int i=0;
   send_LCD_data[0]=0xAA;
   if( Order== 0x040 )   // 设置调色板
     {
       // UART16C550_Send_Header();
        
       // Judge_LSR();
        send_LCD_data[1]=Order;
        //UART16C550_THR = Order; //设置调色板
        
        //Judge_LSR();
        //UART16C550_THR = 0xF8; //Fcolor ,red ->0xF800
        send_LCD_data[2]=0xF8; //Fcolor ,red ->0xF800
        
        //Judge_LSR();
        //UART16C550_THR = 0x00;
        send_LCD_data[3]=0x00; //Fcolor ,red ->0xF800
      
        //Judge_LSR();
        //UART16C550_THR = 0x00; //Bcolor ,black ->0x0000
        send_LCD_data[4]=0x00; //Bcolor ,black ->0x0000
      
       // Judge_LSR();
        //UART16C550_THR = 0x00;  
        send_LCD_data[5]=0x00; //Bcolor ,black ->0x0000
      
        send_LCD_data[6]=0xCC ;
     send_LCD_data[7]= 0x33 ;
     send_LCD_data[8] = 0xC3;
        send_LCD_data[9] =0x3C;//UART16C550_Send_Frame_End();
        send_LCD_length =9;
        UART16C550_SendStr(send_LCD_data,send_LCD_length);
     }
     
  /* if( Order==0x0E0 )     // 设置波特率
     {
       // UART16C550_Send_Header();
        
        //Judge_LSR();
        //UART16C550_THR = Set_Baud_Rate; //设置波特率
        send_LCD_data[1]=Set_Baud_Rate;
        //Judge_LSR();
        //UART16C550_THR = 0x55;
        send_LCD_data[2]=0x55;
        //Judge_LSR();
        //UART16C550_THR = 0xAA;
        send_LCD_data[3]=0xAA;
        //Judge_LSR();
        //UART16C550_THR = 0x5A;
        send_LCD_data[4]=0x5A;
        //Judge_LSR();
        //UART16C550_THR = 0xA5;  
        send_LCD_data[5]=0xA5;
        //Judge_LSR();
        //UART16C550_THR = 0x07; //设置波特率  0:1200,1:2400, 2:4800,
                               //            3:9600,4:19200,5:38400,
                               //            6:57600,7:115200
        send_LCD_data[6]=0x7;
        
        //Judge_LSR();
        //UART16C550_THR = 0x00; //Param1
        send_LCD_data[7]=0x0;
        
        //Judge_LSR();
        //UART16C550_THR = 0x00; //Param2
        send_LCD_data[8]=0x0;
        
        send_LCD_data[9]=0xCC ;
     send_LCD_data[10]= 0x33 ;
     send_LCD_data[11] = 0xC3;
        send_LCD_data[12] =0x3C;//UART16C550_Send_Frame_End();
     send_LCD_length=12;
        //UART16C550_Send_Frame_End();
        UART16C550_SendStr(send_LCD_data,send_LCD_length);
     } */
         
   if( Order==0x05A )            //设置矩形区域
     {
        XY[0]=(0xff00 & X1)>>8;              //(x1,y1),(x2,y2)坐标
        XY[1]=(0x00ff & X1);
        XY[2]=(0xff00 & Y1)>>8;
        XY[3]=(0x00ff & Y1);
        XY[4]=(0xff00 & X2)>>8;
        XY[5]=(0x00ff & X2);
        XY[6]=(0xff00 & Y2)>>8;
        XY[7]=(0x00ff & Y2);
        
        //UART16C550_Send_Header();
        
        //Judge_LSR();
        //UART16C550_THR = Order;           //设置矩形区域
         send_LCD_data[1]= Order;
      
        for (i=0;i<8;i++)
        {
          //Judge_LSR();
           send_LCD_data[i+2]=XY;
           //UART16C550_THR = XY;         //设置矩形区域
        }
        
        send_LCD_data[10]=0xCC ;
     send_LCD_data[11]= 0x33 ;
     send_LCD_data[12] = 0xC3;
        send_LCD_data[13] =0x3C;//UART16C550_Send_Frame_End();
        //UART16C550_Send_Frame_End();         // Fame End
        send_LCD_length=13;
  UART16C550_SendStr(send_LCD_data,send_LCD_length);
     }
     
    if( Order==0x056 )             // 设置矩形区域
     {
        XY[0]=(0xff00 & X1)>>8;              //(x1,y1),(x2,y2)坐标
        XY[1]=(0x00ff & X1);
        XY[2]=(0xff00 & Y1)>>8;
        XY[3]=(0x00ff & Y1);
        XY[4]=(0xff00 & X2)>>8;
        XY[5]=(0x00ff & X2);
        XY[6]=(0xff00 & Y2)>>8;
        XY[7]=(0x00ff & Y2);
         
       // UART16C550_Send_Header();
        
        //Judge_LSR();
        //UART16C550_THR = Order;             //设置矩形区域
        send_LCD_data[1]= Order;
      
        for (i=0;i<8;i++)
        {
          //Judge_LSR();
          //UART16C550_THR = XY;             //设置矩形区域
          send_LCD_data[i+2]=XY;             //设置矩形区域
        
        }
        
        send_LCD_data[10]=0xCC ;
     send_LCD_data[11]= 0x33 ;
     send_LCD_data[12] = 0xC3;
        send_LCD_data[13] =0x3C;//UART16C550_Send_Frame_End();
   //  UART16C550_Send_Frame_End();            // Fame End
        send_LCD_length=13;
  UART16C550_SendStr(send_LCD_data,send_LCD_length);
     }
     

  if( Order==0xE0 ) // 设置波特率
     {
        UART16C550_Send_Header();
        
        Judge_LSR();
        K16C_THR =Order; //设置波特率
        
        Judge_LSR();
      K16C_THR = 0x55;
        Judge_LSR();
        K16C_THR = 0xAA;
        Judge_LSR();
        K16C_THR = 0x5A;
        Judge_LSR();
      K16C_THR = 0xA5;
        
        Judge_LSR();
       K16C_THR = 0x03; //设置波特率  0:1200,1:2400, 2:4800,
                               //          3:9600,4:19200,5:38400,
                               //           6:57600,7:115200
        Judge_LSR();
      K16C_THR = 0x00; //Param1
        
        Judge_LSR();
        K16C_THR = 0x00; //Param2
        
        UART16C550_Send_Frame_End();
        
     }
     if( Order==0x059 )             // 画区域
     {
        XY[0]=(0xff00 & X1)>>8;              //(x1,y1),(x2,y2)坐标
        XY[1]=(0x00ff & X1);
        XY[2]=(0xff00 & Y1)>>8;
        XY[3]=(0x00ff & Y1);
        XY[4]=(0xff00 & X2)>>8;
        XY[5]=(0x00ff & X2);
        XY[6]=(0xff00 & Y2)>>8;
        XY[7]=(0x00ff & Y2);
         
       // UART16C550_Send_Header();
        
        //Judge_LSR();
        //UART16C550_THR = Order;             //设置矩形区域
        send_LCD_data[1]= Order;
      
        for (i=0;i<8;i++)
        {
          //Judge_LSR();
          //UART16C550_THR = XY;             //设置矩形区域
          send_LCD_data[i+2]=XY;             //设置矩形区域
        
        }
        
        send_LCD_data[10]=0xCC ;
     send_LCD_data[11]= 0x33 ;
     send_LCD_data[12] = 0xC3;
        send_LCD_data[13] =0x3C;//UART16C550_Send_Frame_End();
   //  UART16C550_Send_Frame_End();            // Fame End
        send_LCD_length=13;
  UART16C550_SendStr(send_LCD_data,send_LCD_length);
     }

     if( Order==0x056 )             // 画线
     {
        XY[0]=(0xff00 & X1)>>8;              //(x1,y1),(x2,y2)坐标
        XY[1]=(0x00ff & X1);
        XY[2]=(0xff00 & Y1)>>8;
        XY[3]=(0x00ff & Y1);
        XY[4]=(0xff00 & X2)>>8;
        XY[5]=(0x00ff & X2);
        XY[6]=(0xff00 & Y2)>>8;
        XY[7]=(0x00ff & Y2);
        send_LCD_data[1]= Order;
      
        for (i=0;i<8;i++)
        {
          send_LCD_data[i+2]=XY;             //设置矩形区域   
        }
        
        send_LCD_data[10]=0xCC ;
     send_LCD_data[11]= 0x33 ;
     send_LCD_data[12] = 0xC3;
        send_LCD_data[13] =0x3C;//UART16C550_Send_Frame_End();
   //  UART16C550_Send_Frame_End();            // Fame End
        send_LCD_length=13;
  UART16C550_SendStr(send_LCD_data,send_LCD_length);
     }

   

当用UART16C550_SendOrder(0xE0,0x0000,0x0000,0x0000,0x0000);
进行一下测试的时候,发现程序一直会停在while((t & 0x40)==0); 这,就是说发送移位寄存器空一直没有置位,请有相关经验的人,帮忙解答一下,谢谢了!
返回列表