STM32的IIC接口

STM32共有3个IIC接口,引脚对应如下:

不了解GPIO配置的请看这篇

STM32F4 GPIO详解(代码)_Ljh0408abc的博客-CSDN博客GPIO代码分析https://blog.csdn.net/Ljh0408abc/article/details/122972149

例程,我们采用PB6为SCL,PB7为SDA。


void BH1750_PortInit()
{   GPIO_InitTypeDef GPIO_InitStructure;RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB|RCC_AHB1Periph_GPIOG,ENABLE);//PB6-SCL GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;GPIO_Init(GPIOB,&GPIO_InitStructure);//PG15-ADDRGPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;GPIO_Init(GPIOB,&GPIO_InitStructure);
}

函数:设置PB7(SDA)为输出

void SDA_OUT()
{GPIO_InitTypeDef GPIO_InitStructure;// PB7-SDAGPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;GPIO_Init(GPIOB,&GPIO_InitStructure);}

函数:设置PB7(SDA)为输入

void SDA_IN()
{GPIO_InitTypeDef GPIO_InitStructure;// PB7-SDAGPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;GPIO_Init(GPIOB,&GPIO_InitStructure);
}

函数:发送开始信号(S)

void BH1750_Start()
{SDA_OUT();     //sda线输出IIC_SDA=1;       IIC_SCL=1;delay_us(4);IIC_SDA=0;//START:when CLK is high,DATA change form high to low delay_us(4);IIC_SCL=0;//钳住I2C总线,准备发送或接收数据
}

函数:发送停止信号(P)

void BH1750_Stop()
{SDA_OUT();//sda线输出IIC_SDA=0;//STOP:when CLK is high DATA change form low to highIIC_SCL=1;delay_us(4);IIC_SDA=1;//发送I2C总线结束信号delay_us(4);
}

不清楚IIC发送信号、停止信号、应答信号规格的请看这篇

https://blog.csdn.net/Ljh0408abc/article/details/123010638https://blog.csdn.net/Ljh0408abc/article/details/123010638

函数:发送应答信号

void BH1750_SendACK(u8 ack)
{SDA_OUT();          //sda线输出if(ack)IIC_SDA=1;   //写应答信号else IIC_SDA=0;          IIC_SCL=1;          //拉高时钟线delay_us(2);        //延时IIC_SCL=0;          //拉低时钟线delay_us(2);        //延时
}

函数:接受数据

u8 BH1750_RecvACK()
{u8 data;SDA_IN();         //SDA设置为输入IIC_SCL=1;        //拉高时钟线delay_us(2);      //延时data = READ_SDA;  //读应答信号IIC_SCL=0;        //拉低时钟线delay_us(2);      //延时return data;
}

函数:向总线发送1Byte数据

void BH1750_SendByte(u8 dat)
{u8 i,bit;SDA_OUT();               //sda线输出for (i=0; i<8; i++)      //8位计数器{bit=dat&0x80;if(bit) IIC_SDA=1;else IIC_SDA=0;dat <<= 1;           //移出数据的最高位IIC_SCL=1;           //拉高时钟线delay_us(2);         //延时IIC_SCL=0;           //拉低时钟线delay_us(2);         //延时}BH1750_RecvACK();

函数:向BH1750写入数据

void Single_Write_BH1750(u8 REG_Address)
{BH1750_Start();                  //起始信号BH1750_SendByte(SlaveAddress);   //发送设备地址+写信号BH1750_SendByte(REG_Address);    //内部寄存器地址,BH1750_Stop();                   //发送停止信号
}

函数:连续读取BH1750数据

void Multiple_Read_BH1750(void)
{   u8 i;   BH1750_Start();                          //起始信号BH1750_SendByte(SlaveAddress+1);         //发送设备地址+读信号for (i=0; i<3; i++)                      //连续读取2个地址数据,存储中BUF{BUF[i] = BH1750_RecvByte();          //BUF[0]存储0x32地址中的数据if (i == 3){BH1750_SendACK(1);                //最后一个数据需要回NOACK}else{        BH1750_SendACK(0);                //回应ACK}}BH1750_Stop();                          //停止信号//   delay_ms(150);
}

函数:生成光亮数据

uint16_t Get_Bh_Value(void)
{  static float temp;unsigned int data;int dis_data ;Single_Write_BH1750(0x01);   // power onSingle_Write_BH1750(0x10);   // H- resolution mode
//    delay_ms(200);              //延时200msMultiple_Read_BH1750();       //连续读出数据,存储在BUF中dis_data=BUF[0];dis_data=(dis_data<<8)+BUF[1];//合成数据,即光照数据temp=(float)dis_data/1.2;data=(int)temp;return data;
}

STM32通过IIC读取BH1750光照数据相关推荐

  1. STM32通过IIC读取MPU6050原始数据过程详解

    STM32通过IIC读取MPU6050数据过程详解 一:硬件介绍 此款MPU6050是通过IIC来与MCU通信的,它有两个IIC接口,第一个是主IIC,通过SCL和SDA两条线与MCU通信:第二个辅助 ...

  2. STM32模拟IIC读取PCF8563

    作者第一次开写博客,本着学习的态度,附上自己总结的代码,希望大家多多指点! 一.首先是对于PCF8563芯片的介绍与使用说明: PCF8563 是PHILIPS 公司推出的一款工业级内含I2C 总线接 ...

  3. 使用ESP32 MicroPython I2C功能读取 BH1750光度传感器模块数据

    简 介: 使用ESP32读取BH1750的光度传感器的数据.但是最终不知道甚么原因,所读取的数据都是0 ? 后面通过证明,说明在原来进行I2C写的时候出现了语法错误. 关键词: BH1750,ESP3 ...

  4. stm32 硬件IIC使用方法说明与示例---LIS3DH的IIC通信

    有时我们可能需要MCU进行速率较高的IIC总线通信,一般stm32的IIC默认传输速率是100kpbs,最大为400kpbs.现在大部分项目会使用程序IO模拟的IIC,使用方便,具体网上例子很多. 这 ...

  5. stm32读取目标芯片_STM32通过IIC读取MPU6050陀螺仪芯片数据核心程序

    1  简 介 最近,想学角度融合算法在网上买一个JY61的模块.他们家的模块用起来还不错.模块分为串口通讯和IIC通讯的.串口读取数据他们家有例程,我就不说了.想分享给大家这个模块的IIC是怎么去读取 ...

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

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

  7. 【STM32】HAL库 STM32CubeMX教程十二---IIC(读取AT24C02 )

    前言: 本系列教程将HAL库与STM32CubeMX结合在一起讲解,使您可以更快速的学会各个模块的使用 在之前的标准库中,STM32的硬件IIC非常复杂,更重要的是它并不稳定,所以都不推荐使用. 但是 ...

  8. STM32读取BQ40Z50的数据

    TI电池管理芯片BQ40Z50,通信协议是SMBUS,类似IIC,速率要求10-100KHz 用的STM32F103的硬件IIC读取电池的各种数值,源代码如下: ​ #include "ii ...

  9. stm32读取驾驶模拟器数据 stm32F407读取joystick数据

    需求 实习工作,老板要求用单片机读取驾驶模拟器(Joystick)返回的数据,驾驶模拟器usb输出,输出信息包括:方向盘转角.左右拨杆.按键等. 硬件 采用正点原子探索者开发板,即插即用,硬件不需要改 ...

最新文章

  1. linux shell 去掉 文本换行符
  2. extjs获取焦点和失去焦点_ios输入框(input,select,textarea)失去焦点,页面不归位...
  3. PHP输出缓存(output_buffering)小记 -- 尚有疑问
  4. idea中event log_【JavaScript 教程】事件——Event 对象
  5. linux虚拟工具平台,【工具】打造适用于 Linux 的 Windows 子系统——替代虚拟机的好帮手...
  6. 计算机网络(王道考研笔记)
  7. 好书、买书、看书---乐在其中
  8. ASP.NET在线考试系统+文档说明
  9. linux装回win10系统无法开机,Win10/Linux双系统删除之后出现grub无法开机修复方法...
  10. NVIDIA 显卡驱动CUDA ToolkitcuDNN下载地址
  11. requests库安装和简单功能学习总结
  12. 面试第一问:简单做个自我介绍吧,怎么回答才让面试官频频点头?
  13. 互联网P2P优化管理标准体系研讨会召开
  14. 10款Github上最火爆的国产开源项目
  15. 不会水的人,如何自学游泳
  16. C 练习4-7 求e的近似值 (15 分)
  17. 这个杀手不太冷(一)
  18. OSChina 周四乱弹 ——国庆第五天
  19. educoder多路选择器与应用4关卡通关2选一、4选一、8选一、MUS应用(在Logisim上演示)
  20. matlab中eye函数、ones函数

热门文章

  1. 区块链学习笔记15——ETH状态树
  2. 单核CPU能够实现并行么?
  3. CC2530入网流程
  4. 无法进入网页版小木虫
  5. 量子计算机是什么?量子计算机和传统计算机之间有什么区别?
  6. Python爬虫编程思想(133):项目实战--利用Appium抓取微信朋友圈信息
  7. IIS绑定主机屏蔽恶意解析域名的操作
  8. kakfka2.2源码分析之handleFetchRequest
  9. Google Dremel 理解
  10. 新媒体时代的公关怎么做