Micropython——SPI通讯协议的基础实践
1、什么是SPI通讯协议?
SPI(串行外设接口)是一种高速的,全双工,同步的通讯总线,并且在芯片的管脚上只占用四根线。
2、工作方式是什么?
其以主从方式工作,这种模式通常一个主设备对应一个或者多个从设备。双向传输需要4根线,单向传输为3根线。这四根线分别为SDI(数据输入),SDO(数据输出),SCK(时钟),CS(片选)。当为单向传输时,其可以不需要SDI。
- SDO – 主设备数据输出,从设备数据输入 对应MOSI master output slave input
- SDI – 主设备数据输入,从设备数据输出 对应MISO master input slave output
- SCLK – 时钟信号,由主设备产生
- CS – 从设备选择,由主设备控制,用来选择从设别。功能是主设备可以与特定从设备通信,避免数据线上的冲突。
3、通讯速率是多少?
SPI并没有规定最高速度,通讯速率完全是由通信双方的能力所决定。在实际使用情况中,需要根据通讯双方的数据手册和实际情况来调整通讯速率。
4、Raspberry Pi Pico的SPI主要参数
RP2040有两个相同的SPI控制器,都是基于ARM Primecell同步串口(SSP)(PL022)
1、支持主从模式
- 支持摩托罗拉SPI接口
- 支持德州仪器同步串行接口(SSI)
- 支持美国国家半导体Microwire接口
2、8单位深度收发先进先出存储器(8 deep TX and RX FIFOs)
3、中断生成器可服务于先进先出存储器或者错误标识
4、可使用DMA驱动
5、可编程时钟
6、可编程数据大小(4-16bit)
1、machien.SPI(id,baudrate= 500000, polarity = 0, phase = 0, bits = 8, firstbit = 0, sck = None, mosi = None, miso = None)
#id :使用的SPI通道,可为0或者1
#baudrate :SPI通讯速率,也就是SCK引脚上的频率
#polarity : 时钟极性(为1或者0),若为0则总线空闲时SCK输出低电平,反之则输出高电平
#phase :时钟相位(为1或者0),若为0则在第一个时钟边缘捕获数据,反之则在第二个时钟边缘捕获数据
#bits :每次传输的数据位数
#firstbit :先传输高位还是低位
#sck / nosi /miso :均为SPI使用的引脚,应为Pin 对象
2、SPI.init()
#init :用于重新启动SPI
3、SPI.denit()
#denit :用于关闭SPI
4、SPI.read(nbytes ,write = 0x00)
#read 函数,用于读取从设备数据并返回
#nbytes :读取字节数
#write :读取数据时,MOSI输出数据
5、SPI。readinto(buf ,write = 0x00)
#readinto 函数,用于读取从设备数据并存入指定字符数组中
#buf :字符数组,用于存放接收数据
#write : 字符数组,MOSI输出数据
6、SPI.write(buf)
#写入 buf 中包含的字节。返回None
#buf :字符数组,用于存放传输数据
7、SPI.write_readinto(write_buf,rad_buf)
#write_readinto 函数,用于同时发送和接收数据
#write_buf :字符数据,用于存放传输数据
#read_buf :字符数组,用于存放接收数据
传输和接收数据的字符数组的长度要求一致