当前位置: 首页 > news >正文

STM32 I2C案例2:硬件实现I2C 代码书写

STM32的 I2C 外设可用作通讯的主机及从机

STM32的 I2C 外设可用作通讯的主机及从机,支持100Kbit/s和400Kbit/s的速率,支持7位、10位设备地址,支持DMA数据传输,并具有数据校验功能。

STM32的I2C外设还支持 SMBus2.0协议,SMBus协议与I2C类似。

SMBus2.0硬件层面支持报警操作。

上拉电阻因为有电阻,所以电容会缓慢上电,所以电平会是缓慢上升,下降时电容接地,因为没有电阻阻拦,所以成为低电平用时会非常短,接近无。

NOSTERETCH 位禁止时钟延长:从设备会将SCL线拉低,告诉主设备传输太快,主设备会停止,直到从设备拉高。

创建:interface(接口层)

Interface->EEPROM->m24c02.h

#ifndef __M24C02_H__
#define __M24C02_H__#include "soft_i2c.h"#define READ_ADDR 0xA1
#define WRITE_ADDR 0xA0void M24C02_Init(void);
//写一个字节
void M24C02_SaveByte(uint8_t byte,uint8_t addr);
//读一个字节
uint8_t M24C02_ReadByte(uint8_t addr);
//写多个字节
void M24C02_SaveBytes(uint8_t *bytes,uint8_t len,uint8_t  start_addr);
//读多个字节
void M24C02_ReadBytes(uint8_t *buffer,uint8_t len,uint8_t  start_addr);#endif /* __M24C02_H__ */

Interface->EEPROM->m24c02.c

#include "m24c02.h"void M24C02_Init(void)
{I2C_Init();
}void M24C02_SaveByte(uint8_t byte, uint8_t addr)
{I2C_Start();I2C_SendByte(WRITE_ADDR);I2C_Wait4ACK();I2C_SendByte(addr);I2C_Wait4ACK();I2C_SendByte(byte);I2C_Wait4ACK();I2C_Stop();Delay_ms(5);
}uint8_t M24C02_ReadByte(uint8_t addr)
{I2C_Start();I2C_SendByte(WRITE_ADDR);I2C_Wait4ACK();I2C_SendByte(addr);I2C_Wait4ACK();I2C_Start();I2C_SendByte(READ_ADDR);I2C_Wait4ACK();uint8_t result = I2C_ReceiveByte();I2C_NOACK();return result;
}void M24C02_SaveBytes(uint8_t *bytes, uint8_t len, uint8_t start_addr)
{I2C_Start();I2C_SendByte(WRITE_ADDR);I2C_Wait4ACK();I2C_SendByte(start_addr);I2C_Wait4ACK();for (uint8_t i = 0; i < len; i++){I2C_SendByte(bytes[i]);I2C_Wait4ACK();}I2C_Stop();Delay_ms(5);
}void M24C02_ReadBytes(uint8_t *buffer, uint8_t len, uint8_t start_addr)
{I2C_Start();I2C_SendByte(WRITE_ADDR);I2C_Wait4ACK();I2C_SendByte(start_addr);I2C_Wait4ACK();I2C_Start();I2C_SendByte(READ_ADDR);I2C_Wait4ACK();for (uint8_t i = 0; i < len; i++){buffer[i] = I2C_ReceiveByte();if (i == len - 1){I2C_NOACK();}else{I2C_ACK();}  }I2C_Stop();
}

User->main.c

#include "usart1.h"
#include "string.h"
#include <stdio.h>
#include "soft_i2c.h"
#include "m24c02.h"int main(void){Usart1_Init();M24C02_Init();M24C02_SaveByte('b',0x02);uint8_t v = M24C02_ReadByte(0x02);printf ("%c\n",v);uint8_t * str = "hello";M24C02_SaveBytes(str,strlen((const char *)str),0x03);uint8_t buffer[10] = {0};M24C02_ReadBytes(buffer,10,0x03);printf("%s",buffer);while (1){}}

VOFA+软件验证

如果换成字符串展示的话:


http://www.mrgr.cn/news/79135.html

相关文章:

  • 进程通讯——类型和发展
  • 新年祝词(原创)
  • unity免费资源2025-1-26
  • npm run dev 时直接打开Chrome浏览器
  • STM32的集成开发环境STM32CubeIDE安装
  • vscode【实用插件】Material Icon Theme 美化文件图标
  • 【Linux---10】本地机器 <=> 服务器 文件互传
  • 工业—使用Flink处理Kafka中的数据_ProduceRecord2
  • 【RDMA】RDMA read和write编程实例(verbs API)
  • React第十一节 组件之间通讯之发布订阅模式(自定义发布订阅器)
  • 微信小程序横滑定位元素案例代码
  • 【go】select 语句case的随机性
  • Python矩阵并行计算;CuPy-CUDA 实现显存加速:;在Python中实现显存加速或卸载;CuPy 和 NumPy 区别
  • compose组件库
  • java调用cmdsh命令
  • 流媒体之linux下离线部署FFmpeg 和 SRS
  • MongoDB集群的介绍与搭建
  • 【测试工具JMeter篇】JMeter性能测试入门级教程(七):JMeter断言
  • pset2 substitution.c
  • Linux内核__setup 宏的作用及分析
  • [go-redis]客户端的创建与配置说明
  • ansible自动化运维(二)ad-hoc模式
  • 网络层总结
  • 基于TensorFlow框架的线性回归实现
  • AI处理器组合--华为OD机试2024年E卷
  • 两个畸变矩阵相乘后还是一个2*2的矩阵,有四个畸变元素。1、畸变矩阵吸收了法拉第矩阵。2、畸变矩阵也给法拉第旋转角带来模糊(求解有多种可能)