当前位置:首页 > 单片机 > 单片机
[导读] 因为在tinyos系统下,节点写flash的速度过慢,开始怀疑是不是SPI的速度有问题,所以后来就直接在IAR上裸机读写FLASH,看看速度可以去到多少。用到了430的SPI的DMA模式DMA模式之所以会更快,是因为所要传

因为在tinyos系统下,节点写flash的速度过慢,开始怀疑是不是SPI的速度有问题,所以后来就直接在IAR上裸机读写FLASH,看看速度可以去到多少。用到了430的SPI的DMA模式

DMA模式之所以会更快,是因为所要传输的数据省去了要经过CPU处理这一步,直接在内部总线传输到DMA寄存器,然后DMA寄存器在根据情况通过总线传输到目标寄存器。这里的总线,我也还没搞清楚。在DMA传输数据的时候,虽然说CPU可以继续干自己的活,但是如果CPU要使用总线的话,而总线被DMA占用了,这时候该怎么办?

void SpiDmaSend(uint8_t cmd,uint8_t *tx_addr, uint8_t *rx_addr,uint16_t len)

{

DMACTL0 =DMA2TSEL_3 + DMA0TSEL_4;

IFG1 &= ~( UTXIFG0 | URXIFG0 ); //Clear interrupt flag

DMA2SA = (unsigned int)&U0RXBUF; // Src address = UART RX Buffer

DMA2DA = (unsigned int) rx_addr; // Dst address = rbuf

DMA2SZ = len;

DMA2CTL = DMADT_0 + DMASBDB ;

cmd==SPI_READ ? (DMA2CTL|=DMADSTINCR_3):(DMA2CTL|=DMADSTINCR_0);

DMA0SA = (unsigned int) tx_addr;

DMA0DA = (unsigned int)&U0TXBUF;

DMA0SZ = len ;

DMA0CTL = DMASBDB;

cmd==SPI_WRITE? (DMA0CTL|=DMASRCINCR_3):(DMA0CTL|=DMASRCINCR_0,DMA0SZ+=1);

DMA2CTL|= DMAEN;

DMA0CTL|= DMAEN;

IFG1 |= UTXIFG0;

while((DMA0CTL & DMAIFG)==0);

DMA1CTL&=~ DMAEN;

DMA2CTL&=~ DMAEN;

IFG1 &=~UTXIFG0;

DMA1CTL &= ~DMAIFG;

}


使用DMA模式,首先就是选好通道,MSP430里面,有三个DMA通道。因为用到SPI双工通信,所以发送和接收各用一个通道。然后,就是配置通道的触发方式,各通道要传输的字节数,还有,通道的传输方式,是单字节传输(single)还是块传输(block)。同时,配置好,源地址和目的地址的地址指针是否要递增。


关于Single和Block传输方式的区别,我当时看datasheet也是看不懂,后来上网查,就连作者本人也说了文档的说明看上去会让人产生迷惑,呵呵。那时候我忽然觉得,原来不全是我太笨才看不懂呀偷笑。关于传输模式的区别,大家还是看看参考手册,俺也说不清楚。


本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除( 邮箱:macysun@21ic.com )。
换一批
延伸阅读
关闭