主题中讨论的其他器件:DAC81416
大家好!
我正在 处理一个项目、我尝试通过 SPI 通信使用 Arduino UNO R3控制 DAC81416芯片。 浏览过这些论坛后、我成功建立了通信和读/写寄存器。 但是、我在使用 DAC 时遇到了一些我无法解决的问题。
问题:
- 虽然写入/读取操作工作正常、但我无法更改 DAC 输出、这可能是编程错误。
- 在尝试找出问题时、我最终遇到了所有寄存器开始返回0x0000 而不是其预期值的情况。 我尝试恢复对代码的任何更改、但这未解决问题。
- 现在、读取寄存器返回0xFFFF、而不是0x0000。
设置:
电源配置:
- J7.3:GND
- J7.4和 J7.5:5V 电源
- J7.7:12V 电源
跳线配置:
- J2:开路
- J3:开路
- J9:关闭
- J10:2-3
- J11:1-2
- J12:1-2
SPI 引脚:
- J8.2:CS (Arduino 引脚10)
- J8.3:SDI (Arduino 引脚12)
- J8.4:SDO (Arduino 引脚11)
- J8.8:SCLK (Arduino 引脚13)
- J8.7:5V 电源
SPI 设置:
- SPI 时钟频率:4 MHz
- SPI 模式:CPOL = 0并且 CPHA = 1
- SPI 数据顺序:MSBFIRST
采取的故障排除步骤:
- 已重新检查连接并已验证电路板测试点上的电压。
- 已尝试使用软件和硬件方法复位 DAC、但未成功。
- 确保 CS 信号可适当切换。
- 通过尝试 打开/关闭内部基准来测试写入命令功能。 此操作通过将0x3F00写入 GENCONFIG 寄存器并移除 J11跳线来完成。 但是、没有任何变化的迹象、因为 VREF 总是 2.4-2.5V 电压。
- 由于可能存在热关断、因此尝试通过向触发寄存器写入0x0100来设置 ALM-RESET 位、但这没有任何变化。
- 将 SPI 引脚连接到示波器并检查数据传输是否正确进行。
意见和关切:
- 内部基准电压始终开启、即使下拉 RESET 信号也是如此。 根据数据表、复位器件应启动 POR 事件、之后器件处于断电模式、内部基准应断电。 然而,这一点没有被发现。
- ALMOUT 引脚读数为4V。 这是否表示热关断?
- SDI 很高、这就是我当前把所有内容读取为0xFFFF 的原因。 (请参考下面的屏幕截图)
示波器读数:
(只有3个探头,因此没有 CS )
[颜色代码: 蓝色- SCLK、 青色- SDO、 洋红色- SDI]
- 读取 DEVICEID 寄存器:
'
- 将0x0A84写入 SPIC138寄存器:
查询:
我不确定如何进一步调试此器件。 是否可能是我不小心损坏了芯片? 是否有其他方法可以验证我的写入操作是否正常工作?
我们非常感谢您对如何开展工作的任何见解或建议。 如果您需要任何其他信息、请告诉我。
提前感谢大家的支持和指导。
代码:
#include <Arduino.h>
#include <SPI.h>
// Registers
#define R_NOP 0x00
#define R_DEVICEID 0x01
#define R_STATUS 0x02
#define R_SPICONFIG 0x03
#define R_GENCONFIG 0x04
#define R_BRDCONFIG 0x05
#define R_SYNCCONFIG 0x06
#define R_TOGGCONFIG 0x07 // 0x07 to 0x08
#define R_DACPWDWN 0x09
#define R_DACRANGE 0x0A // 0x0A to 0x0D
#define R_TRIGGER 0x0E
#define R_BRDCAST 0x0F
#define R_DAC 0x10 // 0x10 to 0x1F
#define R_OFFSET 0x20 // 0x20 to 0x23
// Read Mask
#define READ_MASK 0x80
int cs_pin = 10;
int rst_pin = 4;
SPISettings spi_settings = SPISettings(1000000, MSBFIRST, SPI_MODE1);
SPIClass *spi = &SPI;
void cs_ON();
void cs_OFF();
void writeRegister(uint8_t reg, uint16_t wdata);
uint16_t readRegister(uint8_t reg);
void reset();
void setup() {
Serial.begin(115200);
pinMode(cs_pin, OUTPUT);
spi->begin();
cs_OFF();
writeRegister(R_SPICONFIG, 0x0A84);
writeRegister(R_GENCONFIG, 0x3F00);
}
void loop() {
readRegister(R_DEVICEID);
}
inline void cs_ON() {
digitalWrite(cs_pin, LOW);
}
inline void cs_OFF() {
digitalWrite(cs_pin, HIGH);
}
// void reset() {
// // Reset through HW
// if (rst_pin != -1) {
// digitalWrite(rst_pin, LOW);
// delay(10);
// digitalWrite(rst_pin, HIGH);
// delay(1);
// }
// // Reset through SW
// else {
// writeRegister(R_TRIGGER, 0x000A);
// delay(10);
// writeRegister(R_TRIGGER, 0x0000);
// delay(1);
// }
// }
void writeRegister(uint8_t reg, uint16_t wdata) {
uint8_t lsb = (uint8_t) wdata;
uint8_t msb = (uint8_t) (wdata >> 8);
spi->beginTransaction(spi_settings);
cs_ON();
spi->transfer(reg); // 23: W bit, 22: X, 22-16: Register Address
spi->transfer(msb); // 15-8: 8 MSBs of the data
spi->transfer(lsb); // 7-0: 8 LSBs of the data
cs_OFF();
spi->endTransaction();
}
uint16_t readRegister(uint8_t reg) {
uint8_t echo, msb, lsb;
// SDI
spi->beginTransaction(spi_settings);
cs_ON();
spi->transfer(READ_MASK | reg); // 23: R bit, 22: X, 22-16: Register Address
spi->transfer(0x00);
spi->transfer(0x00);
cs_OFF();
// SDO
cs_ON();
echo = spi->transfer(0x00);
msb = spi->transfer(0x00);
lsb = spi->transfer(0x00);
cs_OFF();
spi->endTransaction();
// Serial.println(echo, HEX);
uint16_t res = (msb << 8) | lsb;
return res;
}
