打印

串口中断TI何时被触发,请解惑

[复制链接]
1681|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 justdoit2008 于 2014-9-23 09:20 编辑

最近看到一个串口中断的例子
void CommINT() interrupt 4
{
        if(RI)
        {        
                RI = 0;                              
                if(Flag == 1)
                {      
                    RxBuff[RxCount] = SBUF;   
                。。。。。。
                }                                 
                RxCount++;
                。。.。。
              }
        if(TI)
        {   
                TI = 0;
        。。。。
                                SBUF = response[Index++];
                。。。。
                }
        }
当有串口数据时则RI=1,执行RI后面的程序。
但是什么时候TI才会为1,执行TI=1后面的程序呢?望解惑!?
一般人好像都是在其他函数中对SBUF写数据的。

相关帖子

沙发
ayb_ice| | 2014-9-23 05:45 | 只看该作者
字节发送完成或软件置位

使用特权

评论回复
板凳
wh6ic| | 2014-9-23 08:42 | 只看该作者
没人会这么增加接收指针的吧...

在接收到一个完整的字节后TI会自动置位,当然用户也可以软件操作这个Bit。

QQ图片20140923083830.png (1.88 KB )

QQ图片20140923083830.png

使用特权

评论回复
地板
ayb_ice| | 2014-9-23 08:53 | 只看该作者
wh6ic 发表于 2014-9-23 08:42
没人会这么增加接收指针的吧...

在接收到一个完整的字节后TI会自动置位,当然用户也可以软件操作这个Bit。 ...

这是发送,不是接收

使用特权

评论回复
评论
wh6ic 2014-9-24 08:33 回复TA
前面一句话是讲的 RI,是接收。 
5
justdoit2008|  楼主 | 2014-9-23 09:16 | 只看该作者
ayb_ice 发表于 2014-9-23 05:45
字节发送完成或软件置位

发送完成后TI会自动置1?可是,除了这里,没有其他地方有对SBUF的操作啊。也没有地方对TI置1,只是每次发数据时会执行SBUF=response[index++]。
到底是什么时候才会触发串口中断并且TI=1呢。。

使用特权

评论回复
评论
wh6ic 2014-9-24 08:36 回复TA
执行 SBUF=res... 这句话,随后SBUF中的八Bit数据一位位串行发送完毕,TI就会自动置位。 
6
ayb_ice| | 2014-9-23 09:34 | 只看该作者
本帖最后由 ayb_ice 于 2014-9-23 09:36 编辑
justdoit2008 发表于 2014-9-23 09:16
发送完成后TI会自动置1?可是,除了这里,没有其他地方有对SBUF的操作啊。也没有地方对TI置1,只是每次发 ...

不说了,字节发送完自动置位吗,

一般发送前肯定要先发个字节,或者软件置位TI的,这就是启动发送

你程序有没有问题,我不知道了

使用特权

评论回复
7
hate232313| | 2014-9-23 13:02 | 只看该作者
学习了~~~

使用特权

评论回复
8
m564522634| | 2014-9-23 16:59 | 只看该作者
TI是发送完一个字节后会自动置位的,我不知道你对什么有问题了。

使用特权

评论回复
9
NWPU_CHEN| | 2014-9-24 13:16 | 只看该作者
justdoit2008 发表于 2014-9-23 09:16
发送完成后TI会自动置1?可是,除了这里,没有其他地方有对SBUF的操作啊。也没有地方对TI置1,只是每次发 ...

发送完毕TI置1,引发中断,在中断中TI==1的sbuf是取下一次的发送数据,数据是自动发动的,只要SBUF中有数据,TI保持0,就一直发送

使用特权

评论回复
10
zwz7219| | 2014-9-24 14:47 | 只看该作者
上面的多个朋友都说是在发送完成后,设置 TI 位,其实是错的,触发此中断的时机应该在数据从 SBUF 到移位发送器时,在中断中,你可以写入下一个需要发送的数据到 SBUF,当上一个数据发送完成后,下一个数据立即转移到移位发送器,以便两个数据的发送做到“无缝”连接。

这段程序是用在 51 类单片机上,如果在其它单片机(如 PIC),对于串口发送,它通常有两个中断,一个是发送寄存器空中断,对应 51 的上述中断。

另一个是发送完成中断,它才是整个发送过程的结束,触发时机是在发送最后一个字节的停止位时。

PIC 单片机的发送空中断平时置 0,需要发送时,准备好发送数据,然后将此位置 1,在中断中设置发送缓冲寄存器,然后退出中断,硬件将数据转移到发送移位寄存器器,立即重新触发此中断,进入中断后,如果还有后续数据需要发送,则将数据写入发送缓冲寄存器,如果没有,则将发送空中断置 0,完成此次发送。

而 51 类的单片机,需要在主程序中写入一个数据到发送缓冲寄存器,以引发此中断,以便后续处理。

发送完成中断在某些应用中是有用的,如在串口基础上的 MODBUS 协议,要求发送的两帧数据间至少间隔 3.5 个字符,很明显,计时器的启动应在发送完成中断中设定,如果在发送空中断中设定,需要把定时器设定为至少发送 4.5 个字符需要的时间。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

10

帖子

0

粉丝