DACx0502 说明
16 位 DAC80502、14 位 DAC70502 和 12 位DAC60502 (DACx0502) 数模转换器 (DAC) 均为具有电压输出的高精度、低功耗器件。
DACx0502 线性度小于 1LSB。凭借高精度和微型封装特性,DACx0502 非常适合以下 应用: 增益和失调电压校准、电流或电压设置点设定和电源控制。这些器件包括一个 2.5V、5ppm/°C 内部基准,可提供 1.25V、2.5V 或 5V 的满量程输出电压范围。ACx0502 采用了上电复位电路,可确保 DAC 输出根据 RSTSEL 引脚的状态以零电平或中间电平上电,并在向器件写入有
效代码之前一直保持该电平。
DACx0502 的数字接口可通过 SPI2C 引脚配置为 SPI或 I2C 模式。在 SPI 模式下,DACx0502 使用一个在高达 50MHz 的时钟频率下运行的通用 3 线制串行接口。在 I2C 模式下,DACx0502 支持标准 (100kbps)、快速 (400kbps) 和快速+ (1.0Mbps) 工作模式。
DACx0502 功能方框图
DACx0502 引脚配置和功能
DACx0502 驱动模式
- SPI 或 IIC
DACx0502 寄存器映射
测试平台
-
测试平台:STM32F103ZET6
-
测试芯片:DAC60502
驱动及应用示例
- myiic.c
#include "myiic.h"
#include "delay.h"
// 初始化IIC
void IIC_Init(void)
{
RCC->APB2ENR|=1<<3;
GPIOB->CRL&=0X00FFFFFF;
GPIOB->CRL|=0X33000000;
GPIOB->ODR|=3<<6;
}
// 产生IIC起始信号
void IIC_Start(void)
{
SDA_OUT();
IIC_SDA=1;
IIC_SCL=1;
delay_us(4);
IIC_SDA=0;
delay_us(4);
IIC_SCL=0;
}
// 产生IIC停止信号
void IIC_Stop(void)
{
SDA_OUT();
IIC_SCL=0;
IIC_SDA=0;
delay_us(4);
IIC_SCL=1;
IIC_SDA=1;
delay_us(4);
}
// 等待应答信号到来
// 返回值:1,接收应答失败
// 0,接收应答成功
uint8_t IIC_Wait_Ack(void)
{
uint8_t ucErrTime=0;
SDA_IN();
IIC_SDA=1;delay_us(1);
IIC_SCL=1;delay_us(1);
while(READ_SDA)
{
ucErrTime++;
if(ucErrTime>250)
{
IIC_Stop();
return 1;
}
}
IIC_SCL=0;
return 0;
}
// 产生ACK应答
void IIC_Ack(void)
{
IIC_SCL=0;
SDA_OUT();
IIC_SDA=0;
delay_us(2);
IIC_SCL=1;
delay_us(2);
IIC_SCL=0;
}
// 不产生ACK应答
void IIC_NAck(void)
{
IIC_SCL=0;
SDA_OUT();
IIC_SDA=1;
delay_us(2);
IIC_SCL=1;
delay_us(2);
IIC_SCL=0;
}
// IIC写一个字节
void IIC_Write_Byte(uint8_t txd)
{
uint8_t t;
SDA_OUT();
IIC_SCL=0;
for(t=0;t<8;t++)
{
IIC_SDA=(txd&0x80)>>7;
txd<<=1;
delay_us(2);
IIC_SCL=1;
delay_us(2);
IIC_SCL=0;
delay_us(2);
}
}
// IIC读一个字节
// ack=1,发送ACK,
// ack=0,发送nACK
uint8_t IIC_Read_Byte(uint8_t ack)
{
uint8_t i,receive=0;
SDA_IN();
for(i=0;i<8;i++ )
{
IIC_SCL=0;
delay_us(2);
IIC_SCL=1;
receive<<=1;
if(READ_SDA)receive++;
delay_us(1);
}
if (!ack)
IIC_NAck();
else
IIC_Ack();
return receive;
}
void IIC_Write_UINT16(uint8_t dev_addr, uint8_t wr_addr, uint16_t data)
{
IIC_Start();
IIC_Write_Byte(dev_addr);
IIC_Wait_Ack();
IIC_Write_Byte(wr_addr);
IIC_Wait_Ack();
IIC_Write_Byte(data >> 8);
IIC_Wait_Ack();
IIC_Write_Byte(data & 0xFF);
IIC_Wait_Ack();
IIC_Stop();
delay_ms(2);
}
uint16_t IIC_Read_UINT16(uint8_t dev_addr, uint8_t rd_addr)
{
uint16_t data;
IIC_Start();
IIC_Write_Byte(dev_addr);
IIC_Wait_Ack();
IIC_Write_Byte(rd_addr);
IIC_Wait_Ack();
IIC_Start();
IIC_Write_Byte(dev_addr + 1);
IIC_Wait_Ack();
data = IIC_Read_Byte(1);
data = (data <<8 ) + IIC_Read_Byte(0);
IIC_Stop();
return data;
}
- myiic.h
#ifndef __MYIIC_H__
#define __MYIIC_H__
#include "sys.h"
//IO方向设置
#define SDA_IN() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=(u32)8<<28;}
#define SDA_OUT() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=(u32)3<<28;}
//IO操作函数
#define IIC_SCL PBout(6) //SCL
#define IIC_SDA PBout(7) //SDA
#define READ_SDA PBin(7) //输入SDA
//IIC操作函数
void IIC_Init(void); //初始化IIC的IO口
void IIC_Start(void); //发送IIC开始信号
void IIC_Stop(void); //发送IIC停止信号
void IIC_Write_Byte(uint8_t txd); //IIC发送一个字节
uint8_t IIC_Read_Byte(uint8_t ack); //IIC读取一个字节
uint8_t IIC_Wait_Ack(void); //IIC等待ACK信号
void IIC_Ack(void); //IIC发送ACK信号
void IIC_NAck(void); //IIC不发送ACK信号
void IIC_Write_UINT16(uint8_t dev_addr, uint8_t wr_addr, uint16_t data);
uint16_t IIC_Read_UINT16(uint8_t dev_addr, uint8_t rd_addr);
#endif
- dacx0502.c
#include "dac60502.h"
#include "delay.h"
//初始化IIC接口
int DAC60502_Init(void)
{
IIC_Init();
return 0;
}
void DAC60502_Write(uint16_t WrAddr, uint16_t Data)
{
IIC_Write_UINT16(DEV_ADDR, WrAddr, Data);
}
uint16_t DAC60502_Read(uint16_t RdAddr)
{
return IIC_Read_UINT16(DEV_ADDR, RdAddr);
}
- dac60502.h
#ifndef __DAC60502_H__
#define __DAC60502_H__
#include "myiic.h"
#define DEV_ADDR 0x90
#define NOOP 0x00
#define DEVID 0x01
#define SYNC 0x02
#define CONFIG 0x03
#define GAIN 0x04
#define TRIGGER 0x05
#define STATUS 0x06
#define DAC_A 0x08
#define DAC_B 0x09
int DAC60502_Init(void);
void DAC60502_Write(uint16_t WrAddr, uint16_t Data);
uint16_t DAC60502_Read(uint16_t RdAddr);
#endif
- main.c
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "dac60502.h"
#include "usmart.h"
int main(void)
{
uint16_t data = 0;
Stm32_Clock_Init(9); //系统时钟设置
uart_init(72,115200); //串口初始化为115200
delay_init(72); //延时初始化
usmart_dev.init(72); //初始化USMART
LED_Init(); //初始化与LED连接的硬件接口
DAC60502_Init(); //IIC初始化
while(1)
{
data = data + 0x1;
if(data > 0x0fff)
data = 0;
DAC60502_Write(DAC_A,data << 4);
printf("Write: %d \r\n", data);
delay_ms(100);
printf("Read: %d \r\n", DAC60502_Read(DAC_A) >> 4);
delay_ms(100);
LED0=!LED0;
}
return 0;
}