通过阅读DAC7512的数据手册,其是16位DAC数据,12位精度采集我们可以知道如下信息:
因为其最大通信频率可以达到30Mhz,因此其驱动通信协议支持DSPI和SPI,
根据下图说明明驱动的时候需要向DAC写进数值,范围0-4095,其经过String 寄存器后,数值被
分配到不同的路径,相应的开启通路的电阻进行分压,得出输出电压
数据手册上针对如何驱动写明了,数据需要在怕片选拉低的时候送进去有效,
根据SPI的时序可知时钟线在第一个边沿跳变时数据被写进去,空闲状态为高电平,高位在前,只做从机处理,SPI接三条线:
根据移位寄存器说明知道16位的数据中,最高两位无效,次高两位用于选择工作模式和低功耗模式,最后12位
为有效数据。
因此可以通过上述的说明:
输出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;
}
}