DAC7512驱动原理

时间:2024-04-13 15:34:43

通过阅读DAC7512的数据手册,其是16位DAC数据,12位精度采集我们可以知道如下信息:

因为其最大通信频率可以达到30Mhz,因此其驱动通信协议支持DSPI和SPI,

根据下图说明明驱动的时候需要向DAC写进数值,范围0-4095,其经过String 寄存器后,数值被

分配到不同的路径,相应的开启通路的电阻进行分压,得出输出电压

DAC7512驱动原理

数据手册上针对如何驱动写明了,数据需要在怕片选拉低的时候送进去有效,

根据SPI的时序可知时钟线在第一个边沿跳变时数据被写进去,空闲状态为高电平,高位在前,只做从机处理,SPI接三条线:

DAC7512驱动原理

根据移位寄存器说明知道16位的数据中,最高两位无效,次高两位用于选择工作模式和低功耗模式,最后12位

为有效数据。

DAC7512驱动原理

因此可以通过上述的说明:

输出stm32 SPI驱动的程序如下:

要使其工作需要将最高四位设置为0

static void SPI_GPIO_Config(void)
{
        GPIO_InitTypeDef  GPIO_InitStructure;

        RCC_APB2PeriphClockCmd (DAC7512_SPI_GPIO_CLK,ENABLE);
        GPIO_InitStructure.GPIO_Pin   = DAC7512_SPI_CS_PIN;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_Out_PP;     //这里是不是也要推换           
        GPIO_Init(DAC7512_SPI_PORT,&GPIO_InitStructure);


        GPIO_InitStructure.GPIO_Pin   = DAC7512_SPI_SCK_PIN;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF_PP;               
        GPIO_Init(DAC7512_SPI_PORT,&GPIO_InitStructure);


        GPIO_InitStructure.GPIO_Pin   = DAC7512_SPI_MOSI_PIN;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF_PP;               
        GPIO_Init(DAC7512_SPI_PORT,&GPIO_InitStructure);


        DAC7512_SPI_CS_HIGH();
}


static void SPI_Mode_Config(void)
{
        SPI_InitTypeDef  SPI_InitStructure; 
        RCC_APB1PeriphClockCmd(DAC7512_SPI_CLK,ENABLE);


        SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_16;   //时钟频率,分频系数不确定
        SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge ;  //这里应该是第一个跳变沿被采集 为SPI_CPHA_1Edge
        SPI_InitStructure.SPI_CPOL = SPI_CPOL_High ;   //空闲为高电平
        SPI_InitStructure.SPI_CRCPolynomial = 0;
        SPI_InitStructure.SPI_DataSize = SPI_DataSize_16b;
        SPI_InitStructure.SPI_Direction = SPI_Direction_1Line_Tx;
        SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;   //高位在前
        SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
        SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;        


        SPI_Init(DAC7512_SPIx,&SPI_InitStructure);

     SPI_I2S_ClearFlag(DAC7512_SPIx, SPI_I2S_FLAG_TXE); //加上清除
        SPI_Cmd(DAC7512_SPIx,ENABLE);
}


void SPI_DAC7512_Init(void)
{        
        SPI_GPIO_Config();
        SPI_Mode_Config();
}


void SPI_DAC7512_Send_Byte(uint16_t data)
{
        while(SPI_I2S_GetFlagStatus(DAC7512_SPIx,SPI_I2S_FLAG_TXE) == RESET);
        SPI_I2S_SendData(DAC7512_SPIx,data);
}

main函数如下:

uint16_t data1 = 0x00ff;


int main(void)
{
        SPI_DAC7512_Init();
  while(1)
        {
                DAC7512_SPI_CS_LOW;
                SPI_DAC7512_Send_Byte(data1);
                Delay(60);
                DAC7512_SPI_CS_HIGH;        
        }
}