[ZLG-ARM] 有没有人做过SPI从机?我在坛子里找了,没找到答案

[复制链接]
3212|4
 楼主| twb0906 发表于 2008-9-20 11:17 | 显示全部楼层 |阅读模式
&nbsp;&nbsp;LPC2103做SPI从机,只接数据,采用中断方式,可是中断总是进入几次后程序就死机了?<br />  不知道是怎么回事,大家帮帮记忙!<br />
walnutcy 发表于 2008-9-20 11:56 | 显示全部楼层

SPI从机一般会由CLK信号抖动,而收错数据,

要注意出错标志处理,<br /><br />没用过LPC的,&nbsp;&nbsp;用8位机的SPI从机的经验
 楼主| twb0906 发表于 2008-9-20 12:14 | 显示全部楼层

标志处理上,我已经做过了,还是不行,请往下看。

&nbsp;SPI初始化<br />INT8U&nbsp;SPI0SInit(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;INT16U&nbsp;&nbsp;&nbsp;&nbsp;stemp;<br />&nbsp;&nbsp;&nbsp;&nbsp;INT32U&nbsp;&nbsp;&nbsp;&nbsp;ltemp;<br />&nbsp;&nbsp;&nbsp;&nbsp;//SPI0&nbsp;&nbsp;&nbsp;&nbsp;引脚定义<br />&nbsp;&nbsp;&nbsp;&nbsp;ltemp&nbsp;=&nbsp;PINSEL0;<br />&nbsp;&nbsp;&nbsp;&nbsp;ltemp&nbsp;&=&nbsp;0xffff00ff;//0xffff0cff;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;ltemp&nbsp;|=&nbsp;0x00004500;//0x00005100;&nbsp;//SSEL,MOSI,SCK<br />&nbsp;&nbsp;&nbsp;&nbsp;PINSEL0&nbsp;=&nbsp;ltemp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stemp&nbsp;=&nbsp;S0PCR;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stemp&nbsp;&=&nbsp;0xf003;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stemp&nbsp;|=&nbsp;0x0084;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;S0PCR&nbsp;=&nbsp;stemp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;TRUE;<br />}<br />说一下,因为我的是16bit的数据,所以初始化为16bit,但是在初始化时对S0PCR必须要采用读改写的方式,否则初始化会失败。<br /><br />中断处理:<br />void&nbsp;SPI0_Exception(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;INT16U&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stemp;<br />&nbsp;&nbsp;&nbsp;&nbsp;INT8U&nbsp;&nbsp;&nbsp;&nbsp;temp;<br />&nbsp;&nbsp;&nbsp;&nbsp;OS_ENTER_CRITICAL();<br />&nbsp;&nbsp;&nbsp;&nbsp;temp&nbsp;=&nbsp;S0PSR;<br />&nbsp;&nbsp;&nbsp;&nbsp;if((temp&0x10)!=0)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;//模式错误<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stemp&nbsp;=&nbsp;S0PCR;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stemp&nbsp;&=&nbsp;0xf003;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stemp&nbsp;|=&nbsp;SPI0_MODE;&nbsp;&nbsp;&nbsp;&nbsp;//0x0004;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;S0PCR&nbsp;=&nbsp;stemp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;S0PCR&nbsp;=&nbsp;SPI0_MODE;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;if((temp&0x40)!=0)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;//写冲突<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stemp&nbsp;=&nbsp;S0PDR;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;if((temp&0x80)!=0)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;//SPI&nbsp;传输完成标志<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SPIData&nbsp;=&nbsp;S0PDR;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SPIOK&nbsp;=&nbsp;TRUE;  //获得数据后,置标志<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;S0PINT&nbsp;=&nbsp;0x01;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;VICVectAddr&nbsp;=&nbsp;0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;通知中断控制器中断结束<br />&nbsp;&nbsp;&nbsp;&nbsp;OS_EXIT_CRITICAL();<br />}<br /><br />中断向量初始化<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;void&nbsp;VICInit(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;extern&nbsp;void&nbsp;IRQ_Handler(void);<br />&nbsp;&nbsp;&nbsp;&nbsp;extern&nbsp;void&nbsp;Timer0_Handler(void);<br />&nbsp;&nbsp;&nbsp;&nbsp;extern&nbsp;void&nbsp;SPI0_Exception(void);<br />&nbsp;&nbsp;&nbsp;&nbsp;extern&nbsp;void&nbsp;UART0_Handler(void);<br />&nbsp;//&nbsp;&nbsp;&nbsp;extern&nbsp;void&nbsp;UART1_Handler(void);<br />&nbsp;&nbsp;//&nbsp;&nbsp;extern&nbsp;void&nbsp;EINT0_Handler(void);<br />&nbsp;&nbsp;&nbsp;&nbsp;extern&nbsp;void&nbsp;Timer1_Handler(void);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;VICIntEnClr&nbsp;=&nbsp;0xffffffff;<br />&nbsp;&nbsp;&nbsp;&nbsp;VICDefVectAddr&nbsp;=&nbsp;(uint32)IRQ_Handler;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;VICVectAddr1&nbsp;=&nbsp;(uint32)Timer0_Handler;<br />&nbsp;&nbsp;&nbsp;&nbsp;VICVectCntl1&nbsp;=&nbsp;(0x20&nbsp;|&nbsp;4);<br />&nbsp;&nbsp;&nbsp;&nbsp;VICIntEnable&nbsp;=&nbsp;1&nbsp;&lt&lt&nbsp;4;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;VICVectAddr10&nbsp;=&nbsp;&nbsp;(INT32U)SPI0_Exception;<br />&nbsp;&nbsp;&nbsp;&nbsp;VICVectCntl10&nbsp;=&nbsp;&nbsp;(0x20&nbsp;|&nbsp;10);<br />&nbsp;&nbsp;&nbsp;&nbsp;VICIntEnable&nbsp;=&nbsp;1&nbsp;&lt&lt&nbsp;10;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;VICVectAddr2&nbsp;=&nbsp;&nbsp;(INT32U)UART0_Handler;<br />&nbsp;&nbsp;&nbsp;&nbsp;VICVectCntl2&nbsp;=&nbsp;&nbsp;(0x20&nbsp;|&nbsp;6);&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;VICIntEnable&nbsp;=&nbsp;1&nbsp;&lt&lt&nbsp;6;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;//&nbsp;&nbsp;VICVectAddr2&nbsp;=&nbsp;&nbsp;(INT32U)UART1_Handler;<br />&nbsp;&nbsp;//&nbsp;&nbsp;VICVectCntl2&nbsp;=&nbsp;&nbsp;(0x20&nbsp;|&nbsp;7);&nbsp;<br />&nbsp;&nbsp;//&nbsp;&nbsp;VICIntEnable&nbsp;=&nbsp;1&nbsp;&lt&lt&nbsp;7;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;//&nbsp;&nbsp;VICVectAddr4&nbsp;=&nbsp;&nbsp;(INT32U)EINT0_Handler;<br />&nbsp;//&nbsp;&nbsp;&nbsp;VICVectCntl4&nbsp;=&nbsp;&nbsp;(0x20&nbsp;|&nbsp;14);&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;//VICIntEnable&nbsp;=&nbsp;1&nbsp;&lt&lt&nbsp;14;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;VICVectAddr3&nbsp;=&nbsp;(uint32)Timer1_Handler;<br />&nbsp;&nbsp;&nbsp;&nbsp;VICVectCntl3&nbsp;=&nbsp;(0x20&nbsp;|&nbsp;5);<br />&nbsp;&nbsp;&nbsp;&nbsp;VICIntEnable&nbsp;=&nbsp;1&nbsp;&lt&lt&nbsp;5;<br />&nbsp;}<br /><br />我现在有几点问题,<br />1,器件手册上有这样一句话:“要求驱动SPI&nbsp;逻辑的系统时钟速度至少8&nbsp;倍于SPI”,二个SPI分别是那谁,做从机也要这样考虑吗?<br />2,我在对SPI状态寄存器初始化对不对?我的主SPI采用的时序在顶楼。<br />3,为什么进入中断几交后就死机了,是我的中断速度过快,LPC2103的SSEL0脚的有效时的脉冲频率为100K。
 楼主| twb0906 发表于 2008-9-20 17:59 | 显示全部楼层

怎么都没有人说话啊!

  做过了的兄弟们,知道的兄弟们,看过来帮帮忙啊!
chengxupin 发表于 2008-9-25 08:33 | 显示全部楼层

关FIQ,IRQ

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

本版积分规则

8

主题

44

帖子

2

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