飞道的博客

STM32-I2C总线驱动程序分析

324人阅读  评论(0)


杨桃32学习笔记,本文图片文字皆为转述

I2C硬件电路原理图


I2C要点

I2C总线是板级总线,连接线一般不超2米。
电路连接:两线总线连接,1~10K上拉电阻,复用开漏模式。
器件地址:每个器件都有唯一地址(7位16进制数),最多127个器件地址,新版I2C规范中最大器件地址数量可达1023个。
所有设备与单片机需要共地。

杨桃电子开发版中,将oled屏幕的从设备地址定为0x78,0x9e是温度传感器的设备地址。


I2C 简介





添加相应的文件并添加进工程文件



在工程文件夹LIB下添加stm32f10x_i2c.c

在工程文件夹Basic下添加i2c.c

在工程文件夹Hardware文件夹下添加lm75a.c


I2C驱动程序结构



接下来编写的i2c器件这里指的是温度传感器,也都是调用以上函数来完成。如下图

I2C驱动程序分析

i2c.h

#ifndef __I2C_H
#define __I2C_H	 
#include "sys.h"

#define I2CPORT		GPIOB	//定义IO接口
#define I2C_SCL		GPIO_Pin_6	//定义IO接口
#define I2C_SDA		GPIO_Pin_7	//定义IO接口

#define HostAddress	0xc0	//总线主机的器件地址
#define BusSpeed	200000	//总线速度(不高于400000)


void I2C_Configuration(void);
void I2C_SAND_BUFFER(u8 SlaveAddr, u8 WriteAddr, u8* pBuffer, u16 NumByteToWrite);
void I2C_SAND_BYTE(u8 SlaveAddr,u8 writeAddr,u8 pBuffer);
void I2C_READ_BUFFER(u8 SlaveAddr,u8 readAddr,u8* pBuffer,u16 NumByteToRead);
u8 I2C_READ_BYTE(u8 SlaveAddr,u8 readAddr);
		 				    
#endif

i2c.c
初始化

发送一个字节数据

发送一个字节数据流程:
发送开始信号
等待完成
发送从器件地址及状态(写入)
等待完成	
发送从器件内部寄存器地址
等待完成	
发送要写入的内容
等待完成	
发送结束信号



读取一个字节数据

读取一个字节数据流程:
判断总线是否繁忙
发送起始信号
等待操作完成
发送器件地址
等待操作完成
开启i2c功能
发送器件子地址
主机允许从器件产生开始信号 向主机发送数据 也就是主机开启接收
等待完成
给出器件地址
等待接收数据 收到数据则跳出 没有收到一直等待
最后有一个数据时关闭应答位
最后一个数据时使能停止位
接收数据存放到变量a中


发送和读取多字节数据

LM75A温度传感器电路原理图


LM75A温度传感器驱动程序分析






根据上表可知,掉电模式相关位。




例如D15 D11 D8为0 则意味着-9度

重新返回程序对应理解


转载:https://blog.csdn.net/weixin_44681745/article/details/116009963
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场