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

 
 
> Программный 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, 10:42
Сообщение #2


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

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



на осцилограмме все вроде нормально.
Адрес слейва 0x6C, режим записи (если не ошибаюсь)
ACK есть (на 9-ом клоке данные притянуты в 0 слейвом, "адрес принят").
Затем идет запись в слейв нуля (не все видно).
Если надо из слейва считывать, то на 8-ом клоке (R/~W) данные должны быть в 1.
Как реализованы ф-ии софт-I2C - неизвестно. Если есть исходники - надо
их "покурить", в особенности возврат из функций ошибок.
На шине I2C только один слейв ?
Также (возможно) для считывания необходим или таймаут посылки или ожидание (чего-то).
Надо курить даташит слейва напредмет формата фреймов обмена с ним по I2C, и в частности - возможных необходимый таймаутов.
Попробуйте "разрядить" посылки команд в слейв задержками 2-5 мс. Будет ли ОНО при этом работать на "верхних"
частотах тактирования.

PS - даташит на слейва или ссылка не помешалабы.
Go to the top of the page
 
+Quote Post
ikm
сообщение Aug 15 2017, 11:25
Сообщение #3


Знающий
****

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



Цитата(k155la3 @ Aug 15 2017, 13:42) *
Адрес слейва 0x6C, режим записи (если не ошибаюсь)
ACK есть (на 9-ом клоке данные притянуты в 0 слейвом, "адрес принят").
Затем идет запись в слейв нуля (не все видно).
Если надо из слейва считывать, то на 8-ом клоке (R/~W) данные должны быть в 1.
Как реализованы ф-ии софт-I2C - неизвестно. Если есть исходники - надо
их "покурить", в особенности возврат из функций ошибок.
На шине I2C только один слейв ?
Также (возможно) для считывания необходим или таймаут посылки или ожидание (чего-то).
Надо курить даташит слейва напредмет формата фреймов обмена с ним по I2C, и в частности - возможных необходимый таймаутов.
Попробуйте "разрядить" посылки команд в слейв задержками 2-5 мс. Будет ли ОНО при этом работать на "верхних"
частотах тактирования.

PS - даташит на слейва или ссылка не помешалабы.


Нет, адрес 0хD8, на один такт ошиблись.
Да, потом указываю регистр 0x00 из которого надо считать.
Затем (видно на самых первых скринах) повтор старта и указываю адрес D9 (добавляется 1, к первому кадру), но вот дальше идут расхождения.
По картинке в первом посте слайв отвечает на запрос через переходник UART-i2C: идет спад уровня, а вот на запрос Atmega не отвечает, линия остается подтянутой к питанию.
Вот, что находится в исходниках I2C.h, с обработчиком не понятно sad.gif
CODE
#ifndef _I2C_INCLUDED_
#define _I2C_INCLUDED_

#pragma used+
void i2c_init(void);
unsigned char i2c_start(void);
void i2c_stop(void);
unsigned char i2c_read(unsigned char ack);
unsigned char i2c_write(unsigned char data);
#pragma used-

#endif

Тайм ауты я уже пытался ставить играясь в разных местах функции считывания со значениями 5-50 мс. Не помогло.
При чём что странно, что запись проходит успешно в регистры слейва (TDA5414 Дш во вложении).

Сейчас пытаюсь перейти на железный I2C (TWI)/
Прикрепленные файлы
Прикрепленный файл  tas5414b_q1.pdf ( 2.08 мегабайт ) Кол-во скачиваний: 8
 


--------------------
ОБХОДЯ РАЗЛОЖЕННЫЕ ГРАБЛИ - ТЫ ТЕРЯЕШЬ ДРАГОЦЕННЫЙ ОПЫТ!!!
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 16:16
Рейтинг@Mail.ru


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