SPI接口驱动:读操作完全分析

  SPI协议中的SCK是用来同步数据传输的时钟信号,由Master驱动,Slave接收。当使用SPI接口时,时钟可编程为高有效或低有效,否则,时钟总是低有效。SCK的状态只能在数据传输过程中变,在其他时间里,SPI接口使其保持无效状态或不驱动它(使其处于高阻态)
  SPI设备间的数据传输之所以又被称为数据交换,是因为SPI协议规定一个SPI设备在通信过程中不能仅仅充当一个“发送者”或“接收者”,在每个SCK周期内,SPI设备都会发送并接收一个bit大小的数据,相当于该设备有一个bit大小的数据被交换了。如下例中的驱动:
SPI接口驱动:读操作完全分析_第1张图片
  该例中LPC1788MCU是Master,GT21L16S2W字库芯片是Slave,GT21L16S2W的快速读取时序如下:

SPI接口驱动:读操作完全分析_第2张图片
代码分析:
30-33行:在选通GT21L16S2W芯片之前先将LPC1788中的SSP控制器的Rx FIFO清空,将这段代码注 释掉也运行正常,但最好清空一下Rx FIFO防止意外

34行: 将LPC1788的P2[22]引脚置为低电平来选通GT21L16S2W芯片。GT21L16S2W芯片的片选是由 P2[22]引脚配置为GPIO输出高电平或低电平来控制的,所以LPC1788与GT21L16S2W进行通讯 时必须置低P2[22]引脚。

35-42行:LPC1788向GT21L16S2W发送一个字节的快速读命令,然后发送三个字节的地址Add,这是要读数 据在GT21L16S2W芯片中的地址,最后发送一个Dummy Byte,时序如上图。

43行: 开始的时候说过SPI协议中Master和Slave通讯时进行的是数据交换,所以在35-42行代码中 LPC1788向GT21L16S2W发送读命令、地址以及Dummy Byte时,GT21L16S2W也在向LPC1788 发送数据,数据的传输是双向的,只不过GT21L16S2W向LPC1788发送的数据垃圾数据。因为 GT21L16S2W芯片反应比较慢,所以通过轮询LPC_SSP0->SR寄存器的SSP_STAT_BUSY位来 等待芯片将垃圾数据发送到LPC1788中,到SSP_STAT_BUSY位为0时,表示双方的这次数据 交换结束。

45-48行:通过这段代码清理掉LPC1788的SSP控制器的Rx FIFO中的垃圾数据。

50-55行:这段代码接收从Slave中传输过来的数据,因为SCK是由LPC1788驱动的,而且SCK只有在 LPC1788向GT21L16S2W传输数据时才会跳变,如果LPC1788不主动向GT21L16S2W传输数据, GT21L16S2W也不会向LPC1788传送数据,所以每当要从GT21L16S2W读取一个字节数据时, LPC1788要先向SSP控制器的Tx FIFO写一个字节,向GT21L16S2W发送一个字节的数据来驱 动SCK的跳变,然后等待GT21L16S2W 将一个被读的数据传输给LPC1788的SSP控制器的Rx FIFO,这个两者之间才能完成一个字节的数据交换,最后再从Rx FIFO中读取数据到函数缓冲区 DataBuffer。重复这个过程直到读完Length个字节的数据。

56行:函数最后将P2[22]引脚置高,取消选通GT21L16S2W芯片。至此读过程结束。

你可能感兴趣的:(嵌入式学习之LPC1788)