利用软件IIC驱动外挂DAC芯片——Mcp4725

今天时间有限我就只贴代码了

myiic.c

#include "myi2c.h"//IIC.SCL->GPIOB6
//IIC.SDA->GPIOB7void IIC_Init(void)
{GPIO_InitTypeDef GPIO_InitStruct;__HAL_RCC_GPIOB_CLK_ENABLE();GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7;GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD;GPIO_InitStruct.Pull = GPIO_PULLUP;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);IIC_SCL(1);IIC_SDA(1);
}void SDA_IN(void)
{GPIO_InitTypeDef GPIO_InitStruct;__HAL_RCC_GPIOB_CLK_ENABLE();GPIO_InitStruct.Pin = GPIO_PIN_7;GPIO_InitStruct.Mode = GPIO_MODE_AF_INPUT;GPIO_InitStruct.Pull = GPIO_NOPULL;HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);	
}void SDA_OUT(void)
{ GPIO_InitTypeDef GPIO_InitStruct;__HAL_RCC_GPIOB_CLK_ENABLE();GPIO_InitStruct.Pin =  GPIO_PIN_7;GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
}void IIC_Start(void)
{SDA_OUT();     IIC_SDA(1);	  	  IIC_SCL(1);delay_us(10);IIC_SDA(0);     //START:when CLK is high,DATA change form high to low delay_us(10);IIC_SCL(0);     
}	  void IIC_Stop(void)
{SDA_OUT();IIC_SCL(0);IIC_SDA(0);//STOP:when CLK is high DATA change form low to highdelay_us(10);IIC_SCL(1); IIC_SDA(1);delay_us(10);	
}uint8_t IIC_Wait_Ack(void)
{uint8_t ucErrTime=0;SDA_IN();      IIC_SDA(1);delay_us(2);	   IIC_SCL(1);delay_us(2);	 while(IIC_SDAIN){ucErrTime++;if(ucErrTime>250){IIC_Stop();return 1;}}IIC_SCL(0);	   return 0;  
} void IIC_Ack(void)
{IIC_SCL(0);SDA_OUT();IIC_SDA(0);delay_us(5);IIC_SCL(1);delay_us(5);IIC_SCL(0);
}void IIC_NAck(void)
{IIC_SCL(0);SDA_OUT();IIC_SDA(1);delay_us(5);IIC_SCL(1);delay_us(5);IIC_SCL(0);
}					 				     void IIC_Send_Byte(uint8_t txd)
{                        uint8_t t;   SDA_OUT(); 	    IIC_SCL(0);for(t=0;t<8;t++)    {              if((txd&0x80)>>7)IIC_SDA(1);elseIIC_SDA(0);txd<<=1; 	  delay_us(5);   IIC_SCL(1);delay_us(5); IIC_SCL(0);	delay_us(5);}	 
} 	    uint8_t IIC_Read_Byte(unsigned char ack)
{unsigned char i,receive=0;SDA_IN();for(i=0;i<8;i++ ){IIC_SCL(0); delay_us(5);IIC_SCL(1);receive<<=1;if(IIC_SDAIN)receive++;   delay_us(4); }					 if (!ack)IIC_NAck();elseIIC_Ack(); //产生ACK   return receive;
}

myiic.h

#ifndef _MYI2C_H
#define _MYI2C_H#include "main.h"
#include "delay.h"#define IIC_SCL(x) HAL_GPIO_WritePin(GPIOB,GPIO_PIN_6,(GPIO_PinState)(x))  //IIC.SCL->GPIOB6
#define IIC_SDA(x) HAL_GPIO_WritePin(GPIOB,GPIO_PIN_7,(GPIO_PinState)(x))  //IIC.SDA->GPIOB7
#define IIC_SDAIN  HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_7)void IIC_Init(void);                     		 
void IIC_Start(void);				             
void IIC_Stop(void);	  			           
void IIC_Send_Byte(uint8_t txd);			   
uint8_t IIC_Read_Byte(unsigned char ack);
uint8_t IIC_Wait_Ack(void); 				     
void IIC_Ack(void);			                 
void IIC_NAck(void);				           void SDA_IN(void);
void SDA_OUT(void);#endif

mcp4725.c

#include "MCP4725.h"void MCP4725_Init(void)
{IIC_Init();
}//使用快速模式写命令写DAC寄存器
void  MCP4725_WriteData_Voltage(uint16_t Vout)   //电压单位mV   (max:3299)
{uint8_t temp;uint16_t Dn;Dn = (4096*Vout)/VREF;  temp = (0x0F00 & Dn) >> 8;  //12位数据。0000XXXX XXXXXXXX IIC_Start();IIC_Send_Byte(0XC0);        //器件寻址,器件代码:1100; 地址位A2,A1,A0为 0 , 0 , 0;-> 1100 0000IIC_Wait_Ack();	 IIC_Send_Byte(temp); 	      //将高8位送到DAC寄存器IIC_Wait_Ack();	 IIC_Send_Byte(Dn);          //将低8位送到DAC寄存器IIC_Wait_Ack();	IIC_Stop();                //产生一个停止条件 	delay_ms(10);	
}void  MCP4725_WriteData_Digital(uint16_t data)   //12位数字量   (max:4095)
{uint8_t data_H=0,data_L=0;data_H = ( 0x0F00 & data) >> 8;data_L = 0X00FF & data ;IIC_Start();               //20usIIC_Send_Byte(0XC0);      //器件寻址,器件代码:1100; 地址位A2,A1,A0为 0 , 0 , 0;-> 1100 0000  15usIIC_Wait_Ack();	          //5usIIC_Send_Byte(data_H); 	IIC_Wait_Ack();	 IIC_Send_Byte(data_L);IIC_Wait_Ack();	IIC_Stop();               //产生一个停止条件  	20usdelay_us(10);	
}

mcp4725.h

#ifndef __Mcp4725_H
#define __Mcp4725_H#include "Myi2c.h"
#include "Delay.h"#define  VREF   3300void MCP4725_Init(void);
void MCP4725_WriteData_Digital(uint16_t data);
void MCP4725_WriteData_Voltage(uint16_t Vout);#endif

软件IIC就是移植得快,我试过很多次了这个能用。

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

力扣647-回文子串(Java详细题解)

题目链接&#xff1a;力扣647-回文子串 前情提要&#xff1a; 因为本人最近都来刷dp类的题目所以该题就默认用dp方法来做。 dp五部曲。 1.确定dp数组和i下标的含义。 2.确定递推公式。 3.dp初始化。 4.确定dp的遍历顺序。 5.如果没有ac打印dp数组 利于debug。 每一个d…

软考高级:中台相关知识 AI 解读

中台&#xff08;Middle Platform&#xff09;是近年来在软件开发和企业架构中兴起的一种理念和架构模式&#xff0c;尤其在中国的互联网企业中得到了广泛应用。中台的核心思想是通过构建一个共享的服务和能力平台&#xff0c;支持前端业务的快速迭代和创新&#xff0c;从而提升…

【学习笔记】TLS/SSL握手之Records

TLS / SSL会话是由记录&#xff08;Records&#xff09;所组成&#xff0c;有4种records HandshakeAlertChange Cipher SpecApplication DataHandshake和Alert Records被分为子类型&#xff08;Subtypes&#xff09;&#xff1a; Handshake&#xff1a;Client HelloHandshake&a…

塑料瓶回收标志分级检测系统源码分享

塑料瓶回收标志分级检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Co…

QT编译之后的debug包下运行程序双击运行出现无法定位程序输入点__gxx_personlity_seh0于动态链接库

1.出现这个错误的原因是&#xff1a; 缺少如下文件&#xff1a; 2.解决方法&#xff1a; 在运行程序.exe所在的目录执行&#xff1a;windeployqt untitled.exe&#xff08;指打包的运行程序&#xff09; 3.如果执行提示由于找不到qt5core.dll,无法继续执行代码和无法识别win…

第十一章 从0-1搭建一个简单的JavaWeb系统(三)

目录 一、工程代码结构 二、代码实现 三、运行效果 四、未完待续 本章节的每一段代码&#xff0c;建议全部自己敲一遍&#xff0c;加深印象&#xff0c;切勿直接复制黏贴。 一、工程代码结构 本章节实现注销&#xff08;退出&#xff09;功能&#xff0c;以下图片中标红的…

无线感知会议系列【4】【基于WiFi和4G/5G的非接触无线感知:挑战、理论和应用-2】

前言&#xff1a; 本篇重点分享一下该论文 《Human Respiration Detection with Commodity Wifi Devices: Do User Location and Body Orientation Matter》 接 2020年北京智源大会 张大庆老师的一个报告 参考&#xff1a; https://blog.csdn.net/chengxf2/article/detai…

[Unity Demo]从零开始制作空洞骑士Hollow Knight第十集:制作后坐力系统Recoil和小骑士的生命系统和受伤系统

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、制作后坐力系统Recoil 1.使用代码实现扩展新的后坐力行为2.为敌人脚本添加后坐力行为3.为小骑士添加后坐力行为二、制作小骑士的生命系统和受伤系统 1.制作…

sqlserver 合并重复行数据,取有值的字段

我有这样的一个需求&#xff0c;先看数据 上面的记录&#xff0c;圈起来的 数据关键字段是重复的&#xff0c;但有的字段不一样&#xff0c; 我现在想合并为一条&#xff0c;特殊字段&#xff0c;取有值的 搜了很多行转列&#xff0c;都不是我需要的 不过有了启发&#xff0…

【自动驾驶】基于车辆几何模型的横向控制算法 | Pure Pursuit 纯跟踪算法详解与编程实现

写在前面&#xff1a; &#x1f31f; 欢迎光临 清流君 的博客小天地&#xff0c;这里是我分享技术与心得的温馨角落。&#x1f4dd; 个人主页&#xff1a;清流君_CSDN博客&#xff0c;期待与您一同探索 移动机器人 领域的无限可能。 &#x1f50d; 本文系 清流君 原创之作&…

从零开始学习Python

目录 从零开始学习Python 引言 环境搭建 安装Python解释器 选择IDE 基础语法 注释 变量和数据类型 变量命名规则 数据类型 运算符 算术运算符 比较运算符 逻辑运算符 输入和输出 控制流 条件语句 循环语句 for循环 while循环 循环控制语句 函数和模块 定…

一文学会 Java 8 的Predicates

​ 博客主页: 南来_北往 系列专栏&#xff1a;Spring Boot实战 前言 在这份详细的指南中&#xff0c;您将了解 Java Predicates&#xff0c;这是 Java 8 中一个新颖且有用的特性。本文解释了 Java Predicates 是什么以及如何在各种情况下使用它们。 在这份详尽的指南中…

JVM 几种经典的垃圾收集器

目录 前言 Serial Serial Old ParNew Parallel Scavenge Parallel Old CMS收集器 garbage first 收集器 前言 回顾一下之前的几种垃圾收集算法: JVM java主流的追踪式垃圾收集器-CSDN博客文章浏览阅读646次&#xff0c;点赞22次&#xff0c;收藏16次。简要介绍了几…

AI大模型教程 Prompt提示词工程 AI原生应用开发零基础入门到实战【2024超细超全,建议收藏】

在AGI&#xff08;通用人工智能&#xff09;时代&#xff0c;那些既精通AI技术、又具备编程能力和业务洞察力的复合型人才将成为最宝贵的资源。为此&#xff0c;我们提出了‘AI全栈工程师’这一概念&#xff0c;旨在更精准地描述这一复合型人才群体&#xff0c;而非过分夸大其词…

RocketMQ消费者消费的时候,宕机了,消息会丢失吗?

一个消息从生产者产生&#xff0c;到被消费者消费&#xff0c;主要经过这3个过程&#xff1a; 因此,本文将从以下这几个维度来回答: 生产者如何保证不丢消息 存储端如何保证不丢消息 消费者如何保证不丢消息 最后消费者消费的时候,宕机,消息会不会丢呢? 1. 生产者如何保证…

SaaS 软件转型计划

目录 一、转型目标 1、背景与趋势分析 2、转型策略与实施路径 3、预期成果与展望 二、现状分析 1、产品评估&#xff1a;从传统到SaaS的华丽转身 2、客户群体洞察&#xff1a;倾听需求&#xff0c;引领变革 3、销售渠道优化&#xff1a;拓宽路径&#xff0c;触达更多客…

如何高效绘制ER图?

在数据驱动的时代&#xff0c;实体-关系图&#xff08;ER图&#xff09;作为数据建模的核心工具&#xff0c;对于理解、设计和优化数据库结构至关重要。然而&#xff0c;传统的手绘或复杂软件绘制ER图方式往往效率低下且难以协作。幸运的是&#xff0c;ProcessOn在线绘图工具以…

潮玩宇宙大逃杀宝石游戏搭建开发

潮玩宇宙大逃杀的开发主要涉及以下方面&#xff1a; 1. 游戏概念和设计&#xff1a; 核心概念定义&#xff1a;确定以潮玩为主题的宇宙背景、游戏的基本规则和目标。例如&#xff0c;玩家在宇宙场景中参与大逃杀竞技&#xff0c;目标是成为最后存活的玩家。 玩法模式设计&a…

飞睿智能实时雷达活体探测传感器模块,智能家居静止检测实时感知人员有无

随着科技的飞速发展&#xff0c;我们的生活正在经历着未有的创新。在这个创新的浪潮中&#xff0c;实时雷达活体探测传感器模块的技术正逐渐崭露头角&#xff0c;以其独特的优势为我们的生活带来安全与便捷。今天&#xff0c;我们就来详细探讨一下这项技术&#xff0c;看看它是…

LeetCode Hot100 C++ 哈希 1.两数之和

LeetCode Hot100 C 1.两数之和 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案&#xff0c;并且你不能使用两次相同的元素。 你可以按…