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;
}

实验效果

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/13674.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

列举几个淘宝商品详情API接口测试示例

API名&#xff1a;item_get 名称类型必须描述keyString是调用key&#xff08;必须以GET方式拼接在URL中&#xff09;secretString是调用密钥api_nameString是API接口名称&#xff08;包括在请求地址中&#xff09;[item_search,item_get,item_search_shop等]cacheString否[yes…

网络模型-Qinq配置与应用

Qinq配置与应用 通过配置Qinq来实现利用公网提供的VLAN100使企业1互通&#xff0c;利用公网提供的VLAN200使企业2互通不同企业之间互相隔离。并通过在连接其它厂商设备的接口上配置修改0in0外层VLAN Tag的TPID值&#xff0c;来实现与其它厂商设备的互通。 一、创建VLAN #在Swi…

等风来不如追风去 火星皮卡与罗乐的逐梦之旅

都说&#xff0c;男人至死皆少年。少年有梦&#xff0c;不应止于心动。于是&#xff0c;家在毕节的罗乐在节前果断为自己购入了一辆全尺寸火星皮卡当作自己的新年礼物。从此火星皮卡便与罗乐相伴义无反顾地踏上这场热辣滚烫的逐梦之旅 “全尺寸火星满足了我对Dream Car的所有幻…

DVWA代码审计--文件上传

NO.1 Low 首先来看下代码 <?php if( isset( $_POST[ Upload ] ) ) { // Where are we going to be writing to? $target_path DVWA_WEB_PAGE_TO_ROOT . "hackable/uploads/"; $target_path . basename( $_FILES[ uploaded ][ name ] ); // Can we move the f…

netcat一键开始瑞士军刀模式(KALI工具系列五)

目录 1、KALI LINUX简介 2、netcat工具简介 3、在KALI中使用netcat 3.1 目标主机IP&#xff08;win&#xff09; 3.2 KALI的IP 4、命令示例 4.1 测试某IP的端口是否打开 4.2 TCP扫描 4.3 UDP扫描 4.4 端口刺探 4.5 直接扫描 5、即时通信 5.1 单击对话互联 5.2 传…

知识表示概述

文章目录 知识表示研究现状技术发展趋势 知识表示 知识是人类在认识和改造客观世界的过程中总结出的客观事实、概念、定理和公理的集合。知识具有不同的分类方式&#xff0c;例如按照知识的作用范围可分为常识性知识与领域性知识。知识表示是将现实世界中存在的知识转换成计算机…

巨某量引擎后台登录实战笔记 | Playwright自动化框架

前言 本文章中所有内容仅供学习交流&#xff0c;抓包内容、敏感网址、数据接口均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff0c;若有侵权&#xff0c;请联系我立即删除&#xff01; 入正题看看滑块是怎么个事…

网络的基础理解

文章目录 网络的基础认识 网络协议协议分层OSI七层模型TCP/IP 五层/四层 模型 网络的基础认识 先来看下面几个问题 什么是网络&#xff1f; 网络就是有许多台设备包括计算机单不仅限于计算机&#xff0c;这些设备通过相互通信所组成起来系统&#xff0c;我们称之为网络所以如…

Gartner发布中国数据安全安全与风险管理领导者指南:将孤立的数据安全产品集成到数据安全平台中,实施一致的数据安全策略

在中国开展业务或与中国相关的组织面临着越来越多的数据安全风险和法规。安全和风险管理领导者必须采用风险优先的数据安全计划和投资&#xff0c;以响应监管要求&#xff0c;以增强数据驱动的数字创新能力。 主要发现 跨组织职能的分散的数据安全举措和不协调的利益相关者责任…

服务器c盘爆满了,这几种方法可以帮助C盘“瘦身”

我们在使用服务器的时候基本不会在C盘安装软件&#xff0c;那么用久了发现C盘满了&#xff0c;提示空间不足&#xff1f;那么这是怎么回事&#xff0c;为什么空间会占用这么快呢&#xff1f; 原因一&#xff1a; C盘满了&#xff0c;很可能是因为电脑里的垃圾文件过多。操作系…

薪资不公、晋升无望?动笔写一份申诉材料吧!

薪资不公、晋升无望&#xff1f;动笔写一份申诉材料吧&#xff01; 引言&#xff1a;每个努力工作的人都值得公平对待 在职场上&#xff0c;我们付出了汗水和智慧&#xff0c;期待着相应的回报——合理的工资和公正的晋升机会。然而&#xff0c;现实并不总是如此美好。当你感觉…

芯片设计公司外协ERP数字化运营:科技与管理的融合

随着信息技术的快速发展&#xff0c;ERP(企业资源计划)系统已经成为现代企业管理不可或缺的一部分。在芯片设计行业&#xff0c;由于产品的复杂性、技术的高要求以及市场的快速变化&#xff0c;外协ERP数字化运营显得尤为重要。 芯片设计公司的外协ERP数字化运营&#xff0c;主…

xxe漏洞--xml外部实体注入漏洞

1.xxe漏洞介绍 XXE&#xff08;XML External Entity Injection&#xff09;是一种攻击技术&#xff0c;它允许攻击者注入恶意的外部实体到XML文档中。如果应用程序处理XML输入时未正确配置&#xff0c;攻击者可以利用这个漏洞访问受影响系统上的敏感文件、执行远程代码、探测内…

晶体振荡器

一、晶振与晶体区别 晶振是有源晶振的简称&#xff0c;又叫振荡器&#xff0c;英文名称是oscillator&#xff0c;内部有时钟电路&#xff0c;只需供电便可产生振荡信号&#xff1b;晶体是无源晶振的简称&#xff0c;也叫谐振器&#xff0c;英文名称是crystal&#xff0c;是无极…

机械臂与Realsense D435 相机的手眼标定ROS包

本教程主要介绍机械臂与 Realsense D435 相机手眼标定的配置及方法。 系统&#xff1a;Ubuntu 20.0.4 ◼ ROS&#xff1a;Noetic ◼ OpenCV 库&#xff1a;OpenCV 4.2.0 ◼ Realsense D435&#xff1a;librealsense sdk&#xff08;2.50.0&#xff09;、realsense-ros 功能包&…

Kafka-文件存储机制

Kafka概述 Kafka-文件存储机制 1. 分区&#xff1a; Kafka中的每个主题&#xff08;topic&#xff09;都可以分成一个或多个分区。 Topic是逻辑上的概念&#xff0c;而Partition是物理上的概念。 分区是消息的基本单元&#xff0c;每个分区都是一个有序的log日志文件。 Pr…

Linux网络配置全攻略:解读/etc/network/interfaces文件的精髓

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 Linux网络配置全攻略&#xff1a;解读/etc/network/interfaces文件的精髓 前言文件结构与基本概念配置网络接口的常用参数高级网络配置技巧实用工具与调试技巧实战案例与最佳实践 前言 在我们的日常生…

【数据库基础】基本认识数据库--入门引导

文章目录 什么是数据库&#xff1f;主流数据库基本使用安装MySQL连接服务器服务器、数据库、表关系使用案例数据逻辑存储 MySQL架构SQL语句分类什么叫存储引擎 什么是数据库&#xff1f; 数据库是指在磁盘和内存中存储特定结构组织的数据。数据库通常用于存储于某个系统、组织或…

基于springboot实现的校园博客系统

开发语言&#xff1a;Java 框架&#xff1a;springboot JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09; 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclipse/idea Maven…

Mac SourceTree配置ssh git仓库

一、准备条件 1、Mac系统电脑 2、安装好SourceTree 3、获取ssh git仓库地址 二、配置步骤 1、打开终端命令行 ssh -t rsa -C "xxx""xxx"代表注册git仓库时&#xff0c;使用的用户名&#xff0c;可以是字符串也可以是邮箱地址。 如果遇到输入密码&#xf…