现在手头上有个项目,CPU是LPC2103,他的SPI0用作从机,主机则是CS5571,此时CS5571的时钟16MHz,可是只要LPC2103采用SPI中断方式程序就死机,我采用是前后台程序。<br /> 对SPI采用查询方式时,程序是能够正常工作的,不知是怎么回事,望大家帮看看,是错在那了!<br /> 感谢!<br />SPI初始化:<br />INT8U SPI0SInit(void)<br />{<br /> INT16U stemp;<br /> INT32U ltemp;<br /> //SPI0 引脚定义<br /> ltemp = PINSEL0;<br /> ltemp &= 0xffff00ff;//0xffff0cff; <br /> ltemp |= 0x00004500;//0x00005100; //SSEL,MOSI,SCK<br /> PINSEL0 = ltemp;<br /><br /> stemp = S0PCR;<br /> stemp &= 0xf003;<br /> stemp |= 0x0084; //0x0004;0x0084<br /> S0PCR = stemp; <br /> return TRUE;<br />}<br /><br />SPI中断<br />void SPI0_Exception(void)<br />{<br /> INT16U stemp;<br /> INT8U temp;<br /> OS_ENTER_CRITICAL();<br /> temp = S0PSR;<br /> if((temp&0x10)!=0) { //模式错误<br /> stemp = S0PCR;<br /> stemp &= 0xf003;<br /> stemp |= 0x0084; //0x0004;<br /> S0PCR = stemp; <br /> }<br /> if((temp&0x40)!=0) { //写冲突<br /> stemp = S0PDR;<br /> }<br /> if((temp&0x80)!=0) { //SPI 传输完成标志<br /> SPIData = S0PDR;<br /> }<br /> <br /> S0PINT = 0x01; <br /> VICVectAddr = 0; // 通知中断控制器中断结束<br /> OS_EXIT_CRITICAL();<br />}<br /> void VICInit(void)<br />{<br /> extern void IRQ_Handler(void);<br /> extern void Timer0_Handler(void);<br /> extern void SPI0_Exception(void);<br /> extern void UART0_Handler(void);<br /> // extern void UART1_Handler(void);<br /> // extern void EINT0_Handler(void);<br /> extern void Timer1_Handler(void);<br /><br /> VICIntEnClr = 0xffffffff;<br /> VICDefVectAddr = (uint32)IRQ_Handler;<br /> <br /> VICVectAddr1 = (uint32)Timer0_Handler;<br /> VICVectCntl1 = (0x20 | 4);<br /> VICIntEnable = 1 << 4;<br /> <br /> VICVectAddr10 = (INT32U)SPI0_Exception;<br /> VICVectCntl10 = (0x20 | 10);<br /> VICIntEnable = 1 << 10;<br /> <br /> VICVectAddr2 = (INT32U)UART0_Handler;<br /> VICVectCntl2 = (0x20 | 6); <br /> VICIntEnable = 1 << 6;<br /> <br /> // VICVectAddr2 = (INT32U)UART1_Handler;<br /> // VICVectCntl2 = (0x20 | 7); <br /> // VICIntEnable = 1 << 7;<br /> <br /> // VICVectAddr4 = (INT32U)EINT0_Handler;<br /> // VICVectCntl4 = (0x20 | 14); <br /> //VICIntEnable = 1 << 14;<br /> <br /> VICVectAddr3 = (uint32)Timer1_Handler;<br /> VICVectCntl3 = (0x20 | 5);<br /> VICIntEnable = 1 << 5;<br /> }<br /> 相关链接:<a href='http://www.honestar.com/product/datasheet/CIRRUS/CIRRUS/CS5571_A5.pdf'>http://www.honestar.com/product/datasheet/CIRRUS/CIRRUS/CS5571_A5.pdf</a> |
|