攜程旅游網(wǎng)站建設(shè)的定位廣點通廣告平臺
DACx0502 說明
16 位 DAC80502、14 位 DAC70502 和 12 位DAC60502 (DACx0502) 數(shù)模轉(zhuǎn)換器 (DAC) 均為具有電壓輸出的高精度、低功耗器件。
DACx0502 線性度小于 1LSB。憑借高精度和微型封裝特性,DACx0502 非常適合以下 應(yīng)用: 增益和失調(diào)電壓校準(zhǔn)、電流或電壓設(shè)置點設(shè)定和電源控制。這些器件包括一個 2.5V、5ppm/°C 內(nèi)部基準(zhǔn),可提供 1.25V、2.5V 或 5V 的滿量程輸出電壓范圍。ACx0502 采用了上電復(fù)位電路,可確保 DAC 輸出根據(jù) RSTSEL 引腳的狀態(tài)以零電平或中間電平上電,并在向器件寫入有
效代碼之前一直保持該電平。
DACx0502 的數(shù)字接口可通過 SPI2C 引腳配置為 SPI或 I2C 模式。在 SPI 模式下,DACx0502 使用一個在高達(dá) 50MHz 的時鐘頻率下運行的通用 3 線制串行接口。在 I2C 模式下,DACx0502 支持標(biāo)準(zhǔn) (100kbps)、快速 (400kbps) 和快速+ (1.0Mbps) 工作模式。
DACx0502 功能方框圖
DACx0502 引腳配置和功能
DACx0502 驅(qū)動模式
- SPI 或 IIC
DACx0502 寄存器映射
測試平臺
-
測試平臺:STM32F103ZET6
-
測試芯片:DAC60502
驅(qū)動及應(yīng)用示例
- 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;
}
// 產(chǎn)生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;
}
// 產(chǎn)生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);
}
// 等待應(yīng)答信號到來
// 返回值:1,接收應(yīng)答失敗
// 0,接收應(yīng)答成功
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;
}
// 產(chǎn)生ACK應(yīng)答
void IIC_Ack(void)
{IIC_SCL=0;SDA_OUT();IIC_SDA=0;delay_us(2);IIC_SCL=1;delay_us(2);IIC_SCL=0;
}
// 不產(chǎn)生ACK應(yīng)答
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寫一個字節(jié)
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讀一個字節(jié)
// ack=1,發(fā)送ACK,
// ack=0,發(fā)送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();elseIIC_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方向設(shè)置
#define SDA_IN() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=(u32)8<<28;}
#define SDA_OUT() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=(u32)3<<28;}//IO操作函數(shù)
#define IIC_SCL PBout(6) //SCL
#define IIC_SDA PBout(7) //SDA
#define READ_SDA PBin(7) //輸入SDA //IIC操作函數(shù)
void IIC_Init(void); //初始化IIC的IO口
void IIC_Start(void); //發(fā)送IIC開始信號
void IIC_Stop(void); //發(fā)送IIC停止信號
void IIC_Write_Byte(uint8_t txd); //IIC發(fā)送一個字節(jié)
uint8_t IIC_Read_Byte(uint8_t ack); //IIC讀取一個字節(jié)
uint8_t IIC_Wait_Ack(void); //IIC等待ACK信號
void IIC_Ack(void); //IIC發(fā)送ACK信號
void IIC_NAck(void); //IIC不發(fā)送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 0x09int 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); //系統(tǒng)時鐘設(shè)置uart_init(72,115200); //串口初始化為115200delay_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;
}