查看: 14244|回复: 15

[已解决] K60 串口发送中断的问题(已解决)

[复制链接]

该用户从未签到

10

主题

47

帖子

0

注册会员

Rank: 2

积分
144
最后登录
1970-1-1
发表于 2013-10-10 11:34:44 | 显示全部楼层 |阅读模式
根据手册讲的,如果要清除发送完成标志(TC),需要先读UART_S1,然后三种方法选一种(见后面的截图),其中第一种就是往UART_D寄存器中写入一个新的值。这种清除的方式似乎和其他处理器不同,其他处理器一般都是进中断,自动清掉或者手工清掉。
现在说我遇到的问题:
我毎隔一秒发送一帧数据,一帧数据包含10字节的数据,我采用发送中断的方式来处理,不用FIFO的方式,毎发送一个字节,进入一次中断,然后发下一个字节。当我发送完最后一个字节,会产生一个中断,进入中断服务程序,这时我需要清发送完成标志(如果不清会反复进中断),如果采用第一种方式清,那么势必还会发送第11个字节,然后还会进中断。这和我的初衷不一样。遇到这种问题我该如何处理?
另外还有一个问题:如果上电初始化设置好发送完成中断后,会马上产生一次发送完成中断(其实没有真正发送一个字节),是这样的吗?
3.JPG
我知道答案 目前已有14人回答
回复

使用道具 举报

该用户从未签到

124

主题

3600

帖子

0

金牌会员

Rank: 6Rank: 6

积分
5781
最后登录
1970-1-1
发表于 2013-10-10 13:54:27 | 显示全部楼层

回复:K60 串口发送中断的问题

 针对你的第一个问题,你可以在发送第十个字节数据后采用第二个方法清除TC标志。
第二个问题中提到设置完成后进入中断是自己手动修改TC值为1吗?但如下图所示,TC是不可写的.
7.jpg
 
 
回复 支持 反对

使用道具 举报

  • TA的每日心情
    难过
    2021-12-15 16:01
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    305

    主题

    4701

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    377
    最后登录
    2023-8-16
    发表于 2013-10-10 14:26:32 | 显示全部楼层

    RE:K60 串口发送中断的问题

    发送完数据以后直接关闭串口中断就可以了。下次需要发的时候,在开启中断。
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    10

    主题

    47

    帖子

    0

    注册会员

    Rank: 2

    积分
    144
    最后登录
    1970-1-1
     楼主| 发表于 2013-10-10 14:51:41 | 显示全部楼层

    回复:K60 串口发送中断的问题

    回复第 2 楼 于2013-10-10 13:54:27发表:
     针对你的第一个问题,你可以在发送第十个字节数据后采用第二个方法清除TC标志。
    第二个问题中提到设置完成后进入中断是自己手动修改TC值为1吗?但如下图所示,TC是不可写的.

     
     
     

    1. 的确,我刚刚也是仔细看了一下手册,是要用第二种方法来清TC,但第二种方法(Queuing a preamble by clearing and then setting the C2[TE])我就是没有读懂,到底具体的操作是什么?能把语句写出来吗?
    2.我的意思是我在初始化里面就开了发送完成中断(设置UART_C2),这个时候还没有往UART_D里面写数据,程序就直接跑到中断服务程序里面去了(TC实际已经被自动置1了)。这个现象正常吗?(我后来也详细研究了文档,发现的确是这样设计的。)
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    124

    主题

    3600

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    5781
    最后登录
    1970-1-1
    发表于 2013-10-10 14:57:47 | 显示全部楼层

    回复:K60 串口发送中断的问题

    回复第 4 楼 于2013-10-10 14:51:41发表:
    回复第 2 楼 于2013-10-10 13:54:27发表:
     针对你的第一个问题,你可以在发送第十个字节数据后采用第二个方法清除TC标志。
    第二个问题中提到设置完成后进入中断是自己手动修改TC值为1吗?但如下图所示,TC是不可写的.

     
     
     

    1. 的确,我刚刚也是仔细看了一下手册,是要用第二种方法来清TC,但第二种方法(Queuing a preamble by clearing and then setting the C2[TE])我就是没有读懂,到底具体的操作是什么?能把语句写出来吗?
    2.我的意思是我在初始化里面就开了发送完成中断(设置UART_C2),这个时候还没有往UART_D里面写数据,程序就直接跑到中断服务程序里面去了(TC实际已经被自动置1了)。这个现象正常吗?(我后来也详细研究了文档,发现的确是这样设计的。)
     
    1.第二种方法的代码操作应该是先清零TE,跟着置位TE吧,You can have a try.
    2.能告诉我文档中对没有往UART_D里面写数据,程序就直接跑到中断服务程序里的描述在那一页吗?
     
     
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    10

    主题

    47

    帖子

    0

    注册会员

    Rank: 2

    积分
    144
    最后登录
    1970-1-1
     楼主| 发表于 2013-10-10 15:58:26 | 显示全部楼层

    回复:K60 串口发送中断的问题

    回复第 5 楼 于2013-10-10 14:57:47发表:
    回复第 4 楼 于2013-10-10 14:51:41发表:
    回复第 2 楼 于2013-10-10 13:54:27发表:
     针对你的第一个问题,你可以在发送第十个字节数据后采用第二个方法清除TC标志。
    第二个问题中提到设置完成后进入中断是自己手动修改TC值为1吗?但如下图所示,TC是不可写的.

     
     
     

    1. 的确,我刚刚也是仔细看了一下手册,是要用第二种方法来清TC,但第二种方法(Queuing a preamble by clearing and then setting the C2[TE])我就是没有读懂,到底具体的操作是什么?能把语句写出来吗?
    2.我的意思是我在初始化里面就开了发送完成中断(设置UART_C2),这个时候还没有往UART_D里面写数据,程序就直接跑到中断服务程序里面去了(TC实际已经被自动置1了)。这个现象正常吗?(我后来也详细研究了文档,发现的确是这样设计的。)
     
    1.第二种方法的代码操作应该是先清零TE,跟着置位TE吧,You can have a try.
    2.能告诉我文档中对没有往UART_D里面写数据,程序就直接跑到中断服务程序里的描述在那一页吗?
     
     

     

    1. 我已经试过了,好像没用,清不掉TC。迫切希望正确答案!
    2.. 在51.8.1里面,手册中提到“发送移位寄存器为空,TC就会指示1”。
    4.JPG
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    难过
    2021-12-15 16:01
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    305

    主题

    4701

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    377
    最后登录
    2023-8-16
    发表于 2013-10-10 16:35:53 | 显示全部楼层

    RE:K60 串口发送中断的问题

    数据发送完毕以后,TC当然要置1了。表示当前发送寄存器为空。中断发送完串口数据以后,要关闭发送中断。再下次用的时候再开启。不然会一直进入中断。我在M3上都是这样用的。
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    难过
    2021-12-15 16:01
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    305

    主题

    4701

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    377
    最后登录
    2023-8-16
    发表于 2013-10-10 16:48:37 | 显示全部楼层

    RE:K60 串口发送中断的问题

    可以看一下TC清除的条件。
    TC is cleared by
    reading S1 with TC set and then doing one of the following: When C7816[ISO_7816E] is set/enabled, this
    field is set after any NACK signal has been received, but prior to any corresponding guard times
    expiring.When C6[EN709] is set/enabled, this flag is not set on transmit packet completion.
    • Writing to D to transmit new data.
    • Queuing a preamble by clearing and then setting C2[TE].
    • Queuing a break character by writing 1 to SBK in C2.
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    10

    主题

    47

    帖子

    0

    注册会员

    Rank: 2

    积分
    144
    最后登录
    1970-1-1
     楼主| 发表于 2013-10-10 16:53:53 | 显示全部楼层

    回复:K60 串口发送中断的问题

    回复第 7 楼 于2013-10-10 16:35:53发表:
    数据发送完毕以后,TC当然要置1了。表示当前发送寄存器为空。中断发送完串口数据以后,要关闭发送中断。再下次用的时候再开启。不然会一直进入中断。我在M3上都是这样用的。 

    关闭中断的方法确实可以解决我的问题。
    我是希望在不关闭中断的情况,发送完最后一个字节后进中断,是否有方法能清掉TC,手册中确实提到了有第二种方法(Queuing a preamble by clearing and then setting the C2[TE]),这种方法不同于往发送寄存器中写新的数据。难道用了第二种方法,也是短暂的清成0后,马上又检测到发送寄存器为空,TC又置成1了?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    难过
    2021-12-15 16:01
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    305

    主题

    4701

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    377
    最后登录
    2023-8-16
    发表于 2013-10-10 17:11:18 | 显示全部楼层

    RE:K60 串口发送中断的问题

    我理解是短暂的清0。如果可以清0,那么你下次发送的时候,需要如何把他置1呢?关闭和开启中断是最直接有效的方法。
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-7-19 20:16 , Processed in 0.118904 second(s), 31 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表