SCC0 应用实例. 概述 SCC0 是 PHILIPS 推出的一款高性能的 UART 芯片, 其具有 字节 FIFO 和 IrDA 编 / 解码模块 本文将结合电路和程序演示如何使用 SCC0 接收和回送 UART 数据 读者可以根据图 制作 SCC0 的 DEMO 版 ; 在 KEIL C 开发环境下, 可利用 PVRD 的 SOFTICE 功能, 方便调试 SCC0 的各种功能. 电路分析 图 SCC0 引脚图 SCC0 的引脚图如图 所示, 文中使用的电路如图 所示 电路十分简单, 仅有 片芯片, 分别为 PVRD 和 SCC0 其中 PVRD 是一款可扩展外部存储器的增强型 内核单片机 S SW-PB J CON + C uf R K GND Rx Tx RxD TxD C 0P RxD TxD MHz Y C 0P 0 0 U P0 P P P P P P P RXD TXD ALE/P PSEN EA/VP RESET X X PVRD P00/AD0 P0/AD P0/AD P0/AD P0/AD P0/AD P0/AD P0/AD P0/A P/A P/A0 P/A P/A P/A P/A P/A P/T P/T0 WR RD INT INT0 D0 D D D D D D D A0 A A D0 D D D D D D D A0 A A 0 0 U D0 D D D D D D D A0 A A AS CS0 CS CS MR OW IOR IOW IOR INT SCC0 DDIS TXRDY RXRDY OUT OUT RTS DTR CTS DSR DCD RI RX TX RCLK BAUDOUT XTAL XTAL 0 0 Rx Tx.MHz C Y 00P C P 图 应用电路图 为了方便对 UART 发送数据和观察 UART 回送的数据, 读者可以参照图 自行焊接串口电平转换电路, 把 SCC0 的 Rx 和 Tx 通过电平转换电路连接到 PC 的 COM 口, 然后通过串口调试软件进行调试 为了利用 PVRD 的 SOFTICE 功能调试程序, 在电路中
把 PVRD 的 TxD 和 RxD 也通过电平转换电路连接到 PC 的 COM 口 J DB PC_RXD PC_TXD C 0 C 0 U C+ C- C+ C- TOUT RIN TOUT RIN SP Vcc V+ V- GND TIN ROUT TIN ROUT 0 C 0 C 0 TXD RXD 图 串口连接图在电路的连接上可以把 SCC0 看作是 MCU 的一个外部存储器, 数据线连接到 PVRD 的 P0 口上, 地址线连接到 P 口上, 此外还需要连接读 / 写使能 片选和复位信号 ( 如图 所示 ) 本范例通过查询方式对 SCC0 进行操作,SCC0 的 INT 引脚可以悬空 如果读者需要利用中断操作方式, 可以把 INT 引脚连接到 PVRD 的外部中断引脚 INT0 或 INT SCC0 需要在 RCLK( 脚 ) 输入一个串行接收同步时钟, 并且在 BAUDOUT( 脚 ) 输出串行发送同步时钟 由于 SCC0 的最高波特率可达 Mbit/s, 这两个时钟信号的引入, 使得在高速通信的场合中, 可以消除接收 / 发送的时钟差异, 提高了数据传输的可靠性 在本范例中通信的另一端是 PC 的 COM 口, 不需要同步时钟, 因此需要把 RCLK 和 BAUDOUT 连接起来 在电路中的电源电压为 V 需要说明的是,SCC0 可工作在 V.V 和.V, 但电源电压的不同将影响最高通信波特率 V 时最高波特率为 Mbit/s,.V 时为 Mbit/s,.V 时为 Mbit/s. SCC0 与 SCC0B 的差别有一点要注意的, 如果要使用软件流控制和硬件流控制等功能, 必须要选用 SCC0 而不能选用 SCC0B, 后者是不支持流控制功能的 它们的详细分别请参考 飞利浦 SCC 器件和飞利浦低功耗 SCCxxxB 器件之间的不同 一文. 软件编写.. 简介为了使读者易于理解, 程序中通过软件查询的方式从 SCC0 的 Rx 端接收数据, 并从 Tx 端回送数据 SCC0 的其它功能, 如软件流控制和硬件流控制等, 读者理解本范例后, 要实验这些功能都是很容易的 实际上, 对 SCC0 的操作, 就是对其内部寄存器进行操作, 在程序中对 SCC0 的寄存器操作是通过函数 Uart_Read(unsigned char reg) 和 Uart_Write(unsigned char reg, unsigned char val) 实现的 其中 reg 为要操作的寄存器,val 为要写入的值
.. 程序流程 在本范例程序中, 对 SCC0 的初始化流程如下 : 调用 Uart_Reset() 复位 SCC0 置 LCR[] 为 允许读写 DLL 和 DLM 通过设置 DLL 和 DLM 设置通信波特率 通过设置 LCR 设置通信格式 通过设置 FCR 设置 FIFO 功能.. 波特率计算在此介绍一下 SCC0 波特率的计算方法 : 晶振频率波特率 = ( DLL和 DLM中分频系数 ) 本例中通信波特率为 00Bps, 计算得到分频系数为 0x0C, 因而设置 DLL 为 0x0C, DLM 为 0x00 在对 SCC0 初始化完毕之后, 即可开始使用它提供的 UART 功能了 在本例中是通过查询 LSR( 线路状态寄存器 ) 的第 0 位有没被置位, 判断有没接收到数据 当查询接收到数据后, 通过读取 RHR 即可获得接收到的数据 通过向 THR 写数据, 即可达到向 UART 发送数据的目的 关于 SCC0 的寄存器的详细说明请参考芯片的数据手册. 范例程序 本范例程序在 KEIL C 编译通过的, 程序清单如下所示 如果有疑问请联系 LPC00@ZLGMCU.COM 程序清单 MAINLOOP.C
// 文件 :Mainloop.c // 功能 : 使用 scc00, 从 rx 接收数据, 在 tx 中返回相同数据 // 版权 : 周立功单片机发展有限公司 #include <REG.H> #include "uart.h" #define DLL_DATA 0x0c // 定义 UART 分频系数, 在.M 时, 波特率为 00BPS #define DLM_DATA 0x00 unsigned char c,ch; void main(void) Uart_Reset(); // 主函数 // 复位 UART Uart_Write(LCR,0x0); Uart_Write(DLL,DLL_DATA); Uart_Write(DLM,DLM_DATA); // 设置 UART 波特率 // 设置 DLL 低位 // 设置 DLL 高位 Uart_Write(LCR,0x0); Uart_Write(FCR,0x0); // 位数据, 位停止位 // 允许并复位 FIFO while() c = Uart_Read(LSR); if (c & 0x0) ch = Uart_Read(RHR); Uart_Write(THR, ch); // 读 LSR // 判断是否收到数据 // 接收数据 // 回送数据 程序清单 UART.C // 文件 :Uart.c // 功能 :SCC0 功能函数实现文件 // 版权 : 周立功单片机发展有限公司 ***************** #include <REG.H> // 包含头文件 #include "uart.h" sfr AUXR=0xE;
// 函数名 : Uart_Write // 功能 : 写 UART 寄存器 // 入参数 : reg= 要写的寄存器地址,val= 要写的值 // 出参数 : 无 void Uart_Write(unsigned char Reg, unsigned char Val) A0 = Reg & 0x0; //UART 地址 A = Reg & 0x0; A = Reg & 0x0; UART_CEN = 0; //UART 片选有效 AUXR = 0x0; *((unsigned char pdata *)MCU_COMMAND) = Val; AUXR = 0x00; // 存取外部存储器 // 存取内部存储器 UART_CEN = ; //UART 片选无效 // 函数名 : Uart_Read // 功能 : 读 UART 寄存器 // 入参数 : reg= 要读的寄存器地址 // 出参数 : 寄存器值 unsigned char Uart_Read(unsigned char Reg) unsigned char RegData; A0 = Reg & 0x0; A = Reg & 0x0; A = Reg & 0x0; //UART 地址 UART_CEN = 0; //UART 片选有效 AUXR = 0x0; RegData = *((unsigned char pdata *)MCU_COMMAND); AUXR = 0x00; // 存取外部存储器 // 存取内部存储器 UART_CEN = ; //UART 片选无效 return RegData;
// 函数名 : Uart_Reset // 功能 : 复位 UART // 入参数 : 无 // 出参数 : 无 void Uart_Reset(void) int i; UART_RESET = ; //UART reset 有效 for (i=0;i<0;i++); // 延时 UART_RESET = 0; //UART reset 无效 for (i=0;i<0;i++); // 延时 程序清单 UART.H // 文件 :uart.h // 功能 :SCC0 功能函数头文件 // 版权 : 周立功单片机发展有限公司 #define MCU_COMMAND 0xFF // 空地址 // 通用寄存器 #define RHR 0x00 #define THR 0x00 #define IER 0x0 #define FCR 0x0 #define ISR 0x0 #define LCR 0x0 #define MCR 0x0 #define LSR 0x0 #define MSR 0x0 #define SPR 0x0 #define CTLP 0x0 // 特殊寄存器 #define DLL 0x00 #define DLM 0x0 // 增强寄存器 #define EFR 0x0 #define Xon_ 0x0 #define Xon_ 0x0 #define Xoff_ 0x0 #define Xoff_ 0x0
// 定义 UART 地址线 sbit A0 = P^0; sbit A = P^; sbit A = P^; sbit UART_RESET = P^; // 定义 UART 复位脚 sbit UART_CEN = P^; // 定义 UART 片选脚 // 定义函数原型 void Uart_Write(unsigned char Reg, unsigned char Val); unsigned char Uart_Read(unsigned char Reg); void Uart_Reset(void);. 参考文献. SCC0 数据手册. PVRD 数据手册. 使用 SCC0/SCC0B 来实现一个 IrDA 接口功能. 飞利浦 SCC 器件和飞利浦低功耗 SCCxxxB 器件之间的不同