1、DAC8830介绍
DAC8830是一款TI的DAC输出芯片,他支持16bit数据出入,同时建立时间为1us,支持标准的SPI接口,最快可支持50Mhz,如下为DAC8830的基本封装:
2、STM32,SPI介绍
因为DAC8830仅支持单线通信,即只接收收据,不回复数据,所以STM32这边可以设置为单线发送,SPI_Direction_1Line_Tx,具体配置如下:
首先需要初始化相关引脚,CS、CLK、MOSI三个引脚。
//SPI_CS
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_SetBits(GPIOB, GPIO_Pin_12);
//SPI_CLK,SPI_MOSI
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_15;
#ifndef USE_ANALOG
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
#endif
GPIO_Init(GPIOB, &GPIO_InitStructure);
而后,初始化SPI模块,如下:
SPI_InitTypeDef SPI_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);
GPIO_ResetBits(GPIOB,GPIO_Pin_13|GPIO_Pin_15); //PB13/14/15上拉
SPI_I2S_DeInit(SPI2);
SPI_InitStructure.SPI_Direction = SPI_Direction_1Line_Tx;
SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
SPI_InitStructure.SPI_DataSize = SPI_DataSize_16b;
SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2; //SPI2 Speed: 18MHz
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
SPI_InitStructure.SPI_CRCPolynomial = 7;
SPI_Init(SPI2, &SPI_InitStructure);
SPI_Cmd(SPI2, ENABLE);
注意:DAC8830是支持16bit数据传输,且高字节在前的,所以需要将SPI的数据长度配置为16bit,将传输的FirstBit设置为SPI_FirstBit_Msb。同时关于CPOL和CPHA这两项一定不能配置错误,否则可能会导致数据解析出现异常,这两项要根据DAC8830提供的时许图来进行判断。CPOL意味着CLK在空闲状态时低还是高,而CPHA,则是来判断这个数据是在第一个边沿采集还是第二个边沿采集,通过查看DAC8830时序图,我们可以判断,空闲状态下的CLK为低电平,而采样在高电平,如下所示:
详细接收可参看此链接:https://blog.csdn.net/ce123_zhouwei/article/details/6923293
3、发送数据到DAC8830
这里是最大的一个坑,也是在这一步,我掉进了坑,先前一直按照标准的来写,即在发送之前先判断发送空闲是否为置1,忙状态是否置0,如果是,就继续发数据,然后就开始进行测试,结果,很明显,DAC8830完全未按照自己发送的数据去改变,而是瞎变化,最后在一篇博文中看到了一点,原来在向DR写数据后SPI并不会立即启动发送此时BSY仍然为0,TXE为0,延迟2个APB时钟周期后发送启动TXE变为1,BSY变为1,等到数据发送完成BSY再变为0,然后我的发送代码就可以这样写了:
uint8_t retry = 0;
CS_L;
SPI_I2S_SendData(SPI2, TxData);
__NOP;
__NOP;
while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_BSY) == SET && retry++ < 200); //判忙标志
CS_H;
if (retry == 201) return 0;
return 1;
经过测试,DAC可以正常接收数据,下一步,使用DMA+SPI驱动。
来源:CSDN
作者:Lover_M
链接:https://blog.csdn.net/Lover_M/article/details/103468799