这篇章我们说明硬件IIC,软件IIC和相关基础知识在这文章里面
添加链接描述
https://blog.csdn.net/qq_46187594/article/details/141642801
2.3-硬件I2C
我们还使用第0章的工程
初始化硬件IIC
设置串口,方便输出调试
重映射
/**
* @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;
}
不要忘记
我们先测试一下发送函数
#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------------------------------------------------*/
/*******************
* @brief 写一个Byte
* @param
* @return
*
*******************/
void GY30_Write_Byte(uint8_t Byte)
{
HAL_I2C_Master_Transmit(&hi2c1,GY30,&Byte,1,1000);
}
波形如图没有问题
然后我们写读取数据的函数
/*******************
* @brief 读光照数据
* @param
* @return
*
*******************/
void GY30_Read_Byte(void)
{
HAL_I2C_Master_Receive(&hi2c1, GY30|0x01,DATA, 2,1000);
}
然后我们看一下主函数
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的基本通信过程
比如:
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:超时等待时间
调用该函数就会自动发送,而且也会把读写位自动置位,什么起始信号,终止信号都在函数内部已经实现
这是波形
下面这个是读数据
HAL_I2C_Master_Receive(&hi2c1, GY30|0x01,DATA, 2,1000);
&hi2c1:要读的设备地址。
GY30|0x01:从设备地址,这里|0x01 或0X01 是为了置为读数据位。
DATA:读出的数据存哪里,这是存储地址。
2:这是读的个数。
1000:超时等待时间。