FreeScale mpc8xxx + vxWorks平台下spi flash驱动开发三步走
? 最近在弄PowerPC平台上的spi flash的驱动程序,总体比较简单,在借鉴了U-Boot中的相关源码后,花了两周左右的时间搞定了,对于spi总线之前一直都有了解,但未能实际接触,这次在vxWorks上尝试了一下,确实有不小的收获。由于网上关于vxWorks平台的资料稀少,就写下此文,以备查阅。 ???? 这次驱动的对象是Spansion的S25FLXX系列的,扇区64K,相对比较低端,但原理都是相通的。核心板的SPI总线提供时钟和MOSI、MISO,用GPIO实现片选。要实现对flash的驱动无非“三步走”:初始化SPI总线、完成spi读写驱动、在spi总线基础上完成flash读写驱动。 ???? 先看第一步,这个比较简单,对于mpc8xxx系列,主要需要配置的就是模式寄存器SPMODE了(当然,像Fsl的另一款处理器P2020ds采用的eSPI,就不止这一个寄存器,还有Command要复杂配置,有兴趣的可以看下)如下图:
??? 首位LOOP指是否开启LoopBack模式,用于测试SPI传输的,一般不建议打开;CI、CP一起用于设置SPI时钟,这个要根据对应flash的数据手册来,像我的这款说了支持00和11两种模式,这里设置为00;DIV16用于为SPI BRG设置时钟源,这个不是很懂,就设置为0了;M/S设置SPI工作模式,CPU要控制flash,这里当然是master模式了;还有个PM,用于设置时钟分频的,以u-boot为准,设置为1,即SYSCLK/8。详细的配置代码如下:
? 好了,到这里第一步的工作就做完了,比较简单,只要弄清楚flash的时序配置起来就会方便不少了。 ??? 然后就开始第二步,这一步是最关键的,但其中在这一步中搞清楚两点也不会很困难,1、注意片选信号和flash读写时序的关系;2、SPI总线的全双工特性。这里特别声明一下,由于SPI总线是全双工的,所以在编写驱动时最好把读写放在一起实现,写完即读缓冲区,方便有效。在U-boot中,实现这个功能的函数是spi_xfer函数,这里以FreeScale的Mpc8xxx系列为例简单的解释下: copy
|