实战技能分享,各种数据类型的SPI, UART, I2C,FDCAN等方式的通信传输以及存储到EEPROM, Flash等设备的简易实现方法

news/2025/2/22 5:16:25/

目录

背景知识

F1编程手册:

F3和F4编程手册:

F7和H7编程手册:

各种数据类型编程EEPROM,SPI Flash等存储器的简易方法

各种数据类型的SPI,UART,I2C,FDCAN等传输问题

实战案例:

补充拓展贴,特别是结构体对齐问题:


背景知识

各种类型的数据传输和存储就涉及到大小端的问题,所以我们在开头把这个知识点做个说明。

 

首先要简单说下芯片的大小端问题,我们这里主要讨论Cortex-M内核。

权威指南的说明如下:
Support for little endian and big endian memory systems e The Cortex-M3 and Cortex-M4 processors can work with either little endian or big endian memory systems. In practice, a microcontroller product is normally designed with just one endian configuration.

M内核支持大端或者小端,实际应用中大部分内核都是小端。以STM32为例,全部都是小端,而且是芯片设计之初就固化进去的,不可修改。市面上其他厂家基本也都固化的小端格式。
 

F1编程手册:

 

F3和F4编程手册:

 

F7和H7编程手册:

 


各种数据类型编程EEPROM,SPI Flash等存储器的简易方法


一般这些存储器都是字节编程,写入浮点等数据类型时不太方便。

这里分享一个方法,定义一个结构体,将各种数据类型封装进去:

 

写入的时候采用下面方式:

 

读取时可以采用下面方式:

 

各种数据类型的SPI,UART,I2C,FDCAN等传输问题


这里我们以串口通信为例,比如主机要发送如下格式数据给从机:

 

我们可以做一个如下结构体格式:

typedef struct
{uint8_t ucStart;                        uint16_t usCO2;uint16_t usPM25;        uint16_t usHumidity;          float    Temprature;uint32_t ulParam;uint8_t  ucEnd1;           uint8_t  ucEnd2;   
}
UART_T;UART_T g_tUartParam;

主机发送的时候我们就可以采用如下方法:

comSendBuf(COM1, (uint8_t *)&g_tUartParam, sizeof(UART_T));

从机工程也定义一个同样的结构体变量,比如我们把接收到一帧数据存到缓冲uint8_t buf[50]里面了。

我们就可以定义一个结构体指针变量:

UART_T *pUartParam;
pUartParam = (UART_T *)buf;

那么我们就可以pUartParam->usCO2,  pUartParam->Temprature等方式来访问,非常方便。
 


实战案例:


大家可以下载我们论坛置顶帖V5,V6或者V7板子出厂程序,里面都有相关代码参考。

 

补充拓展贴,特别是结构体对齐问题:


1、【烧脑技术贴】无法回避的字节对齐问题,从八个方向深入探讨(变量对齐,栈对齐,DMA对齐,结构体成对齐,Cache, RTOS双堆栈等):地址链接

2、推荐一种超简单的硬件位带bitband操作方法,让变量,寄存器控制,IO访问更便捷,无需用户计算位置:地址链接


http://www.ppmy.cn/news/832518.html

相关文章

Python第二天之容器学习

1.List 容器无非就增删改查 1.添加 name_list [aaa,bbb,ccc,ddd] name_list.append(b1) name_list.insert(1,xxx) print(name_list)append 是在后面追加 而insert是自己定义下表插入 name_list [aaa,bbb,ccc,ddd] name_list2 [qqq,222,111] name_list.extend(name_list…

基于STM32F4实现串口1+DMA中断+环形队列的数据收发处理

基于STM32F4实现串口1DMA中断环形队列的数据收发处理 用法简介总体方案环形队列的实现串口配置串口接收DMA配置串口发送DMA配置注意事项 总结 用法简介 串口加环形队列基本满足普通单片机的数据收发处理,实现起来简单可靠,但实际项目中会出现多个串口连…

PLC、STM32单片机、PC端485modbus通信调试过程

设备明细: PLC:埃森ARS-010-32PLC,软件AR Logic Editor。 单片机:STM32F103RCT6,软件keil。 测试软件:modbus串口调试软件、modbus poll。 调试过程: PLC:从机,站号1 …

(一)基于STM32f103的I2C通信接口的EPPROM模块(24C256)读写程序详解

我看了很多网上的解释,都是先官方的说明I2C协议,再潦草的给出不完整的程序,导致你们又看不懂I2C原理又调试不出程序,所以我这篇文章先专门针对程序,先使你们的程序调试成功,再利用仿真或其他方式回去理解I2…

14 玩转STM32之IIC通信详解(软件模拟篇)看这篇就够了

14.1 IIC协议详细说明 IIC有模拟和芯片自带的两种方式。软件模拟方式具有引脚可以任意分配,软件修改灵活对PCB设计也有一定的优点,但是缺点也是非常明显的,因为采用的是软件进行会产生较长时间的延时,对于一些要求较高的场合并不…

MCU IIC模拟从机通信

一、MCU模拟ADC芯片 MCU采用的是S9KEAZ128,通信方式硬件IIC,ADC芯片为ADS1015。 模拟从机通信主要考虑2个方面: 1.硬件IIC中断通过信号判断状态 1)起始位检测; 2)停止位检测。停止位检测中接收数据,判断寄存器值&am…

IO口软件模拟IIC

一、IIC时序 IIC(Inter-Integrated Circuit, 内部集成电路)总线是飞利浦公司开发的两线式串行总线,用于短距离传输,常用语微控制器及其外围设备。它是由数据线SDA和时钟线SCL构成的串行总线,可发送和接收数据。 I2C总线通过上拉电阻接正电源…

模拟IIC_读写BQ40Z50模块

读写BQ40Z50模块,我使用的是32单片机 该模拟IIC仅适用于BQ40Z50模块,因为每个模块延时有差异 1.初始化GPIO,根据你所使用的单片机完成初始化 __HAL_RCC_GPIOH_CLK_ENABLE();//初始化时钟/*IIC3 Configure GPIO pins : PIPin PIPin */GPIO_In…