[ZLG-ARM] 求SPI向量中断的例程

[复制链接]
2745|4
 楼主| bucker 发表于 2009-5-31 23:19 | 显示全部楼层 |阅读模式
我自己编的程序存在一个问题,就是SPI通信后进入中断服务程序后,在服务程序中继续发送数据,但实际上服务程序发送数据后退出后,ARM就再也没有响应SPI中断。<br />#include&nbsp;&nbsp;&quot;config.h&quot;&nbsp;<br /><br />uint32&nbsp;a;<br /><br />void&nbsp;__irq&nbsp;IRQ_SPI&nbsp;(void)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*SPI中断服务程序*/<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(++a&nbsp;&lt&nbsp;3)&nbsp;S0PDR&nbsp;=&nbsp;0x44;<br />&nbsp;&nbsp;&nbsp;&nbsp;S0PINT&nbsp;=&nbsp;0x01;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;清除中断标志&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;VICVectAddr&nbsp;=&nbsp;0x00;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;通知VIC中断处理结束&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/<br />}<br /><br />int&nbsp;main&nbsp;(void)<br />{&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;a&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;PINSEL0&nbsp;=&nbsp;0x00005500;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;设置SPI管脚连接<br />&nbsp;&nbsp;&nbsp;&nbsp;PINSEL1&nbsp;=&nbsp;0x00000000;<br />&nbsp;&nbsp;&nbsp;&nbsp;SPCCR&nbsp;=&nbsp;0x52;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;设置SPI时钟分频<br />&nbsp;&nbsp;&nbsp;&nbsp;SPCR&nbsp;&nbsp;=&nbsp;(0&nbsp;&lt&lt&nbsp;3)&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;CPHA&nbsp;=&nbsp;0,&nbsp;数据在SCK&nbsp;的第一个时钟沿采样<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(1&nbsp;&lt&lt&nbsp;4)&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;CPOL&nbsp;=&nbsp;1,&nbsp;SCK&nbsp;为低有效<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(1&nbsp;&lt&lt&nbsp;5)&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;MSTR&nbsp;=&nbsp;1,&nbsp;SPI&nbsp;处于主模式<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(0&nbsp;&lt&lt&nbsp;6)&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;LSBF&nbsp;=&nbsp;0,&nbsp;SPI&nbsp;数据传输MSB&nbsp;(位7)在先<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(1&nbsp;&lt&lt&nbsp;7);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;SPIE&nbsp;=&nbsp;0,&nbsp;SPI&nbsp;中断被使能<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;IRQEnable();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;IRQ中断使能&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;设置SPI中断IRQ&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;VICIntSelect&nbsp;=&nbsp;0x00;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;所有中断通道设置为IRQ中断&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;VICVectCntl5&nbsp;=&nbsp;0x20&nbsp;|&nbsp;0x0A;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;设置SPI中断通道分配最高优先级&nbsp;&nbsp;&nbsp;&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;VICVectAddr5&nbsp;=&nbsp;(uint32)IRQ_SPI;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;设置中断服务程序地址&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;VICIntEnable&nbsp;=&nbsp;1&nbsp;&lt&lt&nbsp;0x0A;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;使能SPI中断&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;S0PDR&nbsp;=&nbsp;0x33;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*随意发送数据*/<br />&nbsp;&nbsp;&nbsp;&nbsp;while&nbsp;(1);<br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0;<br />}<br />正常结束时,a应该等于3,而调试的结果是a等于1,我不知道问题出在哪里了,请各位大侠指教。<br />
armpc 发表于 2009-6-1 11:15 | 显示全部楼层

好好研究一下

  
 楼主| bucker 发表于 2009-6-1 18:38 | 显示全部楼层

问题已解决

  
iciciu 发表于 2009-9-1 17:13 | 显示全部楼层
提问题后,自己解决了,也要说下是怎么解决的呀,后来人好看一下嘛。。
hmsfeng 发表于 2009-9-1 19:34 | 显示全部楼层
这样可能会中断嵌套吧.
您需要登录后才可以回帖 登录 | 注册

本版积分规则

27

主题

82

帖子

1

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