连接片内外设功能的VLSI外设总线的VPB以及各种片内外设,包括定时器、ADC、GPIO、实时时钟、I2C接口、SPI接口等。片上外设(On-chip Peripherals)是指嵌入式系统或集成电路芯片上集成的各种功能模块或接口,用于与外部设备进行通信、控制和数据交换。这些外设可以与主处理器或控制器协同工作,扩展系统的功能和应用范围。常见的片上外设包括但不限于以下几种:
本文简单学习串行通信接口;
一、UART(通用异步收发器)
是一种常见的串行通信接口协议,用于在计算机和外部设备之间的传输数据。是一种简单且可靠的通信方式,UART使用两根信号线进行通信:一根用于数据传输(TX、发送),另一根用于接收数据(RX,接收)
通信方式
1、异步串行通信、收/发
2、半双工通信、可发可收、但不能同时进行
3、全双工通信,可以同时收发
起始与终止信号:SCL为高期间,
SDA : 由高到低,起始信号
SDA:由低到高,终止信号
起始信号和终止信号都是由主机发送的。在起始信号产生之后,总线就处于被占用的状态,在终止信号产生之后,总线就处于空闲状态
每当发送器传输完一个字节的数据之后,发送端会等待一定的时间,等接收方的应答信号。接收端通过拉低SDA数据线,给发送端发送一个应答信号,以提醒发送端我这边已经接受完成,数据可以继续传输,接下来,发送端就可以继续发送数据了。
三、SPI
SPI
是一个同步的数据总线,也就是说它是用单独的数据线和一个单独的时钟信号来保证发送端和接收端的完美同步。
时钟是一个振荡信号,它告诉接收端在确切的时机对数据线上的信号进行采样。
产生时钟的一侧称为主机,另一侧称为从机。总是只有一个主机(一般来说可以是微控制器/MCU),但是可以有多个从机;
SPI是“全双工”(具有单独的发送和接收线路),因此可以在同一时间发送和接收数据,另外SPI的接收硬件可以是一个简单的移位寄存器。这比异步串行通信所需的完整UART要简单得多,并且更加便宜;
-
MISO: Master input slave output
主机输入,从机输出(数据来自从机); -
MOSI: Master output slave input
主机输出,从机输入(数据来自主机); -
SCLK : Serial Clock
串行时钟信号,由主机产生发送给从机; -
SS: Slave Select
片选信号,由主机发送,以控制与哪个从机通信,通常是低电平有效信号。
SPI通讯的优势
-
全双工串行通信; -
高速数据传输速率。 -
简单的软件配置; 极其灵活的数据传输,不限于8位,它可以是任意大小的字; 非常简单的硬件结构。从站不需要唯一地址(与I2C不同)。从机使用主机时钟,不需要精密时钟振荡器/晶振(与UART不同)。不需要收发器(与CAN不同)。
SPI的缺点
- 没有硬件从机应答信号(主机可能在不知情的情况下无处发送);
- 通常仅支持一个主设备;
- 需要更多的引脚(与I2C不同);
- 没有定义硬件级别的错误检查协议;
- 与RS-232和CAN总线相比,只能支持非常短的距离;
截取了部分HAL库代码,比较简单,具体如下:
static void MX_SPI1_Init(void)
{
hspi1.Instance = SPI1;
hspi1.Init.Mode = SPI_MODE_MASTER; //主机模式
hspi1.Init.Direction = SPI_DIRECTION_2LINES; //全双工
hspi1.Init.DataSize = SPI_DATASIZE_8BIT; //数据位为8位
hspi1.Init.CLKPolarity = SPI_POLARITY_LOW; //CPOL=0
hspi1.Init.CLKPhase = SPI_PHASE_1EDGE; //CPHA为数据线的第一个变化沿
hspi1.Init.NSS = SPI_NSS_SOFT; //软件控制NSS
hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2;//2分频,32M/2=16MHz
hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB; //最高位先发送
hspi1.Init.TIMode = SPI_TIMODE_DISABLE; //TIMODE模式关闭
hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;//CRC关闭
hspi1.Init.CRCPolynomial = 10; //默认值,无效
if (HAL_SPI_Init(&hspi1) != HAL_OK) //初始化
{
_Error_Handler(__FILE__, __LINE__);
}
}
//发送数据
HAL_StatusTypeDef
HAL_SPI_Transmit(SPI_HandleTypeDef *hspi,
uint8_t *pData,
uint16_t Size,
uint32_t Timeout);
//接收数据
HAL_StatusTypeDef
HAL_SPI_Receive(SPI_HandleTypeDef *hspi,
uint8_t *pData,
uint16_t Size,
uint32_t Timeout);
原创文章,作者:guozi,如若转载,请注明出处:https://www.sudun.com/ask/80783.html