2026/4/3 22:46:29
网站建设
项目流程
asp网站改成php,手机温州网,贝锐免费域名,做网站有高手没有SPI通信SPI介绍SPI 的全称是Serial Peripheral Interface#xff08;串行外设接口#xff09;是一种同步串行通信技术#xff0c;Motorola 首先提出的全双工三线/四线同步串行外围接口#xff0c;采用主从模式架构#xff0c;时钟由Master控制#xff0c;在时钟移位脉冲下…SPI通信SPI介绍SPI 的全称是Serial Peripheral Interface串行外设接口是一种同步串行通信技术Motorola 首先提出的全双工三线/四线同步串行外围接口采用主从模式架构时钟由Master控制在时钟移位脉冲下数据按位传输高位在前低位在后SPI接口有2根单向数据线为全双工通信。SPI总线被广泛地使用在FLASH、ADC、LCD等设备与MCU间要求通讯速率较高的场合。SPI总线拓扑结构SPI总共有4根总线分别是设备选择线、时钟线、串行输出数据线、串行输入数据线。M : Master O : Output S : Slave I : InputMOSI主器件数据输出从器件数据输入MISO主器件数据输入从器件数据输出SCLK 时钟信号由主器件产生/SS从器件使能信号由主器件控制片选nss、cs低电平有效注SPI如果一主一从则只需要三根线即可片选线可以不使用SPI一主多从通信时通过SS片选线来区分主机和哪个或哪几个从机进行通信只需要主机将要和从机通信的SS电平拉低即可SPI特点同步串行全双工的通信协议遵循高位先行的数据传输方式实现一主多从通信通过片选线区分从机是一个3线或4线的通信协议SPI总线协议起始信号:NSS信号线由高变低(NSS是片选信号使能信号)结束信号NSS信号由低变高是SPI通讯的停止信号数据传输SPI通信以字节(8位)为单位进行数据传输每个字节的最高有效位MSB先传输然后是次高有效位依此类推直到最低有效位LSB传输完毕。在数据传输过程中每次接收到的数据必须在下次数据传输前被采样否则可能会导致数据丢失或SPI模块失效。通信过程1主设备先选择要进行通信的从设备将SS或CS信号置为低电平表示选择该从设备。2然后主设备开始发送时钟信号SCK从设备根据时钟信号来接收和发送数据。3主设备通过MOSI线向从设备发送数据同时通过MISO线接收从设备发送的数据。4数据传输结束后主设备将SS或CS信号置为高电平表示通信结束。SPI工作模式在SPI操作中最重要的两项设置就是时钟极性clock polarityCPOL和时钟相位clock phaseCPHA它们是决定数据传输 “节奏” 的两个核心参数。CPOL0、1CPHA0、1时钟极性CPOL定义时钟 “空闲状态”的电平当CPOL 0SCK引脚在空闲状态保持低电平当CPOL 1SCK引脚在空闲状态保持高电平。时钟相位CPHA定义数据的 “采样时刻”当 CPHA0 时MOSI或 MISO 数据线上的信号将会在 SCK时钟线的奇数边沿被采样当 CPHA1时 MOSI或 MISO 数据线上的信号将会在 SCK时钟线的偶数边沿被采样时钟相位CPHA0时表示在奇数边沿采样此时时钟极性CPOL0表示空闲状态为低电平CPOL1表示空闲状态为高电平。数码管介绍LED数码管LED Segment Displays是由8个发光二极管构成并按照一定的图形及排列封装在一起的显示器件。其中7个LED构成7笔字形1个LED构成小数点固有时成为八段数码管。LED数码管有两大类一类是共阴极接法另一类是共阳极接法共阴极就是7段的显示字码共用一个电源的负极是高电平点亮共阳极就是7段的显示字码共用一个电源的正极是低电平点亮。我们对数码管所要显示的每个数字和字母进行编码然后在编程时将编码放在一个数组上需要显示什么数字或者字母从数组里面提取相应的编码就可显示所要显示的字符了。如图要显示数字“5”时编码为0x6D。如果数码管为共阳极只需要对共阴极的编码做一个取反操作即可。74HC595芯片分析参考其它文章软件SPICubeMX初始化打开引脚为GPIO功能可见通信方式为模式0SPI驱动文件创建创建自己的.c和.h文件驱动代码编写MySpi.c#include MySpi.h#define SPI_NSS1_PORT GPIOB#define SPI_NSS1_PIN GPIO_PIN_12#define SPI_SCL_PORT GPIOB#define SPI_SCL_PIN GPIO_PIN_13#define SPI_MOSI_PORT GPIOB#define SPI_MOSI_PIN GPIO_PIN_15voidMySpi_W_NSS1(uint8_tstate){HAL_GPIO_WritePin(SPI_NSS1_PORT,SPI_NSS1_PIN,state);}voidMySpi_W_SCK(uint8_tstate){HAL_GPIO_WritePin(SPI_SCL_PORT,SPI_SCL_PIN,state);}voidMySpi_W_MOSI(uint8_tstate){HAL_GPIO_WritePin(SPI_MOSI_PORT,SPI_MOSI_PIN,state);}voidMySpi_Init(void){MySpi_W_SCK(0);MySpi_W_MOSI(0);MySpi_W_NSS1(1);}voidMySpi_Start(){MySpi_W_NSS1(0);}voidMySpi_Stop(){MySpi_W_NSS1(1);}voidMySpi_SendByte(uint8_tSendByte){for(inti0;i8;i){MySpi_W_SCK(0);MySpi_W_MOSI((SendByte0x80)?1:0);MySpi_W_SCK(1);SendByte1;}}MySpi.h#ifndef __MYSPI_H__#define __MYSPI_H__#include stm32u5xx_hal.hvoidMySpi_W_NSS1(uint8_tstate);voidMySpi_W_SCK(uint8_tstate);voidMySpi_W_MOSI(uint8_tstate);voidMySpi_Init(void);voidMySpi_Start();voidMySpi_Stop();voidMySpi_SendByte(uint8_tSendByte);#endif调用驱动函数实现数码管显示/* USER CODE BEGIN 2 */MySpi_Init();/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while(1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */MySpi_Start();MySpi_SendByte(0x01);MySpi_SendByte(0x6F);MySpi_Stop();MySpi_Start();MySpi_SendByte(0x02);MySpi_SendByte(0x06);MySpi_Stop();}硬件SPI当使用的芯片SPI外设容易卡死时用软件SPI当对速度要求较高时用硬件SPISPI外设虽然简单好用但是存在卡死不可靠的风险软件SPI完全可靠时序可以完全掌握在开发者的手中但是速度上限低。LCD原理三基色红R绿G蓝BRGB565一个像素点显示正绿色的十六进制0000 0111 1110 0000 0x 07e0320 * 240 *2 153600颜色深度和分辨率的区别颜色的深度指的是一个像素点可以有多少种颜色一般以位为单位我们的屏幕是16位分辨率指的是有多少个像素点320*240*2 153600 字节