汇总一系列AD/DA的驱动程序
ads1112.c
#include "ads1112.h"
#include "common.h"
void AD5726_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOC, ENABLE );//PORTA、D时钟使能
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_SetBits(GPIOA,GPIO_Pin_1 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_Init(GPIOC, &GPIO_InitStructure); //根据设定参数初始化GPIOB.9
GPIO_ResetBits(GPIOC,GPIO_Pin_4);
}
//初始化时,输出电压在中位值,也就是-2.5V---+2.5V中间的0值
//输出的范围由硬件设计决定,详情可以参考ADI公司的datasheet
void AD5726OUT_Init(void)
{
AD5726_Init();
AD5726_LDAC_L();
AD5726_CS_H();
AD5726_CLR_L();
AD5726_CLRSEL_H();
}
//模拟SPI通信,方便移植到不同的平台
//input格式:A1 A0 X X D11-----D0
//A1-A0真值表:00--CHA 01--CHB 10--CHC 11--CHD
//CLR-CLRSEL真值表:00--12位寄存器的值为0x000,01--12位寄存器的值为0x800,10和11--12位寄存器不做修改
void SPIWriteByte(u16 data)
{
u8 i;
AD5726_CLR_H();
Delay_us(5);
AD5726_LDAC_H();
Delay_us(5);
AD5726_CLK_H();
AD5726_CS_H();
Delay_us(1);
AD5726_CS_L();
Delay_us(1);
for(i =0; i<16; i++)
{
AD5726_CLK_L();
Delay_us(1);
if(data&0x8000)
AD5726_DIN_H();
else
AD5726_DIN_L();
AD5726_CLK_H();
Delay_us(1);
data<<=1;
}
AD5726_CS_H();
Delay_us(1);
AD5726_LDAC_L();
Delay_us(5);
AD5726_LDAC_H();
Delay_us(1);
}
void ChannelAOut(uint16_t dac)
{
u16 xx = dac;
xx=xx&0x0FFF;
SPIWriteByte(xx);
}
void ChannelBOut(uint16_t dac)
{
u16 xx = dac;
xx=0x4000+(xx&0x0FFF);
SPIWriteByte(xx);
}
void ChannelCOut(uint16_t dac)
{
u16 xx = dac;
xx=0x8000+(xx&0x0FFF);
SPIWriteByte(xx);
}
void ChannelDOut(uint16_t dac)
{
u16 xx = dac;
xx=0xC000+(xx&0x0FFF);
SPIWriteByte(xx);
}
ads1112.h
#ifndef __ADS1112_H
#define __ADS1112_H
#include "stm32f10x.h"
//LDAC功能描述,当引脚为H时为锁定状态,DAC寄存器的内容不能改变。为L时,寄存器的内容可以改变
//CLRSEL功能描述,确定“CLR非”的动作,如果是高电平 ,将使用一个清除命令将内部DAC寄存器设置成中间值(0X800)。如果是低电平,寄存器将被设置成零(0X000)。
#define AD5726_CS_H() GPIO_SetBits(GPIOA,GPIO_Pin_4 )
#define AD5726_CLK_H() GPIO_SetBits(GPIOA,GPIO_Pin_5 )
#define AD5726_DIN_H() GPIO_SetBits(GPIOA,GPIO_Pin_7 )
#define AD5726_CLRSEL_H() GPIO_SetBits(GPIOA,GPIO_Pin_1 )
#define AD5726_CLR_H() GPIO_SetBits(GPIOA,GPIO_Pin_6 )
#define AD5726_LDAC_H() GPIO_SetBits(GPIOC,GPIO_Pin_4 )
#define AD5726_CS_L() GPIO_ResetBits(GPIOA,GPIO_Pin_4 )
#define AD5726_CLK_L() GPIO_ResetBits(GPIOA,GPIO_Pin_5 )
#define AD5726_DIN_L() GPIO_ResetBits(GPIOA,GPIO_Pin_7 )
#define AD5726_CLRSEL_L() GPIO_ResetBits(GPIOA,GPIO_Pin_1 )
#define AD5726_CLR_L() GPIO_ResetBits(GPIOA,GPIO_Pin_6 )
#define AD5726_LDAC_L() GPIO_ResetBits(GPIOC,GPIO_Pin_4 )
void AD5726_Init(void);
void AD5726OUT_Init(void);
void ChannelAOut(uint16_t dac);
void ChannelBOut(uint16_t dac);
void ChannelCOut(uint16_t dac);
void ChannelDOut(uint16_t dac);
#endif