【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 位,才可以保证发送完一帧数据才拉高。
参考资料:
- 《LPC84X User Manual》
用户手册包含了外设配置方法,由 NXP 官网提供下载,链接如下:
- LPC845 官方 SDK 包
SDK 包里包含了许多例程,由 NXP 官网提供下载,链接如下:
https://mcuxpresso.nxp.com/en/select
评论