TI论坛
直播中

张娟

7年用户 2065经验值
私信 关注
[问答]

DAC8830与STM8S103使用SPI通信时,输出电压满偏或者为0.能提供讲解或者源码吗?


  • DAC8830与STM8S103使用SPI通信时,输出电压满偏或者为0.能提供讲解或者源码吗

回帖(3)

夏日余晖

前天 11:40

您好,

您是单极性输出应用是吗?您可以附上电路图吗,包括VREF和输出buffer电路?

很抱歉没有源码提供给您,下面截图是DAC8830通信时序图:


DAC作为SPI总线从设备工作,总线主控生成同步时钟SCLK并启动传输。当CS为高电平时不能访问DAC,并忽略时钟SCLK信号和串行输入数据SDI。总线主控通过驱动引脚CS

LOW来访问DAC,在CS从高到低转换之后,SDI pin上的串行输入数据立即从主控SCLK下降沿移出,并在SCLK上升沿锁定到输入移位寄存器(input

shift register)。CS的低到高转换将输入移位寄存器的内容传输到输入寄存器(input

register)。所有数据寄存器均为16位。需要16个SCLK时钟将一个数据字传输到设备。要完成整个数据字,必须在16个SCLK计时后立即将CS设置为高。如果在CS的低电平期间应用了超过16个SCLK,则最后16位将被传输到输入寄存器。但是,如果在整个16个SCLK周期内CS不保持低电平,则数据会损坏。在这种情况下,请使用新的16位字重新加载DAC。

在DAC8830中,输入寄存器加载后,输入寄存器的内容会立即传输到DAC latch 中,同时更新DAC输出。


举报

河神大人

前天 11:40

请确认

DAC8830供电电压在2.7V ~ 5.5V之间,且基准电压VREF在1.25V ~VDD之间。

另外,IO_VDD电压是多少?OPA2277供电电压是多少?

也建议您附上写入输入寄存器(input

register)16bit 数据的SPI时序图,以查看波形质量和通信时序是否正常。


举报

任凭风吹

前天 17:03
DAC8830 是一款 8 位数字模拟转换器(DAC),而 STM8S103 是一款 8 位微控制器。要实现 DAC8830 与 STM8S103 之间的 SPI 通信,我们需要按照以下步骤进行:

1. 硬件连接:
   - 将 DAC8830 的 VDD 引脚连接到 STM8S103 的 5V 电源。
   - 将 DAC8830 的 GND 引脚连接到 STM8S103 的地线。
   - 将 DAC8830 的 CS(片选)引脚连接到 STM8S103 的一个 GPIO 引脚(例如 PA1)。
   - 将 DAC8830 的 SCLK(时钟)引脚连接到 STM8S103 的一个 GPIO 引脚(例如 PA2)。
   - 将 DAC8830 的 SDI(数据输入)引脚连接到 STM8S103 的一个 GPIO 引脚(例如 PA3)。
   - 将 DAC8830 的 VOUT 引脚连接到一个电压表或示波器,以观察输出电压。

2. 软件配置:
   - 配置 STM8S103 的 GPIO 引脚为 SPI 模式。
   - 配置 SPI 接口的时钟频率、CPOL 和 CPHA 参数。

3. 编写代码:
   - 初始化 SPI 接口。
   - 编写一个函数,将 8 位数字值写入 DAC8830,以设置输出电压。

以下是 STM8S103 的示例代码:

```c
#include "stm8s.h"

// 定义引脚
#define CS_PIN PA1
#define SCLK_PIN PA2
#define SDI_PIN PA3

// 初始化 SPI 接口
void SPI_Init(void) {
    // 配置 GPIO 引脚
    PA_DDR |= 0x0E; // 设置 PA1、PA2 和 PA3 为输出
    PA_CR1 |= 0x0E; // 设置 PA1、PA2 和 PA3 为推挽输出

    // 配置 SPI 接口
    SPI_CR1 = 0x00; // 禁用 SPI
    SPI_CR2 = 0x00; // 禁用 NSS 管理,设置时钟频率为 f_PCLK/2
    SPI_ICR = 0x0A; // 设置 CPOL = 0,CPHA = 0
    SPI_SR = 0x00;  // 清除 SPI 状态寄存器
    SPI_CR1 = 0x02; // 启用 SPI
}

// 将 8 位数字值写入 DAC8830
void DAC_Write(uint8_t value) {
    // 使能 CS 引脚
    CS_PIN = 0;

    // 发送 8 位数据
    for (uint8_t i = 0; i < 8; i++) {
        SDI_PIN = (value & (0x80 >> i)) ? 1 : 0;
        SCLK_PIN = 1;
        SCLK_PIN = 0;
    }

    // 禁用 CS 引脚
    CS_PIN = 1;
}

int main(void) {
    // 初始化 SPI 接口
    SPI_Init();

    // 设置输出电压为满偏
    DAC_Write(0xFF);

    // 设置输出电压为 0
    DAC_Write(0x00);

    while (1) {
        // 循环设置输出电压
        for (uint8_t i = 0; i < 256; i++) {
            DAC_Write(i);
            // 延时
            for (uint16_t j = 0; j < 10000; j++);
        }
    }
}
```

这段代码首先初始化 SPI 接口,然后通过 DAC_Write 函数将 8 位数字值写入 DAC8830。在 main 函数中,我们循环设置输出电压,从 0 到满偏(0xFF),然后回到 0。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分