在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
芯片精品文章合集(500篇!) 创芯人才网--重磅上线啦!
查看: 2027|回复: 0

[求助] LPC2214上调试SC16C550B遇到问题,附上代码,急求解决

[复制链接]
发表于 2013-1-6 15:00:40 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
并口转成串口的芯片SC16C550B,在调试时,用串口调试助手下发数据后,会有数据一直返回,附上代码,急求解决,谢谢了

void main(void) //主函数
{
      SC16C550_Reset(); //复位UART

      SC16C550_Init();

      while(1)
      {
           TQtoBase_BuffLoading();
           Delay(100);

      }
}


void SC16C550_Reset(void)
{
      SC16C550_RST_High ;       // SC16C550芯片复位有效
      Delay(100);
      SC16C550_RST_Low ;      // SC16C550芯片复位无效
      Delay(100);
}



void SC16C550_Init(void)
{   
      IO2DIR|=0x000FFFFF;   //P2.0~P2.19输出,P2.0~P2.7为数据口
      IO2CLR=(IO2CLR|0x000FFFFF);
   
      SC16C550_CS_High;
      SC16C550_RD_High;
      SC16C550_WR_High;
      SC16C550_ALE_Low;


      Uart_Write(LCR,0x80);      // 设置SC16C550芯片波特率,除数锁存器使能
      Uart_Write(DLL,0x48);      // 设置DLL 低位(晶振为11.0592M)
      Uart_Write(DLM,0x00);      // 设置DLL 高位
      Uart_Write(LCR,0x03);      // 8位数据,1位停止位
      Uart_Write(FCR,0x07);      // 允许并复位接收器和发送器FIFO,1字节触发FIFO
   
   
      CommAddr2=0x01; //设置通信地址
}



void TQtoBase_BuffLoading(void)
{
      uint8 c=0;
      uint8 ch=0;

      c = Uart_Read(LSR); //读LSR
      if (c & 0x01) //判断是否收到数据
      {
            ch = Uart_Read(RHR); //接收数据
            Uart_Write(THR, ch); //回送数据
      }

}


void Uart_Write(uint8 Reg, uint8 Val)
{
   IO2DIR|=0x000FFFFF;//P2.0~P2.19输出
   
   switch(Reg)//寄存器选择
     { case 0: ADDR_0
      break;
      case 1: ADDR_1
      break;
      case 2: ADDR_2
      break;
      case 3: ADDR_3
      break;
      case 4: ADDR_4
      break;
      case 5: ADDR_5
      break;
      case 6: ADDR_6
      break;
      case 7: ADDR_7
      break;
      default:
      break;
      }
    //并口数据放置  
     if((Val & 0x01)==1)
      AD0_High;
      else
      AD0_Low;
     if((Val & 0x02)==2)
      AD1_High;
      else
      AD1_Low;
     if((Val & 0x04)==4)
      AD2_High;
      else
      AD2_Low;
     if((Val & 0x08)==8)
      AD3_High;
      else
      AD3_Low;
     if((Val & 0x10)==16)
      AD4_High;
      else
      AD4_Low;
     if((Val & 0x20)==32)
      AD5_High;
      else
      AD5_Low;
     if((Val & 0x40)==64)
      AD6_High;
      else
      AD6_Low;
     if((Val & 0x80)==128)
      AD7_High;
      else
      AD7_Low;
     
     SC16C550_CS_Low;
     SC16C550_WR_Low;
     Delay(10);
     SC16C550_WR_High;
     SC16C550_CS_High;
}



uint8 Uart_Read(uint8 Reg)
{   
union { uint32 RegData_Temp; uint8 RegData[4];} RD;//共用同一空间
IO2DIR=IO2DIR&0xFFFFFF00;//P2.0~P2.7输入
switch(Reg)
{
  case 0: ADDR_0
  break;
  case 1: ADDR_1
  break;
  case 2: ADDR_2
  break;
  case 3: ADDR_3
  break;
  case 4: ADDR_4
  break;
  case 5: ADDR_5
  break;
  case 6: ADDR_6
  break;
  case 7: ADDR_7
  break;
  default:
  break;
}
   
   
SC16C550_CS_Low;            // UART片选有效

    SC16C550_RD_Low;
RD.RegData_Temp=IO2PIN;
    SC16C550_RD_High ;    //读无效
    SC16C550_CS_High;      // UART片选无效

    return(RD.RegData_Temp);
}



#define SC16C550_WR_High      IO2SET=(IO2SET|0x00000100)    //P2.8
#define SC16C550_WR_Low       IO2CLR=(IO2CLR|0x00000100)
#define SC16C550_RD_High      IO2SET=(IO2SET|0x00000200)    //P2.9
#define SC16C550_RD_Low       IO2CLR=(IO2CLR|0x00000200)
#define SC16C550_ALE_High     IO2SET=(IO2SET|0x00000400)    //P2.10
#define SC16C550_ALE_Low      IO2CLR=(IO2CLR|0x00000400)
#define SC16C550_RXRDY_High   IO2SET=(IO2SET|0x00000800)    //P2.11
#define SC16C550_RXRDY_Low    IO2CLR=(IO2CLR|0x00000800)
#define SC16C550_TXRDY_High   IO2SET=(IO2SET|0x00001000)    //P2.12
#define SC16C550_TXRDY_Low    IO2CLR=(IO2CLR|0x00001000)
#define SC16C550_A0_High      IO2SET=(IO2SET|0x00002000)    //P2.13
#define SC16C550_A0_Low       IO2CLR=(IO2CLR|0x00002000)
#define SC16C550_A1_High      IO2SET=(IO2SET|0x00004000)    //P2.14
#define SC16C550_A1_Low       IO2CLR=(IO2CLR|0x00004000)
#define SC16C550_A2_High      IO2SET=(IO2SET|0x00008000)    //P2.15
#define SC16C550_A2_Low       IO2CLR=(IO2CLR|0x00008000)
#define SC16C550_CS_High      IO2SET=(IO2SET|0x00010000)    //P2.16
#define SC16C550_CS_Low       IO2CLR=(IO2CLR|0x00010000)
#define SC16C550_RST_High     IO2SET=(IO2SET|0x00020000)    //P2.17
#define SC16C550_RST_Low      IO2CLR=(IO2CLR|0x00020000)



#define AD0_High    IO2SET=(IO2SET|0x00000001)    //P2.0
#define AD0_Low     IO2CLR=(IO2CLR|0x00000001)    //P2.0
#define AD1_High    IO2SET=(IO2SET|0x00000002)    //P2.1
#define AD1_Low     IO2CLR=(IO2CLR|0x00000002)    //P2.1
#define AD2_High    IO2SET=(IO2SET|0x00000004)    //P2.2
#define AD2_Low     IO2CLR=(IO2CLR|0x00000004)    //P2.2
#define AD3_High    IO2SET=(IO2SET|0x00000008)    //P2.3
#define AD3_Low     IO2CLR=(IO2CLR|0x00000008)    //P2.3
#define AD4_High    IO2SET=(IO2SET|0x00000010)    //P2.4
#define AD4_Low     IO2CLR=(IO2CLR|0x00000010)    //P2.4
#define AD5_High    IO2SET=(IO2SET|0x00000020)    //P2.5
#define AD5_Low     IO2CLR=(IO2CLR|0x00000020)    //P2.5
#define AD6_High    IO2SET=(IO2SET|0x00000040)    //P2.6
#define AD6_Low     IO2CLR=(IO2CLR|0x00000040)    //P2.6
#define AD7_High    IO2SET=(IO2SET|0x00000080)    //P2.7
#define AD7_Low     IO2CLR=(IO2CLR|0x00000080)    //P2.7
// --------------------------------------------------------- 通用寄存器
#define RHR        0x00      // 接收数据寄存器
#define THR        0x00      // 发送数据寄存器
#define IER        0x01      // 中断使能寄存器
#define FCR        0x02      // FIFO控制寄存器
#define ISR        0x02      // 中断状态寄存器
#define LCR        0x03      // 线控制寄存器
#define MCR        0x04      // MODEM控制寄存器
#define LSR        0x05      // 线状态寄存器
#define MSR        0x06      // MODEM状态寄存器
#define SPR        0x07      // 通用寄存器
#define CTLP       0x07

// --------------------------------------------------------- 特殊寄存器
#define DLL        0x00      // 波特率除数寄存器低位(DLAB=1时有效)
#define DLM        0x01      // 波特率除数寄存器高位(DLAB=1时有效)
#define DLL_DATA   0x0C      // 波特率分频系数
#define DLM_DATA   0x00      // 在1.8432M 时,波特率为9600bps
//---------------------------------------------------------
#define ADDR_0  { SC16C550_A0_Low;SC16C550_A1_Low;SC16C550_A2_Low;}
#define ADDR_1  { SC16C550_A0_High;SC16C550_A1_Low;SC16C550_A2_Low;}
#define ADDR_2  { SC16C550_A0_Low;SC16C550_A1_High;SC16C550_A2_Low;}
#define ADDR_3  { SC16C550_A0_High;SC16C550_A1_High;SC16C550_A2_Low;}
#define ADDR_4  { SC16C550_A0_Low;SC16C550_A1_Low;SC16C550_A2_High;}
#define ADDR_5  { SC16C550_A0_High;SC16C550_A1_Low;SC16C550_A2_High;}
#define ADDR_6  { SC16C550_A0_Low;SC16C550_A1_High;SC16C550_A2_High;}
#define ADDR_7  { SC16C550_A0_High;SC16C550_A1_High;SC16C550_A2_High;}




程序已附上,请问有没有人帮我分析下呢?或者帮我调试下,谢谢了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /1 下一条

小黑屋| 手机版| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-9-27 19:18 , Processed in 0.054314 second(s), 8 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表