Добрый день всем! Не знаю есть ли тут кто то , кто работал с adau дсп процессорами, но спрошу.
Есть тестовый код для проверки соединения - конкретно ниже на проверку I2C, соединения нет.
/*
* File: ADAU1467_I2C_DIAGNOSTIC.ino (ИСПРАВЛЕННАЯ ВЕРСИЯ)
*
* Description: I2C Diagnostic tool for STM32F411 + ADAU1467
* Проверка подключения по I2C
*/
#include <Arduino.h>
#include <Wire.h>
// --- I2C ПИНЫ ДЛЯ STM32F411 ---
// I2C1: PB6 = SCL, PB7 = SDA (стандартные пины)
#define I2C_SCL_PIN PB6
#define I2C_SDA_PIN PB7
// --- АДРЕС ADAU1467 ---
// Стандартный 7-битный адрес: 0x38
#define ADAU1467_I2C_ADDR_7BIT 0x38
// --- ПИНЫ УПРАВЛЕНИЯ ---
#define DSP_RESET_PIN PA0
#define LED_PIN PC13
// --- ПРОТОТИПЫ ФУНКЦИЙ ---
void scanI2CBus();
bool checkADAU1467();
void resetDSP();
bool readRegister(uint16_t address, uint8_t* data, uint8_t length);
bool writeRegister(uint16_t address, uint8_t* data, uint8_t length);
void blinkLED(int times, int delayMs);
void setup() {
delay(1000);
Serial.begin(115200);
Serial.println(F("\n╔════════════════════════════════════════╗"));
Serial.println(F("║ ADAU1467 I2C Diagnostic Tool ║"));
Serial.println(F("║ STM32F411 + ADAU1467 ║"));
Serial.println(F("╚════════════════════════════════════════╝\n"));
// Инициализация LED
pinMode(LED_PIN, OUTPUT);
digitalWrite(LED_PIN, HIGH); // LED выключен
// Инициализация RESET пина
pinMode(DSP_RESET_PIN, OUTPUT);
digitalWrite(DSP_RESET_PIN, HIGH);
// --- ТЕСТ 1: Проверка пинов I2C ---
Serial.println(F("TEST 1: I2C Pin Configuration"));
Serial.print(F("SCL pin: PB"));
Serial.println(I2C_SCL_PIN == PB6 ? 6 : 10);
Serial.print(F("SDA pin: PB"));
Serial.println(I2C_SDA_PIN == PB7 ? 7 : 11);
// Настройка пинов I2C
pinMode(I2C_SCL_PIN, OUTPUT);
pinMode(I2C_SDA_PIN, OUTPUT);
// Проверка напряжения на пинах
Serial.println(F("\nTesting I2C pins (check with multimeter):"));
digitalWrite(I2C_SCL_PIN, HIGH);
digitalWrite(I2C_SDA_PIN, HIGH);
Serial.println(F("SCL and SDA HIGH - should be 3.3V"));
delay(2000);
digitalWrite(I2C_SCL_PIN, LOW);
digitalWrite(I2C_SDA_PIN, LOW);
Serial.println(F("SCL and SDA LOW - should be 0V"));
delay(2000);
digitalWrite(I2C_SCL_PIN, HIGH);
digitalWrite(I2C_SDA_PIN, HIGH);
// --- ТЕСТ 2: Инициализация I2C ---
Serial.println(F("\nTEST 2: I2C Initialization"));
Wire.setSCL(I2C_SCL_PIN);
Wire.setSDA(I2C_SDA_PIN);
Wire.begin();
// Устанавливаем скорость I2C
Wire.setClock(100000); // 100 kHz - стандартная скорость
Serial.println(F("I2C initialized"));
Serial.println(F("I2C Clock set to 100 kHz (standard)"));
// --- ТЕСТ 3: Сканирование I2C шины ---
Serial.println(F("\nTEST 3: Scanning I2C bus..."));
scanI2CBus();
// --- ТЕСТ 4: Сброс DSP ---
Serial.println(F("\nTEST 4: Resetting DSP..."));
resetDSP();
// --- ТЕСТ 5: Проверка ADAU1467 ---
Serial.println(F("\nTEST 5: Checking ADAU1467 at address 0x38..."));
if (checkADAU1467()) {
Serial.println(F("\n[SUCCESS] ADAU1467 found on I2C bus!"));
digitalWrite(LED_PIN, LOW); // LED горит = успех
// --- ТЕСТ 6: Чтение регистров ---
Serial.println(F("\nTEST 6: Reading ADAU1467 registers..."));
uint16_t registers[] = {0xF000, 0xF001, 0xF002, 0xF003, 0xF004, 0xF005};
const char* regNames[] = {
"PLL_CTRL0", "PLL_CTRL1", "DSP_CORE_CTRL",
"SOFT_RESET", "DEVICE_ID", "SAFELOAD_CTRL"
};
for (int i = 0; i < 6; i++) {
uint8_t data[4] = {0};
if (readRegister(registers[i], data, 4)) {
uint32_t value = ((uint32_t)data[0] << 24) |
((uint32_t)data[1] << 16) |
((uint32_t)data[2] << 8) |
(uint32_t)data[3];
Serial.print(F("Register 0x"));
Serial.print(registers[i], HEX);
Serial.print(F(" ("));
Serial.print(regNames[i]);
Serial.print(F("): 0x"));
Serial.println(value, HEX);
} else {
Serial.print(F("Failed to read register 0x"));
Serial.println(registers[i], HEX);
}
delay(10);
}
// --- ТЕСТ 7: Проверка записи/чтения ---
Serial.println(F("\nTEST 7: Write/Read test..."));
// Читаем текущее значение SOFT_RESET
uint8_t originalData[4] = {0};
if (readRegister(0xF003, originalData, 4)) {
uint32_t origValue = ((uint32_t)originalData[0] << 24) |
((uint32_t)originalData[1] << 16) |
((uint32_t)originalData[2] << 8) |
(uint32_t)originalData[3];
Serial.print(F("Original SOFT_RESET: 0x"));
Serial.println(origValue, HEX);
// Записываем тестовое значение (не сбрасываем DSP!)
uint8_t testData[4] = {0x00, 0x00, 0x00, 0x00};
if (writeRegister(0xF003, testData, 4)) {
Serial.println(F("Write test: OK"));
// Читаем обратно
uint8_t readBack[4] = {0};
if (readRegister(0xF003, readBack, 4)) {
uint32_t readValue = ((uint32_t)readBack[0] << 24) |
((uint32_t)readBack[1] << 16) |
((uint32_t)readBack[2] << 8) |
(uint32_t)readBack[3];
Serial.print(F("Read back: 0x"));
Serial.println(readValue, HEX);
}
// Восстанавливаем оригинальное значение
writeRegister(0xF003, originalData, 4);
Serial.println(F("Original value restored"));
}
}
Serial.println(F("\n=== I2C DIAGNOSTIC COMPLETE - DSP OK ==="));
} else {
Serial.println(F("\n[ERROR] ADAU1467 not found on I2C bus!"));
Serial.println(F("\nTroubleshooting:"));
Serial.println(F("1. Check power supply (3.3V) to ADAU1467"));
Serial.println(F("2. Check GND connection between STM32 and ADAU1467"));
Serial.println(F("3. Check SCL and SDA connections:"));
Serial.println(F(" PB6 (SCL) -> ADAU1467 SCL"));
Serial.println(F(" PB7 (SDA) -> ADAU1467 SDA"));
Serial.println(F("4. Add pull-up resistors (4.7k) on SDA and SCL to 3.3V"));
Serial.println(F("5. Verify I2C address (should be 0x38)"));
Serial.println(F("6. Check ADDR0 and ADDR1 pins on ADAU1467:"));
Serial.println(F(" Both LOW = 0x38, ADDR0 HIGH = 0x39"));
Serial.println(F("7. Try different I2C speeds (100kHz, 400kHz)"));
// Мигаем LED для индикации ошибки
while (1) {
blinkLED(3, 100);
delay(1000);
}
}
}
void loop() {
// Основной цикл - мигаем LED
blinkLED(1, 500);
delay(2000);
}
/**
* @brief Сканирование I2C шины
*/
void scanI2CBus() {
byte error, address;
int devices = 0;
Serial.println(F("Scanning I2C bus..."));
// Пробуем разные скорости
uint32_t speeds[] = {100000, 400000};
const char* speedNames[] = {"100 kHz", "400 kHz"};
for (int s = 0; s < 2; s++) {
Wire.setClock(speeds[s]);
Serial.print(F("Speed: "));
Serial.println(speedNames[s]);
devices = 0;
for (address = 1; address < 127; address++) {
Wire.beginTransmission(address);
error = Wire.endTransmission();
if (error == 0) {
Serial.print(F(" Device found at 7-bit address 0x"));
Serial.println(address, HEX);
devices++;
}
}
if (devices == 0) {
Serial.println(F(" No I2C devices found"));
} else {
Serial.print(F(" Found "));
Serial.print(devices);
Serial.println(F(" device(s)"));
break; // Нашли устройства - дальше не сканируем
}
}
}
/**
* @brief Проверка наличия ADAU1467 на I2C шине
*/
bool checkADAU1467() {
Serial.print(F("Trying 7-bit address 0x"));
Serial.println(ADAU1467_I2C_ADDR_7BIT, HEX);
// Попытка связи
Wire.beginTransmission(ADAU1467_I2C_ADDR_7BIT);
byte error = Wire.endTransmission();
if (error == 0) {
Serial.println(F("[OK] ADAU1467 responded!"));
return true;
} else {
Serial.print(F("[ERROR] I2C error code: "));
Serial.println(error);
switch(error) {
case 1: Serial.println(F(" Data too long")); break;
case 2: Serial.println(F(" NACK on address transmit")); break;
case 3: Serial.println(F(" NACK on data transmit")); break;
case 4: Serial.println(F(" Unknown error")); break;
case 5: Serial.println(F(" Timeout")); break;
default: Serial.println(F(" Unknown code")); break;
}
// Пробуем другие возможные адреса
byte altAddresses[] = {0x39, 0x3A, 0x3B, 0x68, 0x69};
for (int i = 0; i < 5; i++) {
Wire.beginTransmission(altAddresses[i]);
error = Wire.endTransmission();
if (error == 0) {
Serial.print(F("[OK] Found at address 0x"));
Serial.println(altAddresses[i], HEX);
return true;
}
}
return false;
}
}
/**
* @brief Сброс DSP
*/
void resetDSP() {
Serial.println(F("Performing DSP reset..."));
digitalWrite(DSP_RESET_PIN, LOW);
delay(10);
digitalWrite(DSP_RESET_PIN, HIGH);
delay(100);
Serial.println(F("Reset complete"));
}
/**
* @brief Чтение регистра ADAU1467 по I2C
*/
bool readRegister(uint16_t address, uint8_t* data, uint8_t length) {
// Формат I2C для ADAU1467:
// [START][I2C_ADDR + W][REG_ADDR_H][REG_ADDR_L][RESTART][I2C_ADDR + R][DATA...][STOP]
Wire.beginTransmission(ADAU1467_I2C_ADDR_7BIT);
Wire.write((address >> 8) & 0xFF); // Старший байт адреса
Wire.write(address & 0xFF); // Младший байт адреса
byte error = Wire.endTransmission(false); // Не отправляем STOP
if (error != 0) {
return false;
}
// Запрашиваем данные
Wire.requestFrom(ADAU1467_I2C_ADDR_7BIT, length);
uint32_t timeout = millis();
while (Wire.available() < length) {
if (millis() - timeout > 100) {
Serial.println(F("Timeout reading data"));
return false;
}
}
for (int i = 0; i < length; i++) {
data[i] = Wire.read();
}
return true;
}
/**
* @brief Запись в регистр ADAU1467 по I2C
*/
bool writeRegister(uint16_t address, uint8_t* data, uint8_t length) {
Wire.beginTransmission(ADAU1467_I2C_ADDR_7BIT);
Wire.write((address >> 8) & 0xFF); // Старший байт адреса
Wire.write(address & 0xFF); // Младший байт адреса
for (int i = 0; i < length; i++) {
Wire.write(data[i]);
}
byte error = Wire.endTransmission();
return (error == 0);
}
/**
* @brief Мигание LED
*/
void blinkLED(int times, int delayMs) {
for (int i = 0; i < times; i++) {
digitalWrite(LED_PIN, LOW);
delay(delayMs);
digitalWrite(LED_PIN, HIGH);
if (i < times - 1) delay(delayMs);
}
}
Вывод serial:
Спойлер
SCL and SDA LOW - should be 0V
TEST 2: I2C Initialization
I2C initialized
I2C Clock set to 100 kHz (standard)
TEST 3: Scanning I2C bus…
Scanning I2C bus…
Speed: 100 kHz
No I2C devices found
Speed: 400 kHz
No I2C devices found
TEST 4: Resetting DSP…
Performing DSP reset…
Reset complete
TEST 5: Checking ADAU1467 at address 0x38…
Trying 7-bit address 0x38
[ERROR] I2C error code: 2
NACK on address transmit
[ERROR] ADAU1467 not found on I2C bus!
Troubleshooting:
- Check power supply (3.3V) to ADAU1467
- Check GND connection between STM32 and ADAU1467
- Check SCL and SDA connections:
PB6 (SCL) → ADAU1467 SCL
PB7 (SDA) → ADAU1467 SDA - Add pull-up resistors (4.7k) on SDA and SCL to 3.3V
- Verify I2C address (should be 0x38)
- Check ADDR0 and ADDR1 pins on ADAU1467:
Both LOW = 0x38, ADDR0 HIGH = 0x39 - Try different I2C speeds (100kHz, 400kHz)
SCL and SDA LOW - should be 0V
Подключение как в коде
I2C_SCL_PIN PB6
I2C_SDA_PIN PB7
Вроде как данный тест не использует никаких спец библиотек и пр, в чем может быть проблема?
Сама adau живая и через программатор нормально шьется.



