RadiatoR 2 10 мая, 2019 Опубликовано 10 мая, 2019 · Жалоба Всем доброго дня!. Собственно сабж. Имею данную отладочную плату, на ней установлен этот DAC. Никак не могу установить с ним соединение по I2C. Отправляю ему адрес 0x4A (он же 0x94 на запись или 0x97 на чтение) - в ответ NACK. Смотрю осциллограмму - все хорошо. Reset снимаю, передачу начинаю через пару мс (в ДШ не ранее 500нс). Пытаюсь элементарно прочитать ID чипа, но увы, даже на I2C адрес не дает ACK. Перебрал все адреса ((0 - 127) << 1) - все равно не дает ACK. Стандартный пример с записью звука на флешку и проигрыш с нее что-то не запахал (где-то usb отваливается, а инициализация DAC идет после стабильного старта usb), но к нему у меня особо интереса нет. Сейчас его откоррекчу и стартану инициализацию до usb, но, чувствую, вряд ли заведется... Может есть что-то чего я в ДШ не заметил? Или может чип ушел на покой? Есть какие-нибудь мысли? Спс. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RadiatoR 2 10 мая, 2019 Опубликовано 10 мая, 2019 · Жалоба PS. Увы =(, что и следовало ожидать - инициализация DAC в примере такая же как и у меня и ответ на адрес тоже NACK. Видимо чип устал... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 131 11 мая, 2019 Опубликовано 11 мая, 2019 · Жалоба В 10.05.2019 в 07:10, RadiatoR сказал: Никак не могу установить с ним соединение по I2C. Отправляю ему адрес 0x4A (он же 0x94 на запись или 0x97 на чтение) - в ответ NACK. Что значит "отправляю ему адрес 0x4A (он же 0x94 на запись или 0x97 на чтение)"? У микросхемы есть вполне конкретный адрес: 0x94. И с чего это вдруг на чтение адрес стал 0x97? На запись адрес будет 0x94, на чтение 0x95. И не надо их никуда сдвигать - эти адреса надо передавать прямо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
k155la3 26 11 мая, 2019 Опубликовано 11 мая, 2019 · Жалоба 1. Проверьте частоту SCL - может зашкалило. 2. Проверьте, не перепутаны ли SDA SCL 3. Для проверки - отключите аппаратно все девайсы с шины I2C, кроме "кролика". 4. Проверьте ВСЕ сигналы, особено RESET (если есть) напредмет отсутствия блокировки чипа. Наличие тактирования чипа итп итд ps 5. Состояние входа AD0 в байте адреса учтено ? Quote To communicate with the CS43L22, the chip address field, which is the first byte sent to the CS43L22, should match 100101 followed by the setting of the AD0 pin. Даташит достаточно большой, но подробный. Надо "раскуривать" как следует. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
HardEgor 62 11 мая, 2019 Опубликовано 11 мая, 2019 · Жалоба 4 часа назад, Arlleex сказал: Что значит "отправляю ему адрес 0x4A (он же 0x94 на запись или 0x97 на чтение)"? У микросхемы есть вполне конкретный адрес: 0x94. И с чего это вдруг на чтение адрес стал 0x97? С того что в разных библиотеках по разному понимают, где-то нормально принимают 7-битный 0x4А, а где-то только 8-битный 0x94 (или 0x95) Другой вопрос что вывод AD0 может переключить чип на другой адрес - 7-битный 0x4В и 8-битный 0x96 (или 0x97) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 131 11 мая, 2019 Опубликовано 11 мая, 2019 · Жалоба 53 минуты назад, HardEgor сказал: С того что в разных библиотеках по разному понимают, где-то нормально принимают 7-битный 0x4А, а где-то только 8-битный 0x94 (или 0x95) Другой вопрос что вывод AD0 может переключить чип на другой адрес - 7-битный 0x4В и 8-битный 0x96 (или 0x97) Ну, какую там ТС библиотеку прикрутил, мне неведомо. Адрес I2C конкретно в этой микросхеме всегда 7-битный. А LSB этого адреса является pin-defined (заведен на AD0). Поэтому полные адреса (с учетом бита чтения/записи) будут такими: 0x94, 0x95 - запись/чтение при AD0 = 0; 0x96, 0x97 - запись/чтение при AD0 = 1. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
k155la3 26 11 мая, 2019 Опубликовано 11 мая, 2019 · Жалоба Судя по "инсайдерской информации", что ТС использует "отладочную плату", на которой установлен DAC, "ставлю" на то, что на чип не подан какой-нибудь внешний сигнал из управляющего контроллера или периферии, например MCLK : ) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
HardEgor 62 11 мая, 2019 Опубликовано 11 мая, 2019 · Жалоба 2 часа назад, Arlleex сказал: Адрес I2C конкретно в этой микросхеме всегда 7-битный. Адрес I2C "конкретно" всегда 7-битный, редко-редко встречается расширение до 10-бит. 1 час назад, k155la3 сказал: Судя по "инсайдерской информации", что ТС использует "отладочную плату", на которой установлен DAC, "ставлю" на то, что на чип не подан какой-нибудь внешний сигнал из управляющего контроллера или периферии, например MCLK : ) В таком случае логично исследовать код для отладочной платы, чтобы посмотреть как там инициализируется DAC. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RadiatoR 2 12 мая, 2019 Опубликовано 12 мая, 2019 · Жалоба 11 hours ago, k155la3 said: "ставлю" на то, что на чип не подан какой-нибудь внешний сигнал из управляющего контроллера или периферии, например MCLK : ) Ставка зашла на 100%! =) Разве MCLK нужен для работы I2C? Я его не стартовал. Думал по I2C достучусь и дальше продолжу инициализацию... Частота I2C ~5.6kHz, SCL, SDA не перепутаны, т.к. это отладка, то AD0 висит на земле. I2C должен работать до подключения MCLK (кстати, в примере от ST тоже сначала идет общение по I2C). Из ДШ: Адрес 10010100 - write, 10010101 - read. Тот, что пишется в DR. Ну тут все стандартно. Про 0x97 что-то с головы взялось пока писал, обшибся в сообщении (в коде все норм). На счет библиотек - никогда не любил ничего кроме работы с регистрами. Есть свои либы, которые написаны, отлажены и работают. Сейчас попробую подрубить MCLK Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
k155la3 26 12 мая, 2019 Опубликовано 12 мая, 2019 · Жалоба 29 minutes ago, RadiatoR said: . . . . На счет библиотек - никогда не любил ничего кроме работы с регистрами. Есть свои либы, которые написаны, отлажены и работают. . . . Работаете через HAL ? В чужих библиотеках есть "своя прелесть" Это как у писателей: "Чтобы написать одну свою книгу надо прочитать целую библиотеку" (не могу вспомнить кто сказал, но видать был хорошим программистом). Итак, интрига есть. ЖЖЖЖдем ! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RadiatoR 2 12 мая, 2019 Опубликовано 12 мая, 2019 · Жалоба Нет, как раз наоборот. Чтобы не выгребать чужие грабли все интерфейсы поднимаю сам по пути разбираясь как они работают. Мне так удобно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 119 12 мая, 2019 Опубликовано 12 мая, 2019 · Жалоба Пришла пора раскрыть интригу и рассказать о вашей программе. А то может вы реализуете программный I2C ногодрыгом и вместо выставляете "честную" единицу на выход вместо использования открытого стока или перевода ноги на чтение во время ACKа. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RadiatoR 2 12 мая, 2019 Опубликовано 12 мая, 2019 · Жалоба PS. Думаю MCLK действительно не нужен для работы I2C, т.к. на отладке он подключен к I2S_MCLK, а он в свою очередь работает только при передаче данных из DR. То есть после записи в DR. В момент инициализации мы, естественно, ничего не передаем. Собственно ДШ это и описывает. Выходит проблема не в тактировании MCLK. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RadiatoR 2 12 мая, 2019 Опубликовано 12 мая, 2019 · Жалоба Так программы то и нет как таковой. Инициализировал микрофон, он работает как надо. Тактирование идет, данные идут, все ок. Далее пытаюсь инитить DAC: bool I2Ct::setReg(byte addr, byte reg) { while((I2C1->SR2 & I2C_SR2_BUSY) > 0); I2C1->CR1 &= ~I2C_CR1_STOP;// clear STOP bit I2C1->SR1 &= ~I2C_SR1_AF; I2C1->CR1 |= I2C_CR1_START;// start bit generations while(!(I2C1->SR1 & I2C_SR1_SB)); I2C1->DR = addr << 1;// address + w ushort status; do status = I2C1->SR1; while(!(status & (I2C_SR1_ADDR | I2C_SR1_AF))); bool valid = (status & I2C_SR1_AF) ? false : true; if(valid) { (void) I2C1->SR1; (void) I2C1->SR2; while(!(I2C1->SR1 & I2C_SR1_TXE)); I2C1->DR = reg; while(!(I2C1->SR1 & I2C_SR1_BTF)); } I2C1->CR1 |= I2C_CR1_STOP; return valid; } CS43L22::CS43L22() : I2C { RCC->AHB1ENR |= RCC_AHB1ENR_GPIODEN; GPIOD->MODER |= MODERset(4, ModeOut); incr = 0x80; GPIOsetPin(GPIOD, 4);//Reset pin } CS43L22 audioModule; int main() { I2S2init(); I2S3init(); delay(100000); audioModule.setReg(id, 0x80); while(1); } И вижу следующую осциллограмму: Ножка Reset на 3,3в (бирюзовый уровень внизу графика) Вот такие дела. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RadiatoR 2 12 мая, 2019 Опубликовано 12 мая, 2019 · Жалоба PS. При включенном постоянном MCLK (если I2S3 перевести в режим master receive, то clock будет постоянно работать без необходимости записи в DR) все равно чип не опрашивается по I2C Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться