SPI中断进入不了。不知道是为什么啊<br />#include "sys/device.h"<br />#include "stdlib.h"<br />#include "config.h"<br />#include "spi.h"<br />#include "string.h"<br />#include "stdio.h"<br />#include "sys/irqreg.h"<br /><br />extern void SpiInterrupt(void);<br /><br />NUTDEVICE *curdev;//当前操作的设备指针信息<br /><br />int SpiArmInput(NUTDEVICE *dev)<br />{<br /> IFSTREAM *ifs;<br /> pSpiDCB dcb;<br /> INT8U devnum;<br /> INT32U *ret=0;<br /> INT8U err;<br /> <br /> <br /> devnum = dev->dev_base;<br /> ifs = dev->dev_icb;<br /> dcb = dev->dev_dcb;<br /> <br /> if(ifs->if_rd_idx == ifs->if_rx_idx)<br /> {<br /> if(devnum)<br /> S1PDR = 0x00;<br /> else<br /> S0PDR = 0x00;<br /> <br /> do<br /> {<br /> ret = (INT32U*)OSMboxPend(dcb->SPIReviceMbox,20,&err);<br /> }while((ifs->if_rd_idx == ifs->if_rx_idx)||(err == OS_TIMEOUT));<br /> }<br /> <br /> return (int)ret;<br />}<br /><br />int SpiArmOutput(NUTDEVICE *dev)<br />{<br /> IFSTREAM *ifs = dev->dev_icb;<br /> <br /> if(ifs->if_tx_idx == ifs->if_wr_idx)<br /> return 1;<br /> <br /> if(dev->dev_base)<br /> S1PDR = ifs->if_tx_buf[ifs->if_tx_idx];<br /> else<br /> S0PDR = ifs->if_tx_buf[ifs->if_tx_idx];<br /> ifs->if_tx_idx++;<br /> <br /> while(!(S0PSR & 0x80))<br /> continue;<br /> <br /> return 0;<br />}<br /><br />void SPI_Exception(void)<br />{<br /> INT8U State;<br /> SpiDCB *dcb;<br /> IFSTREAM *ifs = curdev->dev_icb;<br /> dcb = curdev->dev_dcb;<br /> <br /> State = S1PSR;<br /> <br /> OS_ENTER_CRITICAL();<br /> if(State&0x80)<br /> {<br /> switch(dcb->WorkProcess)<br /> {<br /> case IsReading:<br /> if(ifs->if_rd_idx == ifs->if_rx_idx + 1)<br /> {<br /> OSMboxPost(dcb->SPIReviceMbox,(void*)OS_READOVER);<br /> break;<br /> }<br /> <br /> ifs->if_rx_buf[ifs->if_rx_idx] = S0PDR;<br /> ifs->if_rx_idx++;<br /> dcb->rdsize--;<br /> if(dcb->rdsize == 0)<br /> OSMboxPost(dcb->SPIReviceMbox,(void*)OS_READOVER);<br /> else<br /> if(curdev->dev_base)<br /> S1PDR = 0x00;//继续产生读取时钟进行数据的读取操作<br /> else<br /> S0PDR = 0x00;<br /> break;<br /> case IsWriting:<br /> if(ifs->if_wr_idx == ifs->if_tx_idx)<br /> {<br /> OSMboxPost(dcb->SPIReviceMbox,(void*)OS_SENDOVER);<br /> break;<br /> }<br /> <br /> if(curdev->dev_base)<br /> {<br /> S1PDR = ifs->if_tx_buf[ifs->if_tx_idx];<br /> ifs->if_tx_idx++;<br /> break;<br /> }<br /> else<br /> {<br /> S0PDR = ifs->if_tx_buf[ifs->if_tx_idx];<br /> ifs->if_tx_idx++;<br /> break; <br /> }<br /> break;<br /> }<br /> }<br /> <br /> S0PINT = 0x01;<br /> VICVectAddr = 0x00000000;<br /> OS_EXIT_CRITICAL();<br />}<br />int SpiFlush(NUTDEVICE *dev)<br />{<br /> pSpiDCB dcb = dev->dev_dcb;<br /> <br /> dcb->WorkProcess = IsWriting;<br /> <br /> (*dcb->Enable)();//使能操作芯片<br /> if(SpiArmOutput(dev))<br /> {<br /> (*dcb->Disable)();//暂停芯片操作<br /> return -1; <br /> }<br /> printf("595 Write over\n");<br /> if((int)OSMboxPend(dcb->SPIReviceMbox,OS_TICKS_PER_SEC*2,NULL) == OS_SENDOVER)<br /> {<br /> (*dcb->Disable)();//暂停芯片操作<br /> <br /> return 0;<br /> }<br /> <br /> (*dcb->Disable)();//暂停芯片操作<br /><br /> <br /> return -1;<br />}<br />int SPI_Init(NUTDEVICE *dev)<br />{<br /> pSpiDCB dcb = dev->dev_dcb;<br /> <br /> dcb->WorkProcess = IsIdle;<br /> <br /> if(dev->dev_base)<br /> {<br /> <br /> }<br /> else<br /> {<br /> PINSEL0 = (PINSEL0 & 0xFFFFC0FF) | 0x1500; /* 选择管脚为SPI */<br /> <br /> }<br /> <br /><br /> <br /> return 0;<br />}<br /><br />int SPI_Close(NUTFILE *fp)<br />{<br /> NUTDEVICE *dev = fp->nf_dev;<br /> pSpiDCB dcb = dev->dev_dcb;<br /><br /> if(dcb->SPIReviceMbox)<br /> {<br /> OSMboxDel(dcb->SPIReviceMbox,OS_DEL_ALWAYS,NULL);<br /> }<br /> free(fp);<br /> <br /> dcb->Working = IsFree;<br /> curdev = 0x0000;<br /> return 0;<br />}<br /><br />NUTFILE* SPI_Open(NUTDEVICE *dev,const char *name,int mode,int acc)<br />{<br /> <br /> NUTFILE *fp = (NUTFILE*)malloc(sizeof(NUTFILE));<br /> pSpiDCB dcb = dev->dev_dcb;<br /> INT8U state;<br /> <br /> <br /> fp->nf_next = 0;<br /> fp->nf_dev = dev;<br /> fp->nf_fcb = 0;<br /> <br /> curdev = dev;<br /> <br /> while(dcb->Working == IsUsed)<br /> OSTimeDly(10);<br /> <br /> dcb->Working = IsUsed;//打开此设备时将会占用此功能<br /> if(dcb->SPIReviceMbox == (OS_EVENT*)0)<br /> {<br /> dcb->SPIReviceMbox = OSMboxCreate(NULL);<br /> }<br /> else<br /> {<br /> OSMboxAccept(dcb->SPIReviceMbox);//清除当前消息 <br /> }<br /> <br /> if(dev->dev_base)<br /> {<br /> state = S1PSR;<br /> if(Fpclk/dcb->baudrate > 8)<br /> S1PCCR = Fpclk/dcb->baudrate;<br /> else<br /> S1PCCR = 8;<br /> //模式设置操作<br /> S1PCR = dcb->WorkMode;<br /> <br /> } <br /> else<br /> {<br /> state = S0PSR;<br /> if(Fpclk/dcb->baudrate > 8)<br /> S0PCCR = Fpclk/dcb->baudrate;<br /> else<br /> S0PCCR = 8;<br /> S0PCR = dcb->WorkMode;<br /> <br /> }<br /><br /> VICVectAddr7 = (unsigned long)SpiInterrupt;<br /> VICVectCntl7 = 0x20+0x0A;<br /> VICIntEnable |= (1<<7);<br /> <br />// if(dev->dev_base)<br />// {<br />// PINSEL1 = (PINSEL1 & 0XFFFFFF03)|0X000000A8;<br /> NutIrqRegister(SpiInterrupt,dev->dev_irq,11);<br />// }<br />// else<br />// {<br />// PINSEL0 = (PINSEL0 & 0xFFFF00FF) | 0x00001500; // /* 选择管脚为SPI*/ <br />// NutIrqRegister(SpiInterrupt,dev->dev_irq,10);<br />// }<br /><br /> return fp;<br />}<br /><br />int SPI_Write(NUTFILE *fp,const void *buffer,int size)<br />{<br /> NUTDEVICE *dev = fp->nf_dev;<br /> IFSTREAM *ifs = dev->dev_icb;<br /> INT8U *pc = (INT8U*)buffer;<br /> <br /> if(buffer == 0)<br /> (*ifs->if_flush)(dev);<br /> while(size--)<br /> { <br /> if(ifs->if_tx_idx == (ifs->if_wr_idx+1))<br /> {<br /> (*ifs->if_flush)(dev);<br /> }<br /> else<br /> {<br /> ifs->if_tx_buf[ifs->if_wr_idx] = *pc;<br /> pc++;<br /> ifs->if_wr_idx++;<br /> }<br /> }<br /> <br /> return (*ifs->if_flush)(dev);<br /> <br />}<br /><br />int SPI_Read(NUTFILE *fp,void *buffer,int size)<br />{<br /><br /> NUTDEVICE *dev = fp->nf_dev;<br /> IFSTREAM *ifs = dev->dev_icb;<br /> pSpiDCB dcb = dev->dev_dcb;<br /> INT8U *Pointer = (INT8U*)buffer;<br /> INT8U rc = 0;<br /> <br /> dcb->rdsize = size;<br /> dcb->WorkProcess = IsReading;<br /> <br /> if(size == 0)<br /> return -1;<br /> <br /> (*ifs->if_input)(dev);<br /> <br /> while(size--)<br /> {<br /> if((ifs->if_rd_idx == ifs->if_rx_idx)&&rc)<br /> break;<br /> *Pointer = ifs->if_rx_buf[ifs->if_rd_idx];<br /> ifs->if_rd_idx++;<br /> Pointer++;<br /> rc++;<br /> }<br /> return rc;<br />}<br />//获得端口的状态信息<br />int GetStatus(NUTDEVICE *dev,INT8U *status)<br />{<br /> return 0;<br />}<br /><br />int SPI_Control(NUTDEVICE *dev,int req,void *conf)<br />{<br />// pSpiDCB dcb = dev->dev_dcb;<br /> INT32U *lv =(INT32U*)conf;<br /> INT32U longV= *lv;<br />// INT16U sv = (INT16U)longV;<br /> //INT8U bv = (INT8U)sv;<br /> <br /> switch(req)<br /> {<br /> case SPI_SETSPEED:<br /> if(dev->dev_base)<br /> { <br /> if(Fpclk/longV > 8)<br /> S1PCCR = Fpclk/longV;<br /> else<br /> S1PCCR = 8;<br /> } <br /> else<br /> {<br /> if(Fpclk/longV > 8)<br /> S0PCCR = Fpclk/longV;<br /> else<br /> S0PCCR = 8;<br /> <br /> }<br /> break;<br /> <br /> }<br /> <br /> <br /> return 0;<br />}<br />/*******************************************************************<br /> 由于不同的设备的操作可能会出现不一样的配置要求,故在设计初始化<br /> 时进行分开设计的理念这样可以实现不同的设备间的求同存异的目标<br /> 以下的内容为595专用模块区<br /> ******************************************************************/<br /><br />void HC595Enable(void)<br />{<br /> PINSEL0 = PINSEL0 & 0XFFFCFFFF;<br /> IO0DIR = IO0DIR | (1<<8);<br /> IO0CLR |= (1<<8);<br />}<br />void HC595Disable(void)<br />{<br /> PINSEL0 = PINSEL0 & 0XFFFCFFFF;<br /> IO0DIR = IO0DIR | (1<<8);<br /> IO0SET |= (1<<8);<br /><br />}<br /><br />int HC595_Init(NUTDEVICE *dev)<br />{<br /> pSpiDCB dcb = dev->dev_dcb;<br /> IFSTREAM *ifs = dev->dev_icb;<br /><br /> if(dev->dev_base)<br /> {<br /> PINSEL1 = (PINSEL1 & 0XFFFFFF03)|0X000000A8;<br /> // NutIrqRegister(SpiInterrupt,dev->dev_irq,11);<br /> }<br /> else<br /> {<br /> PINSEL0 = (PINSEL0 & 0xFFFF00FF) | 0x00005500; // /* 选择管脚为SPI*/ <br /> // NutIrqRegister(SpiInterrupt,dev->dev_irq,10);<br /> }<br /> <br /> if(dcb)<br /> memset(dcb,0,sizeof(SpiDCB));<br /> if(ifs)<br /> memset(ifs,0,sizeof(IFSTREAM)); <br /> <br /> <br /> dcb->WorkMode = (1<<MSTR)|(1<<CPHA)|(1<<SPIE); <br /> dcb->WorkProcess = IsIdle;<br /> dcb->baudrate = 400000;<br /> dcb->Enable = HC595Enable;<br /> dcb->Disable = HC595Disable;<br /> <br /> ifs->if_rx_idx = 0;<br /> ifs->if_tx_idx = 0;<br /> ifs->if_wr_idx = 0;<br /> ifs->if_rd_idx = 0;<br /> ifs->if_input = SpiArmInput;<br /> ifs->if_output = SpiArmOutput;<br /> ifs->if_flush = SpiFlush;<br /> printf("595Initilation\n");<br /> <br /> return 0; <br />}<br />SpiDCB dcb595;<br />IFSTREAM ifs595;<br /><br />NUTDEVICE dev595=<br />{<br /> 0,<br /> {'l','s','5','9','5',0,0,0,0},<br /> IFTYP_CHAR,<br /> 0,<br /> OS_SPI0_PRIO,<br /> &ifs595,<br /> &dcb595,<br /> HC595_Init,<br /> SPI_Control,<br /> SPI_Read,<br /> SPI_Write,<br /> SPI_Open,<br /> SPI_Close,<br /> NULL <br />}; |
|