专注收集记录技术开发学习笔记、技术难点、解决方案
网站信息搜索 >> 请输入关键词:
您当前的位置: 首页 > 硬件开发

SPI传输数据 CPU使用率达98%+解决思路

发布时间:2010-06-13 21:44:25 文章来源:www.iduyao.cn 采编人员:星星草
SPI传输数据 CPU使用率达98%+
先呈上代码 unsigned short *data0,*data1;
data0=new unsigned short[1000000];
  data0=new unsigned short[1000000];

  v_pIOPRegs->rGPADAT |= 1<<12;// 将GPA12设置位高电平
v_pSSPRegs->rSPCON0 = 0x1e;//SPI模式设置
v_pSSPRegs->rSPCON1 = 0x1e;//SPI模式设置

//SPI引脚控制寄存器,引脚多主SPI错误测试禁测,1字节发完后MOSI释放
v_pSSPRegs->rSPPIN0 |= (0<<2)|(1<<1)|0;
v_pSSPRegs->rSPPIN1 |= (0<<2)|(1<<1)|0;

//SPI预分频寄存器为11,rate=PCLK/2/(Prescaler value+1)
v_pSSPRegs->rSPPRE0 =3;
v_pSSPRegs->rSPPRE1 =3;

//向SPTDAT0写10次数据,初始化SD卡
for( i=0;i<10;i++)
{
v_pSSPRegs->rSPTDAT0=0xff;
v_pSSPRegs->rSPTDAT1=0xff;
}

//开始采样和读数据
v_pIOPRegs->rGPADAT |= 1<<12;// 将GPA12设置位高电平
Sleep(1);
for(j=0;j<1000000;j+=2)
{
volatile unsigned int k=0;//采用FOR语句来短时间延时必须用的,
  //否则系统会自动忽略空循环语句
v_pIOPRegs->rGPADAT &= ~(1<<12);// 将GPA12设置为0 

while(!((v_pSSPRegs->rSPSTA0 & 0x01)&&(v_pSSPRegs->rSPSTA1 & 0x01)));
v_pSSPRegs->rSPTDAT0=0xff;//写数据
v_pSSPRegs->rSPTDAT1=0xff;//写数据

while(!((v_pSSPRegs->rSPSTA0 & 0x01)&&(v_pSSPRegs->rSPSTA1 & 0x01)));
for (k=0; k<10; k++);
data1[j] = v_pSSPRegs->rSPRDAT0;
data0[j] = v_pSSPRegs->rSPRDAT1;
v_pSSPRegs->rSPTDAT0=0xff;//写数据
v_pSSPRegs->rSPTDAT1=0xff;//写数据

while(!((v_pSSPRegs->rSPSTA0 & 0x01)&&(v_pSSPRegs->rSPSTA1 & 0x01)));
for (k=0; k<10; k++);
data1[j+1] = v_pSSPRegs->rSPRDAT0 ;//存数据
data0[j+1] = v_pSSPRegs->rSPRDAT1 ;//存数据

v_pIOPRegs->rGPADAT |= 1<<12;// 将GPA12设置位高电平
for (k=0; k<10; k++);
}

  ... ...
  delete []data0;
  delete []data1;

SPI数据传输时,CPU使用率达98%+,对系统运行有影响不?可能有什么影响?
请大侠帮忙分析一下,看有没有办法解决这个问题?

------解决方案--------------------
时间都花在while循环了,比较理智的做法是用DMA传输。如:
void spi_dma_rx(unsigned char *pOutBuf, unsigned int nReadSize)
{
UINT32 oldMODE_CFG = v_pSPI1regs->MODE_CFG;
//Reset();
v_pSPI1regs->CH_CFG |= SW_RST;
//RETAILMSG(1,(TEXT("\n HS SPI reset\n")));
v_pSPI1regs->CH_CFG &= ~SW_RST;
//
v_pSPI1regs->MODE_CFG |= RX_DMA_ON|DMA_SINGLE;
v_pSPI1regs->CH_CFG |= RX_CH_ON;

v_pDMAregs->DISRC5 = (UINT)SPI_RX_DATA_PHY_ADDR;
v_pDMAregs->DISRCC5 = (SOURCE_PERIPHERAL_BUS | FIXED_SOURCE_ADDRESS); 
v_pDMAregs->DIDST5 = (UINT)pOutBuf;
v_pDMAregs->DIDSTC5 = ~(DESTINATION_PERIPHERAL_BUS | FIXED_DESTINATION_ADDRESS); 
// v_pDMAregs->DCON5 = HANDSHAKE_MODE |GENERATE_INTERRUPT |PADDRFIX |NO_DMA_AUTO_RELOAD | dwDmaLen;
v_pDMAregs->DCON5 = HANDSHAKE_MODE |GENERATE_INTERRUPT |NO_DMA_AUTO_RELOAD | nReadSize;
v_pDMAregs->DMAREQSEL5 = ( DMAREQSEL_SPI_1RX | DMA_TRIGGERED_BY_HARDWARE );
v_pDMAregs->DMASKTRIG5 = ENABLE_DMA_CHANNEL;

WaitForSingleObject(v_spi.hRxDmaDoneDoneEvent, INFINITE);

v_pSPI1regs->CH_CFG &= ~RX_CH_ON;
v_pSPI1regs->MODE_CFG = oldMODE_CFG;
}
友情提示:
信息收集于互联网,如果您发现错误或造成侵权,请及时通知本站更正或删除,具体联系方式见页面底部联系我们,谢谢。

其他相似内容:

热门推荐: