SPI总线学习
先来看看Arduino官方的SPI库:
此库允许使用Arduino板子作为主机与其他的SPI设备进行通信。SPI接口是一种同步的数据传输协议。用于实现微控制器与一个或者多个其他设备之间的短距离数据通信。当然它也可以完成两个微控制器之前的数据通信,在SPI的连接中,通常会有一个主机(一般是微控制器)用于控制其它的外围设备。一般情况下,所有的连接中都有三根通信信号线:
MISO -- 主机输入,从机输出。从机线,用于从机向主机发送数据。
MOSI -- 主机输出,从机输入。主机线,用于主机向从机发送数据。
SCK -- 串行时钟线。由主机控制,用于控制数据传输的同步。
同时Arduino还可以指定一条SS线 -- 主机可以通过每个设备上的SS引脚来使能或禁止用与对应从机的数据通信。当它为高时,对应的从机会忽略主机的通信动作。当它为低时,对应的设备和主机可以正常通信。这样就允许在同一个主机的同一个SPI外设上挂接多个SPI从设备,它们共享相同的MOSI,MISO,SCK线。
在编写一个新的从机对应的通信代码时,需要注意以一几点:
(1) 数据移位的顺序,是高位在前还是低位在前,这个可以使用函数SPI.setBitOrder()来进行设置。
(2) 时钟线空闲时是高电平还是低电平,数据的采样发生在上升沿还是下降沿,这些模式可以使用函数SPI.setDataMode()来设置。
(3) SPI总线通信的速率,这个可以使用SPI.setClockDivider()来设置。
SPI总线标准比较宽松,不同的器件或设置之前存在着一些差异。这就意味着,我们在对一个器件编写接口程序时要特别留意其器件手册中相关的说明。
一般情况下,SPI有4种不同的传输模式,这些模式的区别主要在于:
(1) 数据是在时钟线的上升沿移入还是在时钟线的下降沿移入(称为时钟相位);
(2) 空闲状态下时钟线是高电平还是低电平(称为时钟极性)。
这四种模式如下表:
根据上表,在调用SPI.setDataMode()函数时填写相应的参数即可对极性和相位进行控制。
每个SPI接口的器件都有一个最大通人速率,函数SPI.setClockDivider()允许指定一个合适的通信速率(默认为4MHz)。
1. 函数简要说明:
begin() -- 通过设置SCK,MOSI,SS为输出,拉低SCK,MOSI,拉高SS引脚等操作来初始化SPI总线。
end() -- 禁用SPI总线,但是SPI总线初始化时配置的IO引脚模式会保持不变。
setBitOrder() -- 设置SPI总线上数据移位的先后顺序(高位在前或低位在前).
setClockDivider() -- 设置SPI总线时钟相对于系统时钟的分频器。
setDataMode() -- 设置SPI总线数据格式(时钟极性及相位)。
transfer() -- 通过SPI总线传输一个字节,包括发送和接收数据。
2. 详细说明:
setBitOrder()
语法:SPI.setBitOrder(order)
SPI.setBitOrder(slaveSelectPin,order) 【Arduino Due Only】
参数:order -- LSBFIRST或MSBFIRST
slaveSelectPin -- 从机使能引脚(SS),【Arduino Due Only】
setClockDivider()
语法:SPI.setClockDivider(divider)
SPI.setClockDivider(slaveSelectPin,divider)【Arduino Due Only】
参数:slaveSelectPin -- 同setBitOrder()
divider -- SPI_CLOCK_DIV2 【基于AVR的Arduino开发板】
-- SPI_CLOCK_DIV4
-- SPI_CLOCK_DIV8
-- SPI_CLOCK_DIV16
-- SPI_CLOCK_DIV32
-- SPI_CLOCK_DIV64
-- SPI_CLOCK_DIV128
-- 当然如果是Arduino Due开发板的话,该参数可以是一个1-255的数值。
setDataMode()
语法:SPI.setDataMode(mode)
SPI.setDataMode(slaveSelectPin,mode)
参数:mode -- SPI_MODE0
-- SPI_MODE1
-- SPI_MODE2
-- SPI_MODE3
slaveSelectPin -- 同前面的setBitOrder()
transfer()
语法:SPI.transfer(val)
SPI.transfer(slaveSelectPin,val)
SPI.transfer(slaveSelectPin,val,transferMode)
参数:val -- 要发送的字节内容
slaveSelectPin -- 从机的SS引脚控制(Arduino Due Only)
transferMode -- SPI_CONTINUE:保持SS引脚一直为低,允许后续字节的传输。
-- SPI_LAST:默认值,如果未填 写该参数的情况下为该值,在一个字节传输完成后,SS引脚会被拉高(Arduino Due Only).
返回:从总线上读到的数据字节。
先来看看Arduino官方的SPI库:
此库允许使用Arduino板子作为主机与其他的SPI设备进行通信。SPI接口是一种同步的数据传输协议。用于实现微控制器与一个或者多个其他设备之间的短距离数据通信。当然它也可以完成两个微控制器之前的数据通信,在SPI的连接中,通常会有一个主机(一般是微控制器)用于控制其它的外围设备。一般情况下,所有的连接中都有三根通信信号线:
MISO -- 主机输入,从机输出。从机线,用于从机向主机发送数据。
MOSI -- 主机输出,从机输入。主机线,用于主机向从机发送数据。
SCK -- 串行时钟线。由主机控制,用于控制数据传输的同步。
同时Arduino还可以指定一条SS线 -- 主机可以通过每个设备上的SS引脚来使能或禁止用与对应从机的数据通信。当它为高时,对应的从机会忽略主机的通信动作。当它为低时,对应的设备和主机可以正常通信。这样就允许在同一个主机的同一个SPI外设上挂接多个SPI从设备,它们共享相同的MOSI,MISO,SCK线。
在编写一个新的从机对应的通信代码时,需要注意以一几点:
(1) 数据移位的顺序,是高位在前还是低位在前,这个可以使用函数SPI.setBitOrder()来进行设置。
(2) 时钟线空闲时是高电平还是低电平,数据的采样发生在上升沿还是下降沿,这些模式可以使用函数SPI.setDataMode()来设置。
(3) SPI总线通信的速率,这个可以使用SPI.setClockDivider()来设置。
SPI总线标准比较宽松,不同的器件或设置之前存在着一些差异。这就意味着,我们在对一个器件编写接口程序时要特别留意其器件手册中相关的说明。
一般情况下,SPI有4种不同的传输模式,这些模式的区别主要在于:
(1) 数据是在时钟线的上升沿移入还是在时钟线的下降沿移入(称为时钟相位);
(2) 空闲状态下时钟线是高电平还是低电平(称为时钟极性)。
这四种模式如下表:
模式 |
时钟极性(CPOL) |
时钟相位(CPHA) |
SPI_MODE0 |
0 |
0 |
SPI_MODE1 |
0 |
1 |
SPI_MODE2 |
1 |
0 |
SPI_MODE3 |
1 |
1 |
根据上表,在调用SPI.setDataMode()函数时填写相应的参数即可对极性和相位进行控制。
每个SPI接口的器件都有一个最大通人速率,函数SPI.setClockDivider()允许指定一个合适的通信速率(默认为4MHz)。
1. 函数简要说明:
begin() -- 通过设置SCK,MOSI,SS为输出,拉低SCK,MOSI,拉高SS引脚等操作来初始化SPI总线。
end() -- 禁用SPI总线,但是SPI总线初始化时配置的IO引脚模式会保持不变。
setBitOrder() -- 设置SPI总线上数据移位的先后顺序(高位在前或低位在前).
setClockDivider() -- 设置SPI总线时钟相对于系统时钟的分频器。
setDataMode() -- 设置SPI总线数据格式(时钟极性及相位)。
transfer() -- 通过SPI总线传输一个字节,包括发送和接收数据。
2. 详细说明:
setBitOrder()
语法:SPI.setBitOrder(order)
SPI.setBitOrder(slaveSelectPin,order) 【Arduino Due Only】
参数:order -- LSBFIRST或MSBFIRST
slaveSelectPin -- 从机使能引脚(SS),【Arduino Due Only】
setClockDivider()
语法:SPI.setClockDivider(divider)
SPI.setClockDivider(slaveSelectPin,divider)【Arduino Due Only】
参数:slaveSelectPin -- 同setBitOrder()
divider -- SPI_CLOCK_DIV2 【基于AVR的Arduino开发板】
-- SPI_CLOCK_DIV4
-- SPI_CLOCK_DIV8
-- SPI_CLOCK_DIV16
-- SPI_CLOCK_DIV32
-- SPI_CLOCK_DIV64
-- SPI_CLOCK_DIV128
-- 当然如果是Arduino Due开发板的话,该参数可以是一个1-255的数值。
setDataMode()
语法:SPI.setDataMode(mode)
SPI.setDataMode(slaveSelectPin,mode)
参数:mode -- SPI_MODE0
-- SPI_MODE1
-- SPI_MODE2
-- SPI_MODE3
slaveSelectPin -- 同前面的setBitOrder()
transfer()
语法:SPI.transfer(val)
SPI.transfer(slaveSelectPin,val)
SPI.transfer(slaveSelectPin,val,transferMode)
参数:val -- 要发送的字节内容
slaveSelectPin -- 从机的SS引脚控制(Arduino Due Only)
transferMode -- SPI_CONTINUE:保持SS引脚一直为低,允许后续字节的传输。
-- SPI_LAST:默认值,如果未填 写该参数的情况下为该值,在一个字节传输完成后,SS引脚会被拉高(Arduino Due Only).
返回:从总线上读到的数据字节。
回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
vscode+cmake搭建雅特力AT32L021开发环境被打赏30分 | |
【换取逻辑分析仪】自制底板并驱动ArduinoNanoRP2040ConnectLCD扩展板被打赏47分 | |
【分享评测,赢取加热台】RISC-V GCC 内嵌汇编使用被打赏38分 | |
【换取逻辑分析仪】-基于ADI单片机MAX78000的简易MP3音乐播放器被打赏48分 | |
我想要一部加热台+树莓派PICO驱动AHT10被打赏38分 | |
【换取逻辑分析仪】-硬件SPI驱动OLED屏幕被打赏36分 | |
换逻辑分析仪+上下拉与多路选择器被打赏29分 | |
Let'sdo第3期任务合集被打赏50分 | |
换逻辑分析仪+Verilog三态门被打赏27分 | |
换逻辑分析仪+Verilog多输出门被打赏24分 |