最近刚刚开始学FPGA,从网上下载了一个OC8051,发现还是有不少缺陷,正在努力学习并改进中。
这是最新的战果:UART,兼容通用51。
一、串行口寄存器说明
1、数据缓冲器SBUF(99H)
串行口中有两个物理空间上各自独立的发送缓冲器和接收缓冲器。这两个缓冲器公用一个地址99H,发送缓冲器只读不写,接收缓冲器只写不读。接收缓冲器是双缓冲的,以避免在接收下一帧数据之前,CPU未能及时响应接收中断,没有把上一帧数据读走而产生数据重叠问题。
2、串行口控制寄存器SCON(98H)
其字节地址为98H,位地址为98H~9FH。格式为:
SCON(98H) SM0 SM1 SM2 REN TB8 RB8 TI RI MSB->LSB
SM0、SM1:串行口方式选择位
00b:方式0,移位寄存器方式
01b:方式1,8位UART,波特率可变(T1的溢出率/32或者T1的溢出率/16或者T2的溢出率/16)
10b:方式2,9位UART,波特率为fclk/64或fclk/32
11b:方式3,9位UART,波特率可变(T1的溢出率/32或者T1的溢出率/16或者T2的溢出率/16)
SM2:多机通信控制位。在方式2或方式3中,若SM2=1,则接收到的第9位数据(RB8)为“1”时,置位接收中断标志,否则丢弃接收到的数据;若SM2=0时,则RB8无论为何值,均置位RI。在方式1时,仅在接收到有效停止位时才置位RI,否则丢弃接收到的数据。在方式0中,不使用SM2。
REN:允许接收控制位。由软件置“1”时,允许接收,置“0”时,禁止接收。在方式0时,若REN=1,往发送缓冲区写数据将被忽略。
TB8:在方式2和方式3中要发送的第9位数据。需要时由软件置位或复位。
RB8:在方式2和方式3中是接收到的第9位数据。在方式1时,RB8是接收到的停止位。在方式0中,不使用RB8。
TI:发送中断标志位。在方式0串行发送第8位结束时由硬件置“1”,或在其它方式中串行发送停止位结束时置“1”。必须由软件清“0”。
RI:接收中断标志位。在方式0接收到第8位结束时由硬件置“1”,或其它方式接收到第9位数据位的中间时置“1”。必须由软件请“0”。
3、特殊功能寄存器PCON(87H)
其字节地址87H,没有位寻址功能。与串行口有关的只有PCON的最高位。
PCON(87H) SMOD --- --- --- --- --- -- -- MSB->LSB
SMOD:波特率选择位。当SMOD=1时,波特率加倍。
二、串行口波特率的计算
1、方式0为移位寄存器方式,波特率是固定的:
方式0波特率=fclk/12。
2、方式2为9位UART,波特率与SMOD位有关:
方式2波特率=(2^SMOD/64)*fclk。
3、方式1和方式3的波特率可变,由定时器T1或T2的溢出率控制。T2CON寄存器中TCLK=1或者RCLK=1选择定时器2作为串行口波特率发生器。
当TCLK=1时,方式1和方式3的发送波特率=T2溢出率/16,
当TCLK=0时,方式1和方式3的发送波特率=(2^SMOD/32)*T1的溢出率;
当RCLK=1时,方式1和方式3的接收波特率=T2溢出率/16,
当RCLK=0时,方式1和方式3的接收波特率=(2^SMOD/32)*T1的溢出率。
附上源代码和testbench
https://static.assets-stash.eet-china.com/album/old-resources/2009/4/30/be59e2f1-3eb0-45bc-ac60-dcd988cd2604.rar
文章评论(0条评论)
登录后参与讨论