AD5676为单片8通道DAC,一下驱动代码是用的模拟SPI去写的,芯片型号STM32F103C8xx,亲测是可以用的,输出比较稳定,废话不多说,直接上代码:
首先头文件:
#define GPIO_PORT_SPI1_SCK GPIOB
#define GPIO_PIN_SPI1_SCK GPIO_Pin_3#define GPIO_PORT_SPI1_MISO GPIOB
#define GPIO_PIN_SPI1_MISO GPIO_Pin_4#define GPIO_PORT_SPI1_MOSI GPIOB
#define GPIO_PIN_SPI1_MOSI GPIO_Pin_5#define GPIO_PORT_LDAC GPIOA
#define GPIO_PIN_LDAC GPIO_Pin_8#define SPI1_SCK_HIGH GPIO_SetBits(GPIO_PORT_SPI1_SCK,GPIO_PIN_SPI1_SCK)
#define SPI1_SCK_LOW GPIO_ResetBits(GPIO_PORT_SPI1_SCK,GPIO_PIN_SPI1_SCK)#define SPI1_MOSI_HIGH GPIO_SetBits(GPIO_PORT_SPI1_MOSI,GPIO_PIN_SPI1_MOSI)
#define SPI1_MOSI_LOW GPIO_ResetBits(GPIO_PORT_SPI1_MOSI,GPIO_PIN_SPI1_MOSI)#define SPI1_CS1_HIGH GPIO_SetBits(GPIO_PORT_SPI1_CS1,GPIO_PIN_SPI1_CS1)
#define SPI1_CS1_LOW GPIO_ResetBits(GPIO_PORT_SPI1_CS1,GPIO_PIN_SPI1_CS1)#define SPI1_CS2_HIGH GPIO_SetBits(GPIO_PORT_SPI1_CS2,GPIO_PIN_SPI1_CS2)
#define SPI1_CS2_LOW GPIO_ResetBits(GPIO_PORT_SPI1_CS2,GPIO_PIN_SPI1_CS2)#define SPI1_CS3_HIGH GPIO_SetBits(GPIO_PORT_SPI1_CS3,GPIO_PIN_SPI1_CS3)
#define SPI1_CS3_LOW GPIO_ResetBits(GPIO_PORT_SPI1_CS3,GPIO_PIN_SPI1_CS3)
以下为命令(实际用到的命令是3)
C文件代码:
void spiwrite(rt_uint8_t data)
{rt_uint8_t i;SPI1_SCK_LOW;delay_us(10);for(i=0;i<8;i++){SPI1_SCK_HIGH;if(0x80&data){SPI1_MOSI_HIGH;}else{SPI1_MOSI_LOW;}data<<=1;delay_us(10);SPI1_SCK_LOW;delay_us(10);}SPI1_SCK_LOW;delay_us(10);
}//说明:p1为通道选择 p2为输出的电压(ad值)
//我用的是spi驱动3片ad5676 setDacs(p1,1);这个函数是选择cs引脚使能的,三片公用mosi 和sck,ldac,我没有用到miso引脚,可以同时写24路然后再使能ldac可以同时输出24路,没有时间差
static int ad5676_handle(int p1,int p2,void *para)
{rt_uint8_t i;rt_uint8_t buf[3];buf[0] = 3<<4;buf[0] |= p1%8;buf[1] = (rt_uint8_t)(p2>>8);buf[2] = (rt_uint8_t)p2;setDacs(p1,1);delay_us(10);//GPIO_ResetBits(GPIOB,GPIO_Pin_6);//GPIO_ResetBits(GPIOA,GPIO_Pin_15);setDacs(p1,0);delay_us(10);for(i=0;i<3;i++){spiwrite(buf[i]);}setDacs(p1,1);return 0;
}
驱动相对来说比较简单,对于会看芯片时序的兄弟来讲小菜一碟,写这个驱动也是为小白提供一些参考,如果使用库函数spi相对来说简单点,配置好spi就行了,我还是习惯硬件spi,我认为硬件spi比较稳定,会少很多多余的操作,个人见解不喜勿喷,欢迎交流心得