/* * DAC8568/DAC8168/DAC8568 驱动程序 * 参考数据手册: https://www.ti.com.cn/product/cn/DAC8568 * 版本: 2025-4-10 * 作者: 雪豹 * 描述: 驱动TI DAC8568系列DAC芯片,支持SPI通信和基本功能 * 开源协议: MIT * 版权所有 (c) 2025 雪豹 * 注意:本代码仅供参考,使用前请仔细阅读数据手册和相关文档。 * 使用本代码即表示您同意承担所有风险和责任。 */ /* * TI DAC7568/DAC8168/DAC8568 核心特性 (数据手册第1/5-7页) * * 【共同特性】 * - 通道数量: 8通道独立电压输出 * - 内部基准: 2.5V (±0.004%初始精度, 2ppm/°C温漂典型值) * - 毛刺能量: 0.1nV-s (代码切换瞬态) * - 输出缓冲: 轨到轨输出,驱动能力 20mA sink/source * - 电源范围: 2.7V至5.5V单电源供电 * - 接口速度: 最高50MHz SPI时钟 * - 低功耗: * > 工作模式: 1.25mA @5V (含基准) * > 断电模式: 0.18μA @5V (典型) * - 温度范围: -40°C至+125°C * - 复位特性: 上电复位至零电平/中间电平(型号后缀A/B/C/D区分) * * 【关键性能参数】 * - DAC建立时间: * > 5μs (典型值, 空载, 1/4至3/4量程, ±0.024%误差) * > 10μs (最大值, 接1MΩ负载) * * 【型号差异】 * >> DAC7568 (12位): * - 分辨率: 12位 (0x000-0xFFF) * - INL: ±1 LSB (最大值) * - 封装: TSSOP-14/16 * * >> DAC8168 (14位): * - 分辨率: 14位 (0x0000-0x3FFF) * - INL: ±4 LSB (最大值) * - 封装: TSSOP-14/16 * * >> DAC8568 (16位): * - 分辨率: 16位 (0x0000-0xFFFF) * - INL: ±12 LSB (最大值) * - 封装: TSSOP-16 * * 【编程注意】 * 1. 数据对齐差异: * DAC7568使用12位数据(D11-D0),需左移4位填充到SPI帧 * DAC8168使用14位数据(D13-D0),需左移2位 * DAC8568使用全部16位数据(D15-D0) * * 2. 建立时间影响: * 输出稳定需等待至少10μs,高速连续写入时需添加延时: * HAL_Delay(1); // 保守延时1ms (实际最低10μs) */ /* * SPI 外设配置说明 (针对 DAC8568) * ---------------------------------------------------------------- * 参数要求(参考数据手册第7-8页时序图和第6页电气特性): * 1. 模式: 全双工主模式 (DAC8568 为从设备) * 2. 数据大小: 8位 (需手动组合为24/32位帧) * 3. 时钟极性 (CPOL): 低电平空闲 (CPOL=0) * 4. 时钟相位 (CPHA): 数据在第一个边沿采样 (CPHA=0) * 5. 传输顺序: MSB 高位在前 (强制要求) * 6. 波特率: ≤50MHz (建议根据主频选择分频器) * 7. 硬件NSS: 禁用 (使用独立GPIO控制SYNC引脚) * * CubeMX 具体设置步骤: * 1. Connectivity → SPIx → Mode = "Full-Duplex Master" * 2. Parameter Settings → * - Data Size = 8 Bits * - First Bit = MSB First * - Clock Polarity = High 注意这个 * - Clock Phase = 1 Edge * - Baud Rate Prescaler = 分频值 (如 2/4/8,确保 SCLK ≤50MHz) * 3. GPIO Settings → * - 配置 SYNC 引脚为 GPIO_Output (初始化高电平) * - MOSI/SCK 自动分配,模式为 Alternate Function Push-Pull */ /* * DAC8568 硬件连接说明: * ---------------------------------------------------------------- * DAC8568引脚 | STM32引脚 | 备注 * -----------|----------------|----------------------------------- * DIN | SPIx_MOSI | 主设备输出,直连无需上拉 * SCLK | SPIx_SCK | 保持短走线,减少干扰 * SYNC | 任意GPIO (如PA4)| 需配置为输出模式,传输前拉低 * VDD | 3.3V | 电源需并联100nF去耦电容 * GND | GND | 共地 */ #ifndef DAC8568_H #define DAC8568_H #ifdef __cplusplus extern "C" { #endif #include "main.h" #include "stm32f4xx_hal.h" #include // DAC8568数据帧结构 (31-0位) // 31-28位: 前缀位 (PREFIX BITS) - 始终为0 // 27-24位: 命令位 (CONTROL BITS) // 23-20位: 地址位 (ADDRESS BITS) // 19-4位: 数据位 (DATA BITS) // 3-0位: 特征位 (FEATURE BITS) // DAC8568命令定义 (27-24位控制位) (参考数据手册第35-38页表4) #define CMD_WRITE_INPUT_REG 0b0000 // 写入输入寄存器 #define CMD_UPDATE_DAC_REG 0b0001 // 更新DAC寄存器 #define CMD_WRITE_INPUT_UPDATE_ALL 0b0010 // 写入所有输入寄存器并更新所有DAC寄存器 #define CMD_WRITE_INPUT_UPDATE_ONE 0b0011 // 写入单个输入寄存器并更新相应的DAC寄存器 #define CMD_POWER_DOWN 0b0100 // 电源模式控制 #define CMD_CLEAR_CODE_REG 0b0101 // 清除代码寄存器 #define CMD_LDAC_REG 0b0110 // LDAC寄存器控制 #define CMD_SOFTWARE_RESET 0b0111 // 软件复位 #define CMD_INTERNAL_REF 0b1000 // 内部参考控制 // DAC通道选择 (23-20位地址位) (参考数据手册第36页) #define CHANNEL_A 0b0000 // 通道A对应CH0 #define CHANNEL_B 0b0001 // 通道B对应CH4 #define CHANNEL_C 0b0010 // 通道C对应CH1 #define CHANNEL_D 0b0011 // 通道D对应CH5 #define CHANNEL_E 0b0100 // 通道E对应CH2 #define CHANNEL_F 0b0101 // 通道F对应CH6 #define CHANNEL_G 0b0110 // 通道G对应CH3 #define CHANNEL_H 0b0111 // 通道H对应CH7 #define BROADCAST 0b1111 // 广播模式(所有通道) // 电源模式定义 (特征位F1-F0) (参考数据手册第47页表13) #define POWER_UP 0b00 // 正常工作模式 #define POWER_DOWN_1K 0b01 // 关断模式,1K电阻接地 #define POWER_DOWN_100K 0b10 // 关断模式,100K电阻接地 #define POWER_DOWN_HIZ 0b11 // 关断模式,高阻态 // 内部参考控制 (特征位) (参考数据手册第44-45页) #define REF_DISABLE 0b0000 // 禁用内部参考 #define REF_ENABLE 0b0001 // 启用内部参考 #define REF_FLEX_MODE_ENABLE 0b0010 // 启用灵活模式 #define REF_FLEX_MODE_ALWAYS_ON 0b0011 // 灵活模式常开 #define REF_FLEX_MODE_ALWAYS_OFF 0b0100 // 灵活模式常关 // 清除代码控制 (特征位F1-F0) (参考数据手册第39页表5) #define CLEAR_CODE_ZERO_SCALE 0b00 // 清除为零刻度 #define CLEAR_CODE_MID_SCALE 0b01 // 清除为中间刻度 #define CLEAR_CODE_FULL_SCALE 0b10 // 清除为全刻度 #define CLEAR_CODE_NO_OPERATION 0b11 // 无操作 // 硬件相关定义 #define DAC8568_CS_GPIO_Port GPIOD #define DAC8568_CS_Pin GPIO_PIN_15 #define DAC8568_LDAC_GPIO_Port GPIOD #define DAC8568_LDAC_Pin GPIO_PIN_14 // 函数声明 void DAC8568_Init(SPI_HandleTypeDef *hspi); void DAC8568_Write(uint8_t channel, uint16_t data); void DAC8568_Update(uint8_t channel); void DAC8568_WriteAndUpdate(uint8_t channel, uint16_t data); void DAC8568_WriteAllChannels(uint16_t *data); void DAC8568_UpdateAllChannels(void); void DAC8568_SetPowerMode(uint8_t channel, uint8_t mode); void DAC8568_EnableStaticInternalRef(void); void DAC8568_DisableStaticInternalRef(void); void DAC8568_EnableFlexMode(void); void DAC8568_DisableFlexMode(void); void DAC8568_SetFlexModeRefAlwaysOn(uint8_t enable); void DAC8568_SetFlexModeRefAlwaysOff(uint8_t enable); void DAC8568_SetClearCode(uint8_t mode); void DAC8568_SoftwareReset(void); void DAC8568_SendRawCommand(uint8_t cmd_bits, uint8_t addr_bits, uint16_t data_bits, uint8_t feature_bits); void DAC8568_SendRawData(uint8_t raw_data[4]); #ifdef __cplusplus } #endif #endif /* DAC8568_H */