本文利用STM32F103系列单片机读取TMP112数字温度传感器的温度信息,TMP112数字传感器采用IIC总线协议通信。STM32自身含有硬件IIC资源,分别是PB6-->SCL、PB7-->SDA,硬件IIC的操作在STM32开发板对应的资料上均有给出,在此不再赘述,本文使用软件模拟IIC来完成与TMP112传感器之间的通信。

图1:TMP112的管脚定义图

TMP112温度传感器的电路连接如下,TMP112的IIC设备地址由管脚ADD0决定,

设备地址的值如下:

SCL和SDA管脚需要上拉电阻。ADD0管脚连接地,地址为7位,最后一位为读写操作位,0为写,1为读。即0x90和0x91。

进入正题模拟IIC的操作,STM32管脚定义。

#define SCL GPIO_Pin_6
#define SDA GPIO_Pin_7

#define SCL_H GPIO_SetBits(GPIOB,GPIO_Pin_6 )
#define SCL_L GPIO_ResetBits(GPIOB,GPIO_Pin_6 )

#define SDA_H GPIO_SetBits(GPIOB,GPIO_Pin_7 )
#define SDA_L GPIO_ResetBits(GPIOB,GPIO_Pin_7)

#define SDAread GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_7)

IIC协议开始和停止条件

SCL时钟电平为高:

SDA数据线由高 -> 低 为总线开始条件;SDA数据线由低 -> 高 为总线结束条件;

注意:开始之后将需要将SCL变为低电平;

SCL时钟电平为低,可以改换SDA数据线的电平,在SCL升沿的过程将数据发送出去。数据从高至低发送,SCL_L--->SDA数据--->SCL_H。

时序:

应答信号。STM32作为主机,TMP112为从机。主机读,主机产生应答信号。时序图:

STM32向TMP112传感器写数据的时序图如下:

程序如下:

void I2C_WriteByte(void)
{
u16 i;
u8 j;
I2C_Start();
I2C_delay();
I2C_SendByte(0x90); //设备地址--写操作
I2C_Ack();
I2C_SendByte(0x01); //寄存器
I2C_Ack();
I2C_SendByte(0x00); //数据
I2C_Ack();
I2C_Stop();
for(j=30;j>0;j--)
I2C_delay();
}

STM接收TMP112发送过来的数据时,I2C的读一字节函数,其实和“写一字节”类似,只是数据传输方向相反,应答的方向也是相反。
读完一字节(8位)之后,由主机产生应答(或非应答)位:若产生应答,表示可以继续读下一字节操作(从设备地址指向下一字节);
若产生非应答,表示不可以继续读下一字节操作;

时序:

程序:

u8 I2C_ReceiveByte(void) 

    u8 i=8,j;
    u8 ReceiveByte=0;
    SDA_H; 
    while(i--)
    {
      ReceiveByte<<=1;      
      SCL_H;
      I2C_delay(); 
      if(SDAread)
      {
       ReceiveByte|=0x01;
      }
for(j=30;j>0;j--)
//I2C_delay();
SCL_L;
    }
    return ReceiveByte;
}

STM32向TMP112读取数据,时序图如下:

程序:

u16 ReadTemp(void)
{
u8 TempH ,TempL;
I2C_Start();
I2C_SendByte(0x90);    //设备地址--写操作
I2C_Ack();
I2C_SendByte(0x00); //数据
I2C_Ack();

I2C_Start();
I2C_SendByte(0x91);  //设备地址--读操作
I2C_Ack();
TempH=I2C_ReceiveByte();
I2C_NoAck(); //无应答,接收低8位数据
TempL=I2C_ReceiveByte();
I2C_Stop();

return TempH*10+(int)(TempL*0.0625*0.0625*10);
}

STM32F103单片机软件模拟IIC并读取TMP112数字温度传感器相关推荐

  1. STM32F103C6T6 | 模拟IIC主机读取AHT20温湿度传感器数据

    关于STM32的IIC 一开始是用硬件内置的IIC来读取数据的,没有什么问题,但是不知道为什么后续断电上电之后一直没有数据,仿真看的话发现卡死在这些循环里面,我才反应过来网上一直说的硬件IIC有问题是 ...

  2. STM32 Cube MX 之hal库软件模拟IIC 可直接移植使用

    此为软件模拟IIC,可以直接移植到HAL库使用..h文件需要自己做函数声明这里就不再放出,如有问题大家可以讨论. 使用的时候只需要更改SDA 和SCL引脚的宏定义就可以移植使用,当然IIC协议其实就是 ...

  3. STM32 软件模拟 IIC 代码,标准库、HAL库可用

    1 #ifndef _IIC_H 2 #define _IIC_H 3 4 #include "stdio.h" 5 #include "stm32f1xx_hal.h& ...

  4. 【STM32】IIC的基本原理(实例:普通IO口模拟IIC时序读取24C02)(转载)

    版权声明:本文为博主原创文章,允许转载,但希望标注转载来源. https://blog.csdn.net/qq_38410730/article/details/80312357 IIC的基本介绍 I ...

  5. 基于stm32单片机的模拟IIC时序(附源码)

    我下面要说的是基于stm32单片机的模拟IIC时序,以及是一些要注意的事项:结合自己所做的MMA7455加速度传感器,我把模拟IIC的源代码贴了出来,大家可以参考一下. 1.因为在IIC协议中,当总线 ...

  6. STM32基于软件模拟IIC进行AHT21B温湿度采集

    STM32基于软件模拟IIC进行AHT21B温湿度采集 一. IIC简介 1.1 IIC简介 1.2 实现方式 1.3 实现方式对比 二. AHT21B简介 2.1 简介 2.2 产品特点 2.3 外 ...

  7. STM32 软件模拟IIC

    0.系列目录 STM32 软件模拟IIC STM32 使用DMP库处理MPU6050数据 STM32 MPU6050与匿名上位机通讯(V2.6版) 1.IIC通讯过程 SCL和SDA在空闲时候均为高电 ...

  8. 软件模拟IIC主从机

    软件模拟IIC 从机部分 从机接收部分 从机发送部分 主机部分 阻塞式发送 定时器中断方式发送 从机部分 因为项目简单,就只有数据接收,数据命令处理,显示.显示部分使用定时器中断动态扫描方式,主函数用 ...

  9. 单片机软件模拟SPI接口—加深理解SPI总线协议

    单片机软件模拟SPI接口-加深理解SPI总线协议   SPI(Serial Peripheral Interfacer 串行外设接口)是摩托罗拉公司推出的一种同步串行通讯接口,用于微处理器臌控制器和外 ...

最新文章

  1. 《Linux总线、设备与驱动》USB设备发现机制
  2. 如何成为国内敏捷BI领跑者?这家企业的经验值得借鉴
  3. struts2下拉框在不同情况下的各种用法
  4. Win10开启Administrator超级管理员账户
  5. php 工厂模式作用,PHP工厂模式的好处
  6. 非对称加密算法--RSA加密原理及运用
  7. 1月5日 char **argv是什么用法啊?
  8. H.266/VVC代码学习笔记15:VTM6.0中的xCheckRDCostMergeTriangle2Nx2N()函数
  9. itextpdf 超链接
  10. 服务器的cd驱动器怎么修改盘符,更改dvd驱动器盘符,cd驱动器盘符改
  11. yEd—很不错的开源跨平台绘图工具
  12. AR涂涂乐⭐三、 C#实现识别图进入扫描框显示绿色,未进入为红色功能
  13. 网页设计~登陆页面源代码
  14. hoolilaw案例分析:美国神奇网站Craigslist交易骗术
  15. LogLog基数估计算法学习与实现分析
  16. 小猪WIN7旗舰SP1精简版V4正式版,仅704M的GHOST版,绝对纯净,可正常使用
  17. java camel exchange类_Exchange服务器之camel 基本概念
  18. pywinauto keyborad.send_keys raise RuntimeError(‘SendInput() inserted only ‘+str(num_inserted_events
  19. 一种精确的超声波定位导航系统
  20. vs code设置保存时自动将CRLF 转换成 LF

热门文章

  1. Java基础面试题 .
  2. intell idea怎么恢复默认设置
  3. 无数据 无网络view
  4. 关于dva的put,put.resolve
  5. #幻方#明汯#九坤#鸣石#天演#进化论#佳期#量化研究员#C++#量化#量化私募#量化企业#量化投资#量化基金#机器学习#量化市场#量化期权#量化交易岗#量化数据岗#量化运维#量化可转债研究员#深
  6. 最强损失函数分析:一般自适应鲁棒损失函数
  7. word 表格内容不能自动延续到下一页
  8. OpenMeetings安装
  9. 计算机的字长一定是字节的整数倍,大学计算机应用基础选择题一.doc
  10. Java程序设计基础【4】