我的串口发送中断标志不能清除

[复制链接]
5810|11
 楼主| ms 发表于 2007-10-14 20:38 | 显示全部楼层 |阅读模式
我的串口发送中断标志不能清除<br />我准备发送六个数,在主程序里发一个就不管了,发送完成进中断后在在中断服务程序里发送其它的五个。可是进了中断后我已经读了一下SCIS1,可是SCIS1_TDRE没有被清除,发送完六个后又自己进来了,于是它就发个不停,不知是怎么回事?<br />__interrupt&nbsp;void&nbsp;isrVscitx(void)<br />{<br /><br />&nbsp;&nbsp;if&nbsp;(SCIS1_TDRE)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;SciTmp&nbsp;=&nbsp;SCIS1;<br />&nbsp;&nbsp;&nbsp;&nbsp;SendDataTimes++;<br />&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(SendDataTimes&nbsp;&gt=&nbsp;6)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PTBD_PTBD7&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SendDataTimes&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SCID&nbsp;=&nbsp;TimeSend[SendDataTimes];<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;}<br />}
张明峰 发表于 2007-10-14 21:22 | 显示全部楼层

能清除才怪呢

只要发送寄存器是空的,该标志就有效。这是硬件决定的,软件无法干预。<br />软件可以清除另外一个位,自己好好想想应该怎么做。
 楼主| ms 发表于 2007-10-14 21:54 | 显示全部楼层

中断允许位是可以软件清除的

嗯,知道了,中断允许位是可以软件清除的.<br />改了程序,中断里清除中断允许位就可以了.<br />谢教主!<br />__interrupt&nbsp;void&nbsp;isrVscitx(void)<br />{<br />&nbsp;&nbsp;/*&nbsp;Write&nbsp;your&nbsp;interrupt&nbsp;code&nbsp;here&nbsp;...&nbsp;*/<br />&nbsp;&nbsp;if&nbsp;(SCIS1_TDRE)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;SciTmp&nbsp;=&nbsp;SCIS1;<br />&nbsp;&nbsp;&nbsp;&nbsp;SCIC2_TIE&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;SendDataTimes++;<br />&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(SendDataTimes&nbsp;&gt=&nbsp;6)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PTBD_PTBD7&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SendDataTimes&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SCID&nbsp;=&nbsp;TimeSend[SendDataTimes];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SCIC2_TIE&nbsp;=&nbsp;1;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;}<br />}
张明峰 发表于 2007-10-14 21:59 | 显示全部楼层

应该是在全部发送完毕后关闭中断使能

上面的结构有点乱<br />把“SCIC2_TIE&nbsp;=&nbsp;0;”搬到“if&nbsp;(SendDataTimes&nbsp;&gt=&nbsp;6)”条件中可能更好。<br />__interrupt&nbsp;void&nbsp;isrVscitx(void)<br />{<br />&nbsp;&nbsp;/*&nbsp;Write&nbsp;your&nbsp;interrupt&nbsp;code&nbsp;here&nbsp;...&nbsp;*/<br />&nbsp;&nbsp;if&nbsp;(SCIS1_TDRE)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;SciTmp&nbsp;=&nbsp;SCIS1;<br />&nbsp;&nbsp;&nbsp;&nbsp;SendDataTimes++;<br />&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(SendDataTimes&nbsp;&gt=&nbsp;6)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PTBD_PTBD7&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SendDataTimes&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SCIC2_TIE&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SCID&nbsp;=&nbsp;TimeSend[SendDataTimes];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//SCIC2_TIE&nbsp;=&nbsp;1;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;}<br />}<br />
 楼主| ms 发表于 2007-10-15 13:08 | 显示全部楼层

收到了,谢谢,脑袋一时没转过来。

  
张明峰 发表于 2007-10-15 19:21 | 显示全部楼层

要我写会是这样

中断:<br />__interrupt&nbsp;void&nbsp;isrVscitx(void)<br />{<br />&nbsp;&nbsp;/*&nbsp;Write&nbsp;your&nbsp;interrupt&nbsp;code&nbsp;here&nbsp;...&nbsp;*/<br />&nbsp;&nbsp;if&nbsp;(SCIS1_TDRE)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;SCIS1;<br />&nbsp;&nbsp;&nbsp;&nbsp;SCID&nbsp;=&nbsp;TimeSend[SendDataTimes++];<br />&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(SendDataTimes&nbsp;&gt&nbsp;5)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PTBD_PTBD7&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SendDataTimes&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SCIC2_TIE&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;}<br />}<br /><br />启动发送:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;...填入发送数据,然后<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SendDataTimes&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SCIC2_TIE&nbsp;=&nbsp;1;<br />
 楼主| ms 发表于 2007-10-17 09:03 | 显示全部楼层

我的心路历程

我的心路历程<br />以下是我看了程序后的思路<br /><br />呵呵,教主也有糊涂的时候<br />在主程序里发送完第一个TimeSend[0]后进来中断的时候,你用SCID&nbsp;=&nbsp;TimeSend[SendDataTimes++]发送,这时SendDataTimes还是0,那它不是把TimeSend[0]又发送了一遍...<br />噢,慢着,<br />“启动发送:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;...填入发送数据,然后<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SendDataTimes&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SCIC2_TIE&nbsp;=&nbsp;1;<br />”<br />这里没提到发送TimeSend[0]呀?不发送怎么进发送中断,呵呵,教主也有糊涂的时候...<br />噢,慢着,<br />“<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SCIC2_TIE&nbsp;=&nbsp;1;<br />”<br />这句话有**,允许中断,发送寄存器又是空的,这时不就立刻进了中断了,哈哈,妙啊!原来中断还可以这样进。<br /><br />对于“++”的用法,你这样用确实比我的方法好得多,先用&nbsp;再加&nbsp;然后边界判断,比我的先加&nbsp;然后边界判断&nbsp;没问题再用要好得多,看懂了,学习了。<br /><br />手册里说,当SCIS1_TDRE是1的时候要先读SCIS1再写数据到SCID,我读用的是SciTmp&nbsp;=&nbsp;SCIS1;,你读用的是SCIS1;这一招省了一个临时变量,你是从哪里知道的,我也想去那学学。
徐明明6624 发表于 2013-7-29 17:13 | 显示全部楼层
我用的是mc9s12xet256,中断向量表如下
#define VectorNumber_Vsi                119
#define VectorNumber_Vsyscall           118
#define VectorNumber_Vmpuaccesserr      117
#define VectorNumber_Vxsei              116
#define VectorNumber_VReserved115       115
#define VectorNumber_VReserved114       114
#define VectorNumber_VReserved113       113
#define VectorNumber_VReserved112       112
#define VectorNumber_VReserved111       111
#define VectorNumber_VReserved110       110
#define VectorNumber_VReserved109       109
#define VectorNumber_VReserved108       108
#define VectorNumber_VReserved107       107
#define VectorNumber_VReserved106       106
#define VectorNumber_VReserved105       105
#define VectorNumber_VReserved104       104
#define VectorNumber_VReserved103       103
#define VectorNumber_VReserved102       102
#define VectorNumber_VReserved101       101
#define VectorNumber_VReserved100       100
#define VectorNumber_VReserved99        99
#define VectorNumber_VReserved98        98
#define VectorNumber_Vatd1compare       97
#define VectorNumber_Vatd0compare       96
#define VectorNumber_VReserved95        95
#define VectorNumber_VReserved94        94
#define VectorNumber_VReserved93        93
#define VectorNumber_VReserved92        92
#define VectorNumber_VReserved91        91
#define VectorNumber_VReserved90        90
#define VectorNumber_VReserved89        89
#define VectorNumber_VReserved88        88
#define VectorNumber_VReserved87        87
#define VectorNumber_VReserved86        86
#define VectorNumber_VReserved85        85
#define VectorNumber_VReserved84        84
#define VectorNumber_VReserved83        83
#define VectorNumber_VReserved82        82
#define VectorNumber_VReserved81        81
#define VectorNumber_VReserved80        80
#define VectorNumber_VReserved79        79
#define VectorNumber_VReserved78        78
#define VectorNumber_Vxst7              77
#define VectorNumber_Vxst6              76
#define VectorNumber_Vxst5              75
#define VectorNumber_Vxst4              74
#define VectorNumber_Vxst3              73
#define VectorNumber_Vxst2              72
#define VectorNumber_Vxst1              71
#define VectorNumber_Vxst0              70
#define VectorNumber_Vpit3              69
#define VectorNumber_Vpit2              68
#define VectorNumber_Vpit1              67
#define VectorNumber_Vpit0              66
#define VectorNumber_Vhti               65
#define VectorNumber_Vapi               64
#define VectorNumber_Vlvi               63
#define VectorNumber_VReserved62        62
#define VectorNumber_Vsci5              61
#define VectorNumber_Vsci4              60
#define VectorNumber_Vsci3              59
#define VectorNumber_Vsci2              58
#define VectorNumber_Vpwmesdn           57
#define VectorNumber_Vportp             56
#define VectorNumber_Vcan4tx            55
#define VectorNumber_Vcan4rx            54
#define VectorNumber_Vcan4err           53
#define VectorNumber_Vcan4wkup          52
#define VectorNumber_VReserved51        51
#define VectorNumber_VReserved50        50
#define VectorNumber_VReserved49        49
#define VectorNumber_VReserved48        48
#define VectorNumber_VReserved47        47
#define VectorNumber_VReserved46        46
#define VectorNumber_VReserved45        45
#define VectorNumber_VReserved44        44
#define VectorNumber_Vcan1tx            43
#define VectorNumber_Vcan1rx            42
#define VectorNumber_Vcan1err           41
#define VectorNumber_Vcan1wkup          40
#define VectorNumber_Vcan0tx            39
#define VectorNumber_Vcan0rx            38
#define VectorNumber_Vcan0err           37
#define VectorNumber_Vcan0wkup          36
#define VectorNumber_Vflash             35
#define VectorNumber_Vflashfd           34
#define VectorNumber_Vspi2              33
#define VectorNumber_Vspi1              32
#define VectorNumber_Viic0              31
#define VectorNumber_Vsci6              30
#define VectorNumber_Vcrgscm            29
#define VectorNumber_Vcrgplllck         28
#define VectorNumber_Vectpabovf         27
#define VectorNumber_Vectmdcu           26
#define VectorNumber_Vporth             25
#define VectorNumber_Vportj             24
#define VectorNumber_Vatd1              23
#define VectorNumber_Vatd0              22
#define VectorNumber_VSCI5              21
#define VectorNumber_Vsci0              20
#define VectorNumber_Vspi0              19
#define VectorNumber_Vectpaie           18
#define VectorNumber_Vectpaaovf         17
#define VectorNumber_Vectovf            16
#define VectorNumber_Vectch7            15
#define VectorNumber_Vectch6            14
#define VectorNumber_Vectch5            13
#define VectorNumber_Vectch4            12
#define VectorNumber_Vectch3            11
#define VectorNumber_Vectch2            10
#define VectorNumber_Vectch1            9
#define VectorNumber_Vectch0            8
#define VectorNumber_Vrti               7
#define VectorNumber_Virq               6
#define VectorNumber_Vxirq              5
#define VectorNumber_Vswi               4
#define VectorNumber_Vtrap              3
#define VectorNumber_Vcop               2
#define VectorNumber_Vclkmon            1
#define VectorNumber_Vreset             0

串口0只有一个中断VectorNumber_Vsci0,不知道是发送中断还是接收中断,怎么用?
pyh921 发表于 2013-8-5 11:58 | 显示全部楼层
老贴都被挖出来了……
可以判断标志为来判断是发送还是接收
徐明明6624 发表于 2013-8-7 09:35 | 显示全部楼层
嗯 现在知道了 因为第一次用飞思卡尔单片机 有很多问题
wangwei707707 发表于 2013-10-9 20:56 | 显示全部楼层
我也遇到了一个问题,我已经实现两个单片机主从中断收发,但是反过来就不行了。就是从机在接收到主机发送的数据后,判断无误后,回发一个数据到主机,主机不能实现接收,就是从机还没有发呢,主机就一直进入中断,求解????????
wangwei707707 发表于 2013-10-9 20:58 | 显示全部楼层
主机,从机收发都是用中断,现在的问题是主机还没有收到从机发来的数据,就一直进入中断,这是为什么呢?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

ms

3

主题

31

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部