STM32F411 + adau1467 нет связи

Добрый день всем! Не знаю есть ли тут кто то , кто работал с 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:

  1. Check power supply (3.3V) to ADAU1467
  2. Check GND connection between STM32 and ADAU1467
  3. Check SCL and SDA connections:
    PB6 (SCL) → ADAU1467 SCL
    PB7 (SDA) → ADAU1467 SDA
  4. Add pull-up resistors (4.7k) on SDA and SCL to 3.3V
  5. Verify I2C address (should be 0x38)
  6. Check ADDR0 and ADDR1 pins on ADAU1467:
    Both LOW = 0x38, ADDR0 HIGH = 0x39
  7. Try different I2C speeds (100kHz, 400kHz)
    SCL and SDA LOW - should be 0V

Подключение как в коде

I2C_SCL_PIN PB6

I2C_SDA_PIN PB7

Вроде как данный тест не использует никаких спец библиотек и пр, в чем может быть проблема?

Сама adau живая и через программатор нормально шьется.

I2cscanner видит его ?

его это stm?

adau.

есть logic analyzer, им смотреть?

Скрипт есть - i2c scanner показывает адреса девайсов на шине

поищу, поставлю, отпишусь

сканирую…

Отсканируешь - телеграмму черкани ))

обязательно :))

Вот подключение, сканнер ничего не нашел. Заблудился в 3-х проводах :slight_smile:

там же 127 адресов. уже пошла 477 строка…

То то и оно …

а есть такой сканнер на spi порты?

Попрьбовать с другим i2c устройством - что бы понять там ли рабочая шина сейчас …

В spi активное устройство выбирается CS !

попробую другую плату подключить, вечером отпишусь

А питание то на плате есть, что-то как-то странненько подключено?!

да странненько подключено)

“Энто оптический обман здрения”(с) Там, кстати на ней перемычек как собак.

ну не настолько, что пины с другой стороны :rofl: