免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 5460 | 回复: 1
打印 上一主题 下一主题

S3C6410的SPI总线读写 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-12-23 03:25 |只看该作者 |倒序浏览
  最近一段时间一直在弄SPI接口相关的东西。用过几款不同的CPU芯片,都自带有SPI硬件接口,之前也用普通I/O口模拟过SPI接口,和硬件自带的接口相比操作自由一些,但是速度受限,且不易改变大小。
  下面将简单的说说S3C6410的SPI接口。关于SPI接口的传输协议我就不废话了,不了解的可以在网上搜一搜。S3C6410的SPI功能相当不错。官方文档上有如下描述:
    • Full duplex 
    • 8/16/32-bit shift register for TX/RX 
    • 8-bit prescale logic 
    • 3 clocks source  
    • 8-bit/16-bit/32-bit bus interface 
    • The Motorola SPI protocol and National Semiconductor Microwire 
    • Two independent transmit and receive FIFOs, each 16 samples deep by 32-bits wide 
    • Master-mode and Slave-mode 
    • Receive-without-transmit operation 
    • Tx/ Rx maximum frequency at up to 50MHz 
       (CPHA=1 and slave Tx mode maximum frequency at up to 20Mhz) 

  官方文档也提供了一个SPI的操作指南,如下:
    1.  Set Transfer Type. (CPOL & CPHA set ) 
    2.  Set Clock configuration register. 
    3.  Set SPI MODE configuration register. 
    4.  Set SPI INT_EN register. 
    5.  Set Packet Count configuration register if necessary. 
    6.  Set Tx or Rx Channel on. 
    7.  Set NSSOUT low to start Tx or Rx operation. 
        A.  Set NSSOUT Bit to low, then start TX data writing. 
        B.  If auto chip selection bit is set, should not control NSSOUT.   
  在对S3C6410的整个调试过程中,困扰我的问题是它是如何启动一次数据的传输和接下来如何判断它是否完成了数据传输,以及如何主动去接收slave的数据。如果之前我没有使用过另外一款MCU,或许不会产生这样的疑惑。基本上参照官方文档的操作说明来做就可以了,而且就那么简单。
  其实写数据还是很简单的,文档上说:
   “CPU must write data on the register SPI_TX_DATA, to write data in FIFO. Data on the   register are automatically moved to Tx FIFOs.
即把要发送的数据写入SPI_TX_DATA后,数据会被自动的写入FIFO管道,当然这里要设置FIFO管道的深度。要如何启动FIFO管道里的数据往外发送了?上文的第七步就是描述如何启动spi传输。以手动方式启动为例,将NSSOUT位置0,就OK了。但是如我上面的疑问,如何得知传输完成否?从文档里发现有一个SPI_STATUS 寄存器,而SPI_STATUS[21]TX_DONE,有这样的描述:
   Indication of transfer done in Shift register(master mode only) 
     0 : all case except blow case 
     1 : when tx fifo and shift register are empty 
我看见了这个标志位,并以为它就是我要找的答案,但它不是。对这位的检测总是0,无法作出判断,正如0的含义“all case except blow case ”。一时不知到该咋办,3SC6410也没有提供发送完数据后就产生一个中断的功能。我又注意到了SPI_STATUS[19:13]RX_FIFO_LVL位,它显示了Rx FIFO管道内的数据量,它如果为0了,不就是说写入FIFO中的数据已传送完毕了吗?果然经验正,确实如此,做如下的:
while((v32(SPI_STATUS0)>>6)&0x7f); //wait spi write finish
  因为SPI是全双工的串行传输协议,那么对已经知道写数据,度数据就简单了,即在写数据完成后从SPI_RX_DATA里读取数据就行了。

论坛徽章:
0
2 [报告]
发表于 2012-04-15 10:05 |只看该作者
您好,最近我也在做S3C6410 SPI驱动的开发工作,之前没啥经验,现在遇到一些问题,首先配置了SPI相关的寄存器,并且设置了CLK_CFG中的ENCLK为1但是,但是始终没有时钟信号输出,这是为什么啊?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP