最近一段时间一直在弄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里读取数据就行了。
阅读(4143) | 评论(2) | 转发(0) |