小实战项目-第二章2.3软件IIC 硬件IIC讲解 STM32 IIC通讯协议讲解

这篇章我们说明硬件IIC,软件IIC和相关基础知识在这文章里面
添加链接描述

https://blog.csdn.net/qq_46187594/article/details/141642801

2.3-硬件I2C

我们还使用第0章的工程

初始化硬件IIC

设置串口,方便输出调试

重映射

c 复制代码
/**
* @brief 重定向printf (重定向fputc),
					使用时候记得勾选上魔法棒->Target->UseMicro LIB 
					可能需要在C文件加typedef struct __FILE FILE;
					包含这个文件#include "stdio.h"
* @param 
* @return 
*/
int fputc(int ch,FILE *stream)
{
	HAL_UART_Transmit(&huart1,( uint8_t *)&ch,1,0xFFFF);
	return ch;
}

不要忘记

我们先测试一下发送函数

c 复制代码
#include "MyApp.h"


//#define GY30	0XB8
#define GY30	0X46
//ADDR接高地址为OxB8(1011100)然后写就是最后一位0 就是0xB8 如果读就最后一位1 就是0xB9
//ADDR接低地址为0x46(0100011)然后写操作最后一位是0 就是0x46 如果是读最后一位1 就是0x47
/* Private variables----------------------------------------------------------*/

/* Public variables-----------------------------------------------------------*/
uint8_t DATA[2];
/* Private function prototypes------------------------------------------------*/ 
c 复制代码
/*******************
*  @brief  写一个Byte
*  @param  
*  @return  
*
*******************/
void GY30_Write_Byte(uint8_t Byte)
{
	HAL_I2C_Master_Transmit(&hi2c1,GY30,&Byte,1,1000);
}

波形如图没有问题

然后我们写读取数据的函数

c 复制代码
/*******************
*  @brief  读光照数据
*  @param  
*  @return  
*
*******************/
void GY30_Read_Byte(void)
{
	HAL_I2C_Master_Receive(&hi2c1, GY30|0x01,DATA, 2,1000);
}

然后我们看一下主函数

c 复制代码
	GY30_Write_Byte(0x01);
	GY30_Write_Byte(0x10);
    HAL_Delay(120);//延时
	GY30_Read_Byte();
	printf("数值:%d\r\n%d\r\n",DATA[0],DATA[1]);
	HAL_Delay(200);

	HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);

然后上面就实现了硬件IIC对数据的采集功能

我们看一下波形,注意这个传感器的ADDR是接低电平的

然后这样就是结束了。

总结一下:HAL的IIC还是非常好用的,他们封装好了,IIC的基本通信过程

比如:

c 复制代码
HAL_I2C_Master_Transmit(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout)

这个是单片机作为主机的时候,单片机发送一个或者多个字节。

I2C_HandleTypeDef *hi2c :选择要使用的IIC

DevAddress:从设备地址

pData:要发送的数据地址

Size:要发送数据的字节数

Timeout:超时等待时间

调用该函数就会自动发送,而且也会把读写位自动置位,什么起始信号,终止信号都在函数内部已经实现

这是波形

下面这个是读数据

c 复制代码
HAL_I2C_Master_Receive(&hi2c1, GY30|0x01,DATA, 2,1000);

&hi2c1:要读的设备地址。

GY30|0x01:从设备地址,这里|0x01 或0X01 是为了置为读数据位。

DATA:读出的数据存哪里,这是存储地址。

2:这是读的个数。

1000:超时等待时间。

相关推荐
沐欣工作室_lvyiyi3 分钟前
单片机无线霓虹灯系统设计(论文+源码)
单片机·嵌入式硬件·毕业设计·霓虹灯
恶魔泡泡糖10 分钟前
51单片机静态数码管应用1
单片机·嵌入式硬件·51单片机
专业开发者1 小时前
物联网应用的无线连接方案:状态监测
物联网
专业开发者1 小时前
蓝牙 Mesh 网络为欧司朗智能照明系统开启了全新的无线时代
网络·物联网
沐欣工作室_lvyiyi1 小时前
基于单片机的家庭煤气泄漏检测系统(论文+源码)
stm32·单片机·嵌入式硬件·煤气泄漏
风行男孩1 小时前
stm32基础学习——定时器的使用
stm32·单片机·学习
西城微科方案开发2 小时前
精准守护健康:西城微科电子体温计方案解析
单片机·嵌入式硬件·方案公司推荐
Saniffer_SH2 小时前
【每日一题】笔记本电脑上从U盘拷贝文件到M.2 SSD过程中为什么链路还会偶尔进入L1.2低功耗?
服务器·网络·人工智能·驱动开发·单片机·嵌入式硬件·电脑
yongche_shi2 小时前
第九十九篇:Python在其他领域的应用:游戏开发、物联网、AIoT简介
开发语言·python·物联网·游戏开发·aiot
DIY机器人工房2 小时前
简单理解:珠海航宇微科技(航宇微)、芯探索、XM1002他们之间的关系
科技·单片机·嵌入式·diy机器人工房·芯探索·xm1002·航宇微