Jump to content

    

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

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

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

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

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

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

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

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

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

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

Спс.

 

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
В 10.05.2019 в 07:10, RadiatoR сказал:

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

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

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

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

Share this post


Link to post
Share on other sites

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.

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

 

 

Share this post


Link to post
Share on other sites
4 часа назад, Arlleex сказал:

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

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

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

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

Share this post


Link to post
Share on other sites
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.

Share this post


Link to post
Share on other sites

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

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

 

 

Share this post


Link to post
Share on other sites
2 часа назад, Arlleex сказал:

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

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

 

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

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

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

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

Share this post


Link to post
Share on other sites
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

Share this post


Link to post
Share on other sites
29 minutes ago, RadiatoR said:

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

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

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

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

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

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

Далее пытаюсь инитить 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в (бирюзовый уровень внизу графика)

 

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now