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;
}
友情提示:
信息收集于互联网,如果您发现错误或造成侵权,请及时通知本站更正或删除,具体联系方式见页面底部联系我们,谢谢。
其他相似内容:
-
DSP运算错误
在CCS3.3环境下对TMS320C6416进行编程和在线调试,莫名其妙地几个三角函数不能正常运算出结果,有的是运算错了,有的直接...
-
谁用过AD7714模数转换芯片的请进来指教
各位硬件高手,我是第一次用AD7714芯片,这个程序已经调试很久了,一直没有调试成功。
所以我把...
-
有没有给个模型文件就能用一定的材料造出来这个东西的工厂?
应该有吧?叫什么?比如用金属或者塑料造出这种东西。
就像给个PCB文件就...
-
我想获得380v三相电机的电流,一般是怎么个思路?
我想获得380v三相电机的电流,一般是怎么个思路?
数据在51单片机里计算,然后输出到液晶...
-
求模拟可视对讲系统整体实现方案
要开发一套模拟可视对讲系统,寻求成熟方案合作,合作方式灵活,可以委外开发、可以出售方案等!
有意向...
-
关于书上的用vhdl做t触发器的例子的问题
代码如下
library ieee;
use ieee.std_logic_1164.all;
entity tff is
port(
t,clk,rese...
-
2440的掉电复位电压和时间是多少
在手册上居然没有找到,在这里咨询一下了,帮帮忙,在线等待···
在手册的哪里,电压和最...
-
求助ARM程序中断后跑飞问题
小弟刚学ARM,自己编了下列程序,用ADS编译下载到裸板后,指示灯轮流闪,程序运行正常,给外部中...
-
FPGA用AS模式下载的问题
请教一下quartus下下载的问题
用jtag模式都正确,下载.jic文件也可以
但是用as模式后就会出现不能识别id...
-
有关系统软硬件划分建模
现在在进行一个研究,想对一个小型的嵌入式操作系统进行软硬件划分,将操作系统中的部分功能用FPGA上的硬件...