|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册
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;}
程序已附上,请问有没有人帮我分析下呢?或者帮我调试下,谢谢了 |
|