📄 pic16cxxx-1-6.htm
字号:
<p align="center"><img src="image/a119.gif" width="569" height="192"></p>
<p align="center"> b. 两个数连续发送 </p>
<p align="center">图1.51 异步主控器发送时序</p>
<p><br>
综上所述,一旦选择异步发送方式,需做下面几点:<br>
1. 选择波特率,然后把相应的值置入SPBRG,如果是高速波特率,应置BRGH=1。<br>
2. 置SYNC=0及SPEN=1。<br>
3. 如果需要中断,置TXIE(PIE1<4>)=1。<br>
4. 如果要传送9位数据,置TX8/9=1。<br>
5. 置TXEN=1,激活发送器。<br>
6. 如果传送9位数据,这时要把第9位置入TXD8。<br>
7. 把发送数据(8位)送入TXREG。<br>
8. 硬件开始自动发送(TX线上有串行信号输出)。</p>
<p><img src="image/a120.gif" width="681" height="377"></p>
<p>二、SCI异步接收器<br>
串行接收信号来自RX线,经接收器接收后变为并行数据供CPU读取。SCI 异步接收器的核心是"接收移位寄存器"RSR,一旦采样到停止位,RSR即把收到的数据送入RCREG,接着产生中断请求(置RCIF=1)。RCIF位也不能由软件清为零,而是必须待RCREG中的数据被CPU读出后,才由硬件清为零。
<br>
RCREG实际上是双缓冲寄存器,可看作是2层的先进先出(FIFO)堆栈。CPU可连续读二次RCREG把栈中的二个数取出。这样它就允许接收二个数据存放在栈中,同时第三个数据正在接收中。一旦检测到第三个数据的停止位,如果RCREG堆栈仍是满的(二个缓冲器都还装着前二个接收到的数据),溢出标志位OERR(RCSTA<1>)将会被置为1,而在RSR寄存器中的数据将丢失。<br>
</p>
<p align="center"><img src="image/a121.gif" width="577" height="274"></p>
<p align="center">图1.52 SCI异步接收器方块图</p>
<p>OERR位须由软件清零,这可以通过置接收使能位CREN(RCSTA<4>)=1来实现。当OERR
被置1后,RSR中的数据即不能送入RCREG,所以必须用软件将其恢复清零才能使接收工作继续下去。<br>
如果收到的停止位是"0",则发生帧错误,其标志位FERR(RCSTA<2>)被置为"1"。CPU读RCREG缓冲器,将会使RCD8(RCSTA<0>)和FERR(RCSTA<2>)载入新的值,所以用户程序在读RCREG之前,应先读RCSTA以免弄失掉该数据对应的RCD8和FERR值。</p>
<p align="center"><img src="image/a122.gif" width="574" height="208"></p>
<p align="center">图1.53 SCI异步接收时序</p>
<p>综上所述,一旦选择异步接收方式,需做下面几点:<br>
1. 选择波特率,然后算出SPBRG中应有的值并将其置入SPBRG中。如果是高速波特率,还应置BRGH=1。<br>
2. SYNC=0及SPEN=1。<br>
3. 如需中断,置RCIE(PIE1<5>)=1。<br>
4. 如需接收9位数据,置RX8/9=1。<br>
5. 置CREN=1,激活接收器。<br>
6. 当一个字节接收完成后,发中断请求(RCIF=1)。<br>
7. 读RCSTA以便读取数据第9位(如果需要的话)以及判断是否发生任何接收上的错误。<br>
8. 读RCREG。<br>
9. 如果发生任何接收错误,置CREN=0以清除错误。</p>
<p><img src="image/a123.gif" width="667" height="372"></p>
<p>§1.12.4 SCI同步主控模式<br>
<br>
在同步主控器方式下,数据的传输是以半双工的方式进行。通过置SYNC(TXSTA<1>)=
1可选择该工作模式。另外还应置SPEN(RCSTA<7>)=1,以使RC6脚和RC7脚可分别作为时钟线CK和数据线DT,主控模式下由CPU发出时钟信号。<br>
置CSRC(TXSTA<7>)=1即进入SCI同步主控方式。<br>
<br>
一、SCI同步主控发送<br>
SCI发送器结构见图1.47。移位寄存器TSR从TXREG取得要发送的数据,一旦TXREG
把数据传给TSR后,中断位TXIF(PIR1(4))=1发出中断请求。当新的数据由程序载入TXREG后,TXIF清为零。TXIF位表示了TXREG的状态(空或满),而TRMT位(TXSTA<1>)表示TSR的状态。当TSR中的数据移位送出后,TRMT=1,但是注意这并不会产生中断请求,所以用户程序必须靠程序查询方式来判断TSR是否为空,另外TSR
不对用户程序开放,程序不能对它直接读/写。设置TXEN(TXSTA<5>)=1启动发送。但实际上要TXREG载入数据后才会开始发送。第一个数据位将在下一个时钟(CK)上升沿移出发送,并在下降沿后稳定下来,如下图所示。</p>
<p align="center"><img src="image/a124.gif" width="573" height="212"></p>
<p align="center">a. </p>
<p align="center"><img src="image/a125.gif" width="571" height="202"></p>
<p align="center"> b <br>
<br>
图1.54 SCI 同步发送时序<br>
</p>
用户也可以先把发送数据载入TXREG,然后再置TXEN=1来启动发送,这样对于低波特率传送和连续传送会更好些。<br>
在传送过程中如果用户程序清TXEN=0则会使发送中断并复位发送器。DT线和CK线变成高阻态(输入态)。如果在数据发送过程中,接收使能位CREN(RCSTA<4>)和SREN(RCSTA<5>)被程序置为1,则DT线变成输入态而CK线保持为输出态,发送器不会被复位。如果这时用户要复位发送器就要清TXEN=0。<br>
如果用户希望中止正在进行的数据传送转而接收一个外部送来的数,可以置SREN=1。<br>
当这个新数据接收完毕后SREN恢复为0。同时由于这时TXEN位仍保持为1,就会使SCI重新回到发送状态,DT线将马上从输入态再转回到输出态。如果用户不希望回到发送状态,则应及时清TXEN=0。<br>
为了发送9位数据,TX8/9(TXSTA<6>)必须置为1,并且把第9位数载入TXD8(TXSTA<0>)。注意,应先把第9位数据载入TXD8,再把前8位载入TXREG。这是因为一旦把前8位数置入TXREG后,要发送的9位数马上会转载入TSR中准备移位发送,所以如果先载前8位数进TXREG,
则TSR中载入的第9位数将是上次的第9位数而不是最新的。<br> 综上所述,建立SCI同步主控发送需如下步骤:<br>
1. 初始化波特率寄存器SPBRG以获得想要的波特率;<br>
2. 使能同步主控串行口(置SYNC=1、SPEN=1和CSRC=1);<br>
3. 如果需要中断功能,则置TXIE=1;<br>
4. 如果传送的数是9位,置TX8/9=1;<br>
5. 使能发送模式(置TXEN=1);<br>
6. 如果传送9位数,把第9位数载入TXD8;<br>
7. 把8位数载入TXREG,启动发送。<br>
下表是和同步主控发送有关的寄存器。<br> <br> <div align="center">
<p><img src="image/a126.gif" width="680" height="377"><br>
</p>
</div>
<p align="right"> <a href="PIC16Cxxx-1-5.htm">上一页</a> <a href="PIC16Cxxx-1-7.htm">
下一页</a></p>
<p><a href="PIC16Cxxx-1.htm">第一章</a> <a href="PIC16Cxxx-2.htm">第二章</a>
<a href="PIC16Cxxx-3.htm">第三章</a> <a href="PIC16Cxxx-4.htm">第四章</a>
<a href="PIC16Cxxx-5.htm">第五章</a> <a href="PIC16Cxxx-6.htm">第六章</a>
<a href="PIC16Cxxx-7.htm">第七章</a> <a href="PIC16Cxxx-8.htm">第八章</a>
<a href="PIC16Cxxx-9.htm">第九章</a> <a href="PIC16Cxxx-10.htm">第十章</a></p></td>
</tr>
</table>
<table width="700" border="0" cellspacing="0" cellpadding="0">
<tr>
<td width="20"> </td>
<td> </td>
</tr>
</table>
<table width="700" border="0" cellspacing="0" cellpadding="0">
<tr bgcolor="#990000">
<td height="1" width="634"></td>
</tr>
<tr align="right">
<td height="6"></td>
</tr>
<tr align="right">
<td><font color="#990000" size="2">[ <a href="index.htm">返回</a> ]</font>
</td>
</tr>
<tr>
<td> </td>
</tr>
<tr>
<td> </td>
</tr>
</table></td>
</tr>
</table>
</body>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -