GPIO模拟IIC通信测量环境光

2024-05-24 05:12

本文主要是介绍GPIO模拟IIC通信测量环境光,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

iic.h

iic.c

ap3216c.h

ap3216.c

main.c

实验效果


iic.h

#ifndef __IIC_H__
#define __IIC_H__#include "stm32mp1xx_gpio.h"
#include "stm32mp1xx_rcc.h"
//SDA 数据线为PF15
//SCL 时钟线为PF14//配置PF15为输出模式
#define SET_SDA_OUT do{GPIOF->MODER &=(~(0x3<<30));\GPIOF->MODER |=(0x1<<30);}while(0)//配置PF15为输入模式
#define SET_SDA_IN  do{GPIOF->MODER &=(~(0x3<<30));}while(0)//读取PF15输入寄存器的值
#define I2C_SDA_READ GPIOF->IDR & (0x1<<15)//PF14输出高电平、低电平
#define I2C_SCL_H  do{GPIOF->BSRR |= (0x1<<14);}while(0)
#define I2C_SCL_L  do{GPIOF->BRR |= (0x1<<14);}while(0)//PF15输入高电平、低电平
#define I2C_SDA_H do{GPIOF->BSRR |= (0x1<<15);}while(0)
#define I2C_SDA_L do{GPIOF->BRR |= (0x1<<15);}while(0)void delay_us(void);
//模拟I2C
void i2c_init(void);
void i2c_start(void);
void i2c_stop(void);
void i2c_write_byte(unsigned char  dat);
unsigned char i2c_read_byte(unsigned char ack);
unsigned char i2c_wait_ack(void);       
void i2c_ack(void);
void i2c_nack(void);#endif

iic.c

#include "iic.h"//微妙级的延时
void delay_us(void){unsigned int i=2000;while(i--);
}
//模拟I2C//I2C初始化
void i2c_init(void){//GPIOF时钟使能RCC->MP_AHB4ENSETR |= (0x1<<5);//配置PF14、PF15为输出模式GPIOF->MODER &= (~(0xF<<28));GPIOF->MODER |= (0x5<<28);//配置PF14、PF15为推挽输出GPIOF->OTYPER &= (~(0x3<<14));//配置PF14、PF15输出速度为超高速GPIOF->OSPEEDR |= (0xF<<28);//配置PF14、PF15无上拉下拉GPIOF->PUPDR &= (~(0xF<<28));//将SCL和SDA输出高电平I2C_SCL_H;I2C_SDA_H;}//发送起始信号
void i2c_start(void){//设置SDA为输出模式SET_SDA_OUT;//拉高数据线和时钟线I2C_SCL_H;I2C_SDA_H;delay_us();  //延时//拉低数据线I2C_SDA_L;delay_us();  //延时//拉低时钟线I2C_SCL_L;}//发送停止信号
void i2c_stop(void){//设置SDA为输出模式SET_SDA_OUT;//拉低时钟线I2C_SCL_L;delay_us();delay_us();//修改数据线为低电平I2C_SDA_L;delay_us();//拉高时钟线I2C_SCL_H;delay_us();//拉高数据线I2C_SDA_H;}//发送数据
void i2c_write_byte(unsigned char  dat){unsigned int i;//PF14配置为输出模式SET_SDA_OUT;for(i=0;i<8;i++){//拉低时钟线I2C_SCL_L;delay_us();//修改数据线的值if(dat&(0x1<<7)){I2C_SDA_H;}else{I2C_SDA_L;}delay_us();//拉高时钟线I2C_SCL_H;delay_us();   //拉高是时钟线后延时 delay_us();   //延时等待从机读取dat<<=1;}
}//读取数据
unsigned char i2c_read_byte(unsigned char ack){//配置为输入模式SET_SDA_IN;unsigned char data;for(unsigned int i=0;i<8;i++){//从机需要向寄存器写入数据//所有需要拉低时钟线I2C_SCL_L;delay_us();   //延时delay_us();   //等待从机写入数据//拉高时钟线读取数据I2C_SCL_H;delay_us();    //延时data<<=1;if(I2C_SDA_READ){data|=0x1; }else data|=0x0;}if(!ack){i2c_nack();}else{i2c_ack();}//返回读取的数值return data;
}//等带从机ack
unsigned char i2c_wait_ack(void){//拉低时钟线,修改SDA电平I2C_SCL_L;delay_us();I2C_SDA_H; //释放给从机delay_us();//SDA配置为输入模式SET_SDA_IN;delay_us();delay_us();//拉高时钟线读取从机ackI2C_SCL_H;delay_us();if(I2C_SDA_READ){return 1;}I2C_SCL_L;return 0;
}    //ack应答
void i2c_ack(void){//配置为输出模式SET_SDA_OUT;//拉低时钟线I2C_SCL_L;delay_us();//拉低数据线I2C_SDA_L;delay_us();//拉高时钟线I2C_SCL_H;delay_us();delay_us();//拉低时钟线?I2C_SCL_L;
}//非ack应答
void i2c_nack(void){//配置为输出模式SET_SDA_OUT;//拉低时钟线I2C_SCL_L;delay_us();//拉高数据线I2C_SDA_H;delay_us();//拉高时钟线I2C_SCL_H;delay_us();delay_us();//拉低时钟线?I2C_SCL_L;}

ap3216c.h

#ifndef __AP3216C_H__
#define __AP3216C_H__//ap3216c初始化
void ap3216c_init();
void ap3216c_init1();
//读取ap3216c环境光
unsigned char ap3216c_read_alsl();
unsigned char ap3216c_read_alsh();#endif

ap3216.c

#include "ap3216c.h"
#include "iic.h"
//ap3216c初始化
void ap3216c_init(){//发送起始信号i2c_start();//发送七位从机地址+1位写标志  0x1E | 0x0 = 0x3ci2c_write_byte(0x3c);//等待从机应答i2c_wait_ack();//发送8位寄存器地址0x00i2c_write_byte(0x00);//等待从机应答i2c_wait_ack();//写入数据0x3A,si7006初始值i2c_write_byte(0x1);//等待应答i2c_wait_ack();//发送停止信号 i2c_stop();
}//读取ap3216c环境光
unsigned char ap3216c_read_alsl(){//发送起始信号i2c_start();//发送七位从机地址+1位写标志  0x1E | 0x0 = 0x3Ci2c_write_byte(0x3C);//等待从机应答i2c_wait_ack();//发送8位寄存器地址0xE3i2c_write_byte(0x0C);//等待从机应答i2c_wait_ack();//发送重复开始信号i2c_start();//发送从机地址和读写标志  0x40 | 0x1 = 0x81i2c_write_byte(0x3D);//等待从机应答i2c_wait_ack();//读取环境光char als_l;als_l=i2c_read_byte(1);//发送应答//发送停止信号i2c_stop();return als_l;}
//读取ap3216c环境光
unsigned char ap3216c_read_alsh(){//发送起始信号i2c_start();//发送七位从机地址+1位写标志  0x1E | 0x0 = 0x3Ci2c_write_byte(0x3C);//等待从机应答i2c_wait_ack();//发送8位寄存器地址0xE3i2c_write_byte(0x0D);//等待从机应答i2c_wait_ack();//发送重复开始信号i2c_start();//发送从机地址和读写标志  0x40 | 0x1 = 0x81i2c_write_byte(0x3D);//等待从机应答i2c_wait_ack();//读取环境光char als_h;als_h=i2c_read_byte(1);//发送应答//发送停止信号i2c_stop();return als_h;}

main.c

#include "gpio.h"
#include "led.h"
#include "uart4.h"
#include "keyip.h"
#include "iic.h"
#include "si7006.h"
#include "ap3216c.h"
extern void printf(const char *fmt, ...);
int main()
{led1_init();i2c_init();ap3216c_init();unsigned short als;unsigned char als_l;unsigned char als_h;while (1){als_l=ap3216c_read_alsl(1);als_h=ap3216c_read_alsh(1);als=((unsigned short)als_h<<8) | als_l;printf("als=%d\n",als);if(als<100){led1_ctl(1);}else{led1_ctl(0);}delay(1000);}return 0;
}

实验效果

 

这篇关于GPIO模拟IIC通信测量环境光的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/997465

相关文章

RabbitMQ工作模式中的RPC通信模式详解

《RabbitMQ工作模式中的RPC通信模式详解》在RabbitMQ中,RPC模式通过消息队列实现远程调用功能,这篇文章给大家介绍RabbitMQ工作模式之RPC通信模式,感兴趣的朋友一起看看吧... 目录RPC通信模式概述工作流程代码案例引入依赖常量类编写客户端代码编写服务端代码RPC通信模式概述在R

在Spring Boot中实现HTTPS加密通信及常见问题排查

《在SpringBoot中实现HTTPS加密通信及常见问题排查》HTTPS是HTTP的安全版本,通过SSL/TLS协议为通讯提供加密、身份验证和数据完整性保护,下面通过本文给大家介绍在SpringB... 目录一、HTTPS核心原理1.加密流程概述2.加密技术组合二、证书体系详解1、证书类型对比2. 证书获

Python使用pynput模拟实现键盘自动输入工具

《Python使用pynput模拟实现键盘自动输入工具》在日常办公和软件开发中,我们经常需要处理大量重复的文本输入工作,所以本文就来和大家介绍一款使用Python的PyQt5库结合pynput键盘控制... 目录概述:当自动化遇上可视化功能全景图核心功能矩阵技术栈深度效果展示使用教程四步操作指南核心代码解析

Python模拟串口通信的示例详解

《Python模拟串口通信的示例详解》pySerial是Python中用于操作串口的第三方模块,它支持Windows、Linux、OSX、BSD等多个平台,下面我们就来看看Python如何使用pySe... 目录1.win 下载虚www.chinasem.cn拟串口2、确定串口号3、配置串口4、串口通信示例5

基于C#实现MQTT通信实战

《基于C#实现MQTT通信实战》MQTT消息队列遥测传输,在物联网领域应用的很广泛,它是基于Publish/Subscribe模式,具有简单易用,支持QoS,传输效率高的特点,下面我们就来看看C#实现... 目录1、连接主机2、订阅消息3、发布消息MQTT(Message Queueing Telemetr

嵌入式Linux之使用设备树驱动GPIO的实现方式

《嵌入式Linux之使用设备树驱动GPIO的实现方式》:本文主要介绍嵌入式Linux之使用设备树驱动GPIO的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录一、设备树配置1.1 添加 pinctrl 节点1.2 添加 LED 设备节点二、编写驱动程序2.1

CSS模拟 html 的 title 属性(鼠标悬浮显示提示文字效果)

《CSS模拟html的title属性(鼠标悬浮显示提示文字效果)》:本文主要介绍了如何使用CSS模拟HTML的title属性,通过鼠标悬浮显示提示文字效果,通过设置`.tipBox`和`.tipBox.tipContent`的样式,实现了提示内容的隐藏和显示,详细内容请阅读本文,希望能对你有所帮助... 效

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

usaco 1.2 Transformations(模拟)

我的做法就是一个一个情况枚举出来 注意计算公式: ( 变换后的矩阵记为C) 顺时针旋转90°:C[i] [j]=A[n-j-1] [i] (旋转180°和270° 可以多转几个九十度来推) 对称:C[i] [n-j-1]=A[i] [j] 代码有点长 。。。 /*ID: who jayLANG: C++TASK: transform*/#include<

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识