【LPC800 系列】SPI 的配置及使用

【LPC800 系列】SPI 的配置及使用

本文将介绍 LPC800 系列的 SPI 外设使用。

  • SPI 的基本配置

SPI 是串行外设接口(Serial Peripheral Interface)的缩写,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,分别是 SCK,SSEL,MOSI,MISO,关于 SPI 更多基本介绍请参考公众号——单片大师中的博文:“史上最完美的双十一攻略”,链接如下:https://mp.weixin.qq.com/s/HcO3DzOX3YEG3yXBc8sdAQ,这里就不再重复介绍。

 

 

  • 实战演练

本文主要介绍 SDK SPI Driver 使用过程中遇到的问题。

硬件平台: LPCXpresso845MAX Board ,

SPI 引脚:Arduino 接口上的 SPI 接口,如下图所示:

打开 spi_polling_master 例程,如下图所示是它的 main 函数,首先是配置引脚:

 

例程中默认使用的引脚与开发板上 Arduino 接口引脚不一样,需要去 BOARD_InitPins() 里进行相应的修改:

 

例程是板对板通信,在这里我们用不到,只需使用逻辑分析仪抓取波形查看即可,所以图中的数据校验和 Disable SPI 都可注释掉:

 

让我们现在连接上逻辑分析仪先抓取一波例程的波形,如下图:

可以看出总共发送了 64 Byte 数据,但目前只是发送了一次,

 

而我们在实际使用过程中需要多次进行发送和读取,比如在使用 SPI Flash 的过程中,需要分多次连续写入数据的话就需要多次进行发送,现在我们就在后面再次发送同样的数据,为了方便观察,我们将要发送的数据长度改为 8 个 Byte ,如下图所示:

连续发送两次

修改发送数据长度



Build 、下载,抓取波形后如下图:

可以看到发送的数据内容是一样,但是不同的是片选线不一样了,前面是发完 8 个 Byte 后才拉高,后面的是每发一个 Byte 就拉高一次。

在调试 SPI 的从设备时,我们都是根据从设备数据手册中要求的波形去发送和接收的,如果要求是需要发完一连串的数据才可以拉高片选信号线,这里的底层驱动就需要做一点点修改才能符合需求了。

如下图,需要在 SPI_MasterTransferBlocking 函数中添加以下两行代码:

Rebuild 下载,抓取波形:

可以看到现在的波形是发送完全部数据之后才拉高了,这里的原因就在于 TXDATCTL 寄存器这两个 bit :EOT & EOF

EOT : End of Transfer 的缩小,就是以发送结束拉高片选线, 0 则会在每次发送完后保持有效,1 则会在每次发送完后置为无效。

EOF : End of Frame 的缩小,则是一帧数据,也就是一串数据(包含了很多个 Byte)发送期间会一直保持有效。

在第一次调用 SPI_MasterTransferBlocking 函数发送数据后 EOF 先被置 1 ,发送最后一个 Byte 的时候 EOT 被置 1 ;在下一次调用时 EOT 还是一直处于置 1 状态,就会出现每发 1 个 Byte 就拉高一次 SSEL ,所以需要在发送之前清除 EOT 位,才可以保证发送完一帧数据才拉高。

 

 

参考资料:

  1. 《LPC84X User Manual》

用户手册包含了外设配置方法,由 NXP 官网提供下载,链接如下:

https://www.nxp.com.cn/products/processors-and-microcontrollers/arm-microcontrollers/general-purpose-mcus/lpc800-cortex-m0-plus-/low-cost-microcontrollers-mcus-based-on-arm-cortex-m0-plus-cores:LPC84X?fpsp=1&tab=Documentation_Tab

  1. LPC845 官方 SDK 包

SDK 包里包含了许多例程,由 NXP 官网提供下载,链接如下:

https://mcuxpresso.nxp.com/en/select

★博文内容均由个人提供,与平台无关,如有违法或侵权,请与网站管理员联系。

★文明上网,请理性发言。内容一周内被举报5次,发文人进小黑屋喔~

评论