STM32+DAC8830驱动程序

无人久伴 提交于 2019-12-10 10:19:24

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驱动。

相关链接:http://bbs.eeworld.com.cn/thread-1059470-1-1.html

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!