1989|0

3836

帖子

19

TA的资源

纯净的硅(中级)

楼主
 

SPI接口DMA模式通信 [复制链接]

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

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

[plain] view plain copy
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也是看不懂,后来上网查,就连作者本人也说了文档的说明看上去会让人产生迷惑,呵呵。那时候我忽然觉得,原来不全是我太笨才看不懂呀偷笑。关于传输模式的区别,大家还是看看参考手册,俺也说不清楚。

 
点赞 关注

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表