Возникло много вопросов:
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();
{
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МГц). На скринах разное разрешение по горизонтали.
У же даже не знаю куда копать.