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 /> stemp = S0PCR;<br /> stemp &= 0xf003;<br /> stemp |= 0x0084; <br /> S0PCR = stemp; <br /> return TRUE;<br />}<br />说一下,因为我的是16bit的数据,所以初始化为16bit,但是在初始化时对S0PCR必须要采用读改写的方式,否则初始化会失败。<br /><br />中断处理:<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 |= SPI0_MODE; //0x0004;<br /> S0PCR = stemp; <br /> // S0PCR = SPI0_MODE;<br /> }<br /> if((temp&0x40)!=0) { //写冲突<br /> stemp = S0PDR;<br /> }<br /> if((temp&0x80)!=0) { //SPI 传输完成标志<br /> SPIData = S0PDR;<br /> SPIOK = TRUE; //获得数据后,置标志<br /> }<br /> S0PINT = 0x01; <br /> VICVectAddr = 0; // 通知中断控制器中断结束<br /> OS_EXIT_CRITICAL();<br />}<br /><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 /><br />我现在有几点问题,<br />1,器件手册上有这样一句话:“要求驱动SPI 逻辑的系统时钟速度至少8 倍于SPI”,二个SPI分别是那谁,做从机也要这样考虑吗?<br />2,我在对SPI状态寄存器初始化对不对?我的主SPI采用的时序在顶楼。<br />3,为什么进入中断几交后就死机了,是我的中断速度过快,LPC2103的SSEL0脚的有效时的脉冲频率为100K。
|