Перейти к содержанию
    

CS43L22 (на плате STM32F4DISCOVERY) выдает NACK на I2C

Всем доброго дня!.

Собственно сабж. Имею данную отладочную плату, на ней установлен этот DAC.

Никак не могу установить с ним соединение по I2C. Отправляю ему адрес 0x4A (он же 0x94 на запись или 0x97 на чтение) - в ответ NACK.

Смотрю осциллограмму - все хорошо. Reset снимаю, передачу начинаю через пару мс (в ДШ не ранее 500нс). Пытаюсь элементарно прочитать ID чипа, но увы, даже на I2C адрес не дает ACK.

Перебрал все адреса ((0 - 127) << 1) - все равно не дает ACK.

Стандартный пример с записью звука на флешку и проигрыш с нее что-то не запахал (где-то usb отваливается, а инициализация DAC идет после стабильного старта usb), но к нему у меня особо интереса нет.

Сейчас его откоррекчу и стартану инициализацию до usb, но, чувствую, вряд ли заведется...

Может есть что-то чего я в ДШ не заметил? Или может чип ушел на покой?

Есть какие-нибудь мысли?

Спс.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

PS. Увы =(, что и следовало ожидать - инициализация DAC в примере такая же как и у меня и ответ на адрес тоже NACK. Видимо чип устал...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В 10.05.2019 в 07:10, RadiatoR сказал:

Никак не могу установить с ним соединение по I2C. Отправляю ему адрес 0x4A (он же 0x94 на запись или 0x97 на чтение) - в ответ NACK.

Что значит "отправляю ему адрес 0x4A (он же 0x94 на запись или 0x97 на чтение)"?

У микросхемы есть вполне конкретный адрес: 0x94. И с чего это вдруг на чтение адрес стал 0x97?

На запись адрес будет 0x94, на чтение 0x95. И не надо их никуда сдвигать - эти адреса надо передавать прямо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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.

Даташит достаточно большой, но подробный. Надо "раскуривать" как следует.

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

4 часа назад, Arlleex сказал:

Что значит "отправляю ему адрес 0x4A (он же 0x94 на запись или 0x97 на чтение)"?

У микросхемы есть вполне конкретный адрес: 0x94. И с чего это вдруг на чтение адрес стал 0x97?

С того что в разных библиотеках по разному понимают, где-то нормально принимают 7-битный 0x4А, а где-то только  8-битный 0x94 (или 0x95)

Другой вопрос что вывод AD0 может переключить чип на другой адрес - 7-битный 0x4В и  8-битный 0x96 (или 0x97)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Судя по "инсайдерской информации", что ТС использует "отладочную плату", на которой установлен DAC, 

"ставлю" на то, что на чип не подан какой-нибудь внешний сигнал из управляющего контроллера или периферии, например MCLK  )

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 часа назад, Arlleex сказал:

Адрес I2C конкретно в этой микросхеме всегда 7-битный.

Адрес I2C "конкретно" всегда 7-битный, редко-редко встречается расширение до 10-бит.

 

1 час назад, k155la3 сказал:

Судя по "инсайдерской информации", что ТС использует "отладочную плату", на которой установлен DAC, 

"ставлю" на то, что на чип не подан какой-нибудь внешний сигнал из управляющего контроллера или периферии, например MCLK  )

В таком случае логично исследовать код для отладочной платы, чтобы посмотреть как там инициализируется DAC.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

11 hours ago, k155la3 said:

"ставлю" на то, что на чип не подан какой-нибудь внешний сигнал из управляющего контроллера или периферии, например MCLK  )

Ставка зашла на 100%! =)

Разве MCLK нужен для работы I2C? Я его не стартовал. Думал по I2C достучусь и дальше продолжу инициализацию...

Частота I2C ~5.6kHz, SCL, SDA не перепутаны, т.к. это отладка, то AD0 висит на земле. I2C должен работать до подключения MCLK (кстати, в примере от ST тоже сначала идет общение по I2C). Из ДШ:

Clip2net_190512083833.thumb.jpg.579173407c5c9a44c71e327187c2d6c7.jpg

Адрес 10010100 - write,  10010101 - read. Тот, что пишется в DR. Ну тут все стандартно. Про 0x97 что-то с головы взялось пока писал, обшибся в сообщении (в коде все норм).

На счет библиотек - никогда не любил ничего кроме работы с регистрами. Есть свои либы, которые написаны, отлажены и работают.

 

Сейчас попробую подрубить MCLK

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

29 minutes ago, RadiatoR said:

. . . . На счет библиотек - никогда не любил ничего кроме работы с регистрами. Есть свои либы, которые написаны, отлажены и работают. . . .

Работаете через HAL ? 

В чужих библиотеках есть "своя прелесть" :biggrin:

Это как у писателей: "Чтобы написать одну свою книгу надо прочитать целую библиотеку" (не могу вспомнить кто сказал, но видать был хорошим программистом).

Итак, интрига есть. ЖЖЖЖдем !

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Нет, как раз наоборот. Чтобы не выгребать чужие грабли все интерфейсы поднимаю сам по пути разбираясь как они работают. Мне так удобно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Пришла пора раскрыть интригу и рассказать о вашей программе. А то может вы реализуете программный I2C ногодрыгом и вместо выставляете "честную" единицу на выход вместо использования открытого стока или перевода ноги на чтение во время ACKа.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

PS. Думаю MCLK действительно не нужен для работы I2C, т.к. на отладке он подключен к I2S_MCLK, а он в свою очередь работает только при передаче данных из DR. То есть после записи в DR. В момент инициализации мы, естественно, ничего не передаем. Собственно ДШ это и описывает.

Выходит проблема не в тактировании MCLK.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Так программы то и нет как таковой. Инициализировал микрофон, он работает как надо. Тактирование идет, данные идут, все ок.

Далее пытаюсь инитить 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);
}

И вижу следующую осциллограмму:

Clip2net_190512083833.thumb.jpg.5ec28f2bd31bd5ff5452b68388db19a5.jpg

Ножка Reset на 3,3в (бирюзовый уровень внизу графика)

 

Вот такие дела.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

PS. При включенном постоянном MCLK (если I2S3 перевести в режим master receive, то clock будет постоянно работать без необходимости записи в DR) все равно чип не опрашивается по I2C

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...