MCP4725芯片
I2C.c
#include "I2C.h" #include "CS100A.h" /*引脚配置*/ #define MCP4725_SCL_SET HAL_GPIO_WritePin(GPIOF,GPIO_PIN_0,1) #define MCP4725_SCL_RST HAL_GPIO_WritePin(GPIOF,GPIO_PIN_0,0) #define MCP4725_SDA_SET HAL_GPIO_WritePin(GPIOF,GPIO_PIN_1,1) #define MCP4725_SDA_RST HAL_GPIO_WritePin(GPIOF,GPIO_PIN_1,0) #define MCP4725_SDAIN HAL_GPIO_ReadPin(GPIOF, GPIO_PIN_1) //初始化IIC void IIC_Init(void) { GPIO_InitTypeDef SCL = {.Pin = GPIO_PIN_0,.Mode = GPIO_MODE_OUTPUT_PP,}; __HAL_RCC_GPIOF_CLK_ENABLE(); HAL_GPIO_Init(GPIOF, &SCL); HAL_GPIO_WritePin(GPIOF, GPIO_PIN_0,1); GPIO_InitTypeDef SDA = {.Pin = GPIO_PIN_1,.Mode = GPIO_MODE_OUTPUT_PP,}; __HAL_RCC_GPIOF_CLK_ENABLE(); HAL_GPIO_Init(GPIOF, &SDA); HAL_GPIO_WritePin(GPIOF, GPIO_PIN_1,1); } //SDA设置为输入 void SDA_IN (void) { GPIO_InitTypeDef SDA = {.Pin = GPIO_PIN_1,.Mode = GPIO_MODE_INPUT,}; __HAL_RCC_GPIOF_CLK_ENABLE(); HAL_GPIO_Init(GPIOF, &SDA); } //SDA设置为输出 void SDA_OUT(void) { GPIO_InitTypeDef SDA = {.Pin = GPIO_PIN_1,.Mode = GPIO_MODE_OUTPUT_PP,}; __HAL_RCC_GPIOF_CLK_ENABLE(); HAL_GPIO_Init(GPIOF, &SDA); } //产生IIC起始信号 void IIC_Start(void) { SDA_OUT(); //SDA线设置为输出 MCP4725_SDA_SET; MCP4725_SCL_SET; delay_us(10); MCP4725_SDA_RST; delay_us(10); MCP4725_SCL_RST; //钳住I2C总线,准备发送或接收数据 } //产生IIC停止信号 void IIC_Stop(void) { SDA_OUT(); //SDA线输出 MCP4725_SCL_RST; MCP4725_SDA_RST; delay_us(10); MCP4725_SCL_SET; MCP4725_SDA_SET; //发送I2C总线结束信号 delay_us(10); } //等待应答信号到来 //返回值:1,接收应答失败 // 0,接收应答成功 uint8_t IIC_Wait_Ack(void) { uint8_t ucErrTime=0; SDA_IN(); //SDA设置为输入 MCP4725_SDA_SET; delay_us(2); MCP4725_SCL_SET; delay_us(2); while(MCP4725_SDAIN) { ucErrTime++; if(ucErrTime>250) { IIC_Stop(); return 1; } } MCP4725_SCL_RST;//时钟输出0 return 0; } //产生ACK应答 void IIC_Ack(void) { MCP4725_SCL_RST; SDA_OUT(); MCP4725_SDA_RST; delay_us(5); MCP4725_SCL_SET; delay_us(5); MCP4725_SCL_RST; } //不产生ACK应答 void IIC_NAck(void) { MCP4725_SCL_RST; SDA_OUT(); MCP4725_SDA_SET; delay_us(5); MCP4725_SCL_SET; delay_us(5); MCP4725_SCL_RST; } //IIC发送一个字节 //返回从机有无应答 //1,有应答 //0,无应答 void IIC_Send_Byte(uint8_t txd) { uint8_t t; SDA_OUT(); MCP4725_SCL_RST;//拉低时钟开始数据传输 for(t=0;t<8;t++) //开始准备信号线 { if((txd&0x80)>>7) MCP4725_SDA_SET; else MCP4725_SDA_RST; txd<<=1; delay_us(5); MCP4725_SCL_SET; delay_us(5); MCP4725_SCL_RST; delay_us(5); } } //读1个字节,ack=1时,发送ACK,ack=0,发送nACK uint8_t IIC_Read_Byte(unsigned char ack) { unsigned char i,receive=0; SDA_IN();//SDA设置为输入 for(i=0;i<8;i++ ) { MCP4725_SCL_RST; delay_us(5); MCP4725_SCL_SET; receive<<=1; if(MCP4725_SDAIN) {receive++; } delay_us(4); } if (!ack) IIC_NAck();//发送nACK else IIC_Ack(); //发送ACK return receive; }
I2C.h
#ifndef __I2C_H #define __I2C_H #include "main.h" //IIC所有操作函数 void IIC_Init(void); //初始化IIC的IO口 void IIC_Start(void); //发送IIC开始信号 void IIC_Stop(void); //发送IIC停止信号 void IIC_Send_Byte(uint8_t txd); //IIC发送一个字节 uint8_t IIC_Read_Byte(unsigned char ack);//IIC读取一个字节 uint8_t IIC_Wait_Ack(void); //IIC等待ACK信号 void IIC_Ack(void); //IIC发送ACK信号 void IIC_NAck(void); //IIC不发送ACK信号 void SDA_IN(void); void SDA_OUT(void); void IIC_Write_One_Byte(uint8_t daddr,uint8_t addr,uint8_t data); uint8_t IIC_Read_One_Byte(uint8_t daddr,uint8_t addr); #endif
MCP4725.c
#include "MCP4725.h" //初始化IIC接口 void MCP4725_Init(void) { IIC_Init(); } //使用快速模式写命令写DAC寄存器 void MCP4725_WriteData_Voltage(uint16_t Vout) //电压单位mV { uint8_t temp; uint16_t Dn; Dn = ( 4096 * Vout) / VREF_in; //这里的VREF宏定输入电压 temp = (0x0F00 & Dn) >> 8; //12位数据。0000XXXX XXXXXXXX IIC_Start(); IIC_Send_Byte(0XC0); //器件寻址,器件代吗:1100; 地址位A2,A1,A0为 0 , 0 , 1;-> 1100 0010 //这个地址0XC0或0XC1,根据自己购买的模块决定 IIC_Wait_Ack(); IIC_Send_Byte(temp); //将高8位送到DAC寄存器 IIC_Wait_Ack(); IIC_Send_Byte(Dn); //将低8位送到DAC寄存器 IIC_Wait_Ack(); IIC_Stop();//产生一个停止条件 HAL_Delay(10); } void MCP4725_WriteData_Digital(uint16_t data) //12位数字量 { uint8_t data_H=0,data_L=0; data_H = ( 0x0F00 & data) >> 8; data_L = 0X00FF & data ; IIC_Start(); IIC_Send_Byte(0XC0); //器件寻址,器件代吗:1100; 地址位A2,A1,A0为 0 , 0 , 0;-> 1100 0010 IIC_Wait_Ack(); IIC_Send_Byte(data_H); IIC_Wait_Ack(); IIC_Send_Byte(data_L); IIC_Wait_Ack(); IIC_Stop();//产生一个停止条件 HAL_Delay(10); }
MCP4725.h
#ifndef __MCP4725_H #define __MCP4725_H #include "I2C.h" #include "main.h" #define VREF_in 3300//这个数值根据自己给模块的供电电压而定 void MCP4725_Init(void); void MCP4725_WriteData_Digital(uint16_t data); void MCP4725_WriteData_Voltage(uint16_t Vout); #endif
? ? ? ? 主函数中需要初始化一下:MCP4725_Init();
? ? ? ? 然后调用这个函数即可:MCP4725_WriteData_Voltage(1000);
我最近发了一篇文章里面包含了常用的功能函数以及常用的模块底层驱动函数封装库,大家感兴趣的可以收藏一下,需要的时候就不用到处找代码,一篇就够用,我会持续更新。
????????常用模块函数封装库(持续更新中。。。。。。)-CSDN博客?