реклама на сайте
подробности

 
 
> Программный I2C Atmega 8, Не могу считать.
ikm
сообщение Aug 14 2017, 15:26
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 891
Регистрация: 25-12-06
Из: С-Пб
Пользователь №: 23 894



Пытаюсь считать данные из регистров устройства. Но не получается.
Возникло много вопросов:
1. Вопрос и самый главный где CAVR можно выставить частоту I2C. У меня версия 2.05 -вкладки I2C в свойствах проекта нет, но при этом есть в визарде, но там не указана частота, только назначение выводов.
Пытался сменой частоты МК, но тут тоже странности. По дефолту стоит на 8 МГц, когда меняю на 16 МГц, CAVR пишет, что SCL будет увеличен до 430 кГц, но по факту (смотрю осцилографом частота становится меньше), соответственно ставлю 1 МГц, прога предупреждает что SCL снизится до 200 кГц, но по факту она возрастает.
2. Запустил проверку кода в Протеусе, анализатор показывает последовательность верную. Запускаю в железе, ответа не получаю. При этом запись проходит успешно.
Несколько раз проходило считывание. Но не систематически и повторить не удалось.

Код использовал стандартный, по идее 100% рабочий
Код
unsigned char TDA_read(unsigned char address) //Функция чтения из TDA
{
i2c_start();                                    // "Cтарт" на шину I2C
i2c_write(TDA_5414_Adr);             // адрес TDA
i2c_write(address);                       //Регистр откуда считываем ошибки
i2c_start();                                  //RE "старт" в шину
i2c_write(TDA_5414_Adr | 1);     //Обращаемся к TDA в режиме чтения, т.е. по адресу 11011001
data=i2c_read(0);                       //Принимаем данные с шины и сохраняем в переменную
i2c_stop();                                 //Посылаем команду "Cтоп"
return data;                              //Возвращаем значение прочитанного
}

.....
Вызов функции для проверки что получен правильный ответ.:
TDA_read(0x00);                        //Считываем ошибки по адресу 0х00
Data_call = data;
if (Data_call == 0x30) led1_on(), led2_on();


подключение сейчас на небольших ~5см, проводах.
Ниже скрины осциллограмм команды считывания через переходник USART-I2C, через него проходит исправно, а так же с Atmega, на "пониженной" скорости (кристалл на 16МГц). На скринах разное разрешение по горизонтали.
У же даже не знаю куда копать.

Эскизы прикрепленных изображений
Прикрепленное изображение
Прикрепленное изображение
 


--------------------
ОБХОДЯ РАЗЛОЖЕННЫЕ ГРАБЛИ - ТЫ ТЕРЯЕШЬ ДРАГОЦЕННЫЙ ОПЫТ!!!
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
k155la3
сообщение Aug 15 2017, 14:24
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 123
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848



data=i2c_read(0); Надо уточнить, что означает в параметре ф-ии 0, а что единица.
Если "0" - выдать "NOACK" - то все правильно.
---
Были тут аналогичные вопросы по разбору полетов на I2C.
Такие "неувязки" нараз отлавливаются лог. анализатором
(стоимость 20-25 кваксов, см. Saleae clone, сам такой пользую)
Если осцилограф достаточно умный (есть память) - можно записать 1 сессию по SDA+SCL
и посмотреть где "хомут".

Танцы с бубном, надо смотреть исходники (xxxx.c) на функции.
Попробуйте вместо ReStart просто стоп-старт.

unsigned char TDA_read(unsigned char address) //Функция чтения из TDA
{
i2c_start(); // "Cтарт" на шину I2C
i2c_write(TDA_5414_Adr); // адрес TDA
i2c_write(address); //Регистр откуда считываем ошибки
i2c_stop();
i2c_start();

i2c_write(TDA_5414_Adr | 1); //Обращаемся к TDA в режиме чтения, т.е. по адресу 11011001
data=i2c_read(0); //Принимаем данные с шины и сохраняем в переменную
i2c_stop(); //Посылаем команду "Cтоп"
return data; //Возвращаем значение прочитанного
}



Go to the top of the page
 
+Quote Post
ikm
сообщение Aug 15 2017, 16:02
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 891
Регистрация: 25-12-06
Из: С-Пб
Пользователь №: 23 894



Цитата(k155la3 @ Aug 15 2017, 17:24) *
data=i2c_read(0); Надо уточнить, что означает в параметре ф-ии 0, а что единица.
Если "0" - выдать "NOACK" - то все правильно.
---
Были тут аналогичные вопросы по разбору полетов на I2C.
Такие "неувязки" нараз отлавливаются лог. анализатором
(стоимость 20-25 кваксов, см. Saleae clone, сам такой пользую)
Если осцилограф достаточно умный (есть память) - можно записать 1 сессию по SDA+SCL
и посмотреть где "хомут".


Да, "0" - выдать "NOACK"
Скорее всего этот слейв не совместим по программному I2C.
Переписал на аппаратный, там всё работает. Причем менял скорости от 30 до 200кГц.

Да, логический анализатор всё таки стоит прикупить.


Чуть позже...
Цитата(k155la3 @ Aug 15 2017, 17:24) *
2c_write(address); //Регистр откуда считываем ошибки
i2c_stop();
i2c_start();
i2c_write(TDA_5414_Adr | 1)

А вот так работает,
Ну и бубен надо тоже прикупить у шамана.


--------------------
ОБХОДЯ РАЗЛОЖЕННЫЕ ГРАБЛИ - ТЫ ТЕРЯЕШЬ ДРАГОЦЕННЫЙ ОПЫТ!!!
Go to the top of the page
 
+Quote Post
k155la3
сообщение Aug 16 2017, 06:05
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 1 123
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848



Цитата(ikm @ Aug 15 2017, 19:02) *
. . . .
Да, логический анализатор всё таки стоит прикупить.
. . . .

Аллилуйя ! sm.gif
Лог. анализатор дает экономию времени процентов так на 1000.
Это стОит 25 кваксов.


Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 11:33
Рейтинг@Mail.ru


Страница сгенерированна за 0.02504 секунд с 7
ELECTRONIX ©2004-2016