Например TDA7294

Форум РадиоКот • Просмотр темы - TWI-> проблема-> помогите
Форум РадиоКот
Здесь можно немножко помяукать :)

Текущее время: Вс июл 27, 2025 22:21:09

Часовой пояс: UTC + 3 часа


ПРЯМО СЕЙЧАС:



Начать новую тему Ответить на тему  [ Сообщений: 3 ] 
Автор Сообщение
Не в сети
 Заголовок сообщения: TWI-> проблема-> помогите
СообщениеДобавлено: Ср ноя 15, 2017 21:54:22 
Первый раз сказал Мяу!

Зарегистрирован: Вс авг 21, 2016 19:53:33
Сообщений: 34
Рейтинг сообщения: 0
Здраствуйте, пролема простая, наверняка даже легко решаемая, но я не вдуплю. Кароче хочу, для понимания, чтобы просто заработал следующий код:

[Код из атмел студии 7, на atmega 8, протеус 8]
Код:
#define F_CPU 1000000UL
#include <avr/io.h>
#include <util/delay.h>



#define ds3231 0b11010001


int main(void)
{

   DDRB = 0xFF;
   DDRD = 0x00;
   // Insert code
   
   
   uint8_t addrW;  // созидание и подготовка адреса с битом записи
   addrW = (ds3231);
   
   uint8_t addrDATA;
   addrDATA = 0x01;

   uint8_t DATA;
   DATA = 0b01010101;
   
   while(1){
      
      _delay_ms(200);
      
      TWBR = 255; //При частоте 1 МГц
      TWSR = (1 << TWPS1)|(0 << TWPS0); //Пред делитель на 4
      TWCR |= (1 << TWEN); //Включение модуля TWI
      // ******настройки

      TWCR =(1<<TWINT)|(1<<TWSTA)|(1<<TWEN)|(1<<TWIE); // старт
      while (!(TWCR &( 1<<TWINT)));     // ожидание подъема twint
      if ((TWSR & 0xF8) != 0xF8); else PORTB |= (1 << 2);  // ежели  ошибка- загорится лампа



      TWDR= addrW;
      TWCR= (1<<TWINT)|(1<<TWEN);
      while (!(TWCR &( 1<<TWINT)));     // ожидание подъема twint



      TWDR= addrDATA;
      TWCR= (1<<TWINT)|(1<<TWEN);
      while (!(TWCR &( 1<<TWINT)));     // ожидание подъема twint
      if ((TWSR & 0xF8) != 0xF8) ;else PORTB |= (1 << 3);  // ежели ошибка- загорится лампа

      TWDR= DATA;
      TWCR= (1<<TWINT)|(1<<TWEN);
      while (!(TWCR &( 1<<TWINT)));     // ожидание подъема twint
      if ((TWSR & 0xF8) != 0xF8);else PINB |= (1 << 4);  // ежели ошибка- загорится лампа
      
      TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWSTO);
   }


   return 0;
}


проблему видно на скрине дебагера протеуса.
Изображение
В общем, летит старт, летит адрес, адрес прилетает нормально, * далее летит неправильный (обычно пустой или, 4 раза генерирует некую белибирду) адрес пакета, шлет меня НАКуй... дальше уже не столь важно.

не пойму в чем дело, ломаю голову не первую неделю. Жду лапку помощи


Вложения:
3sdf.jpg [209.65 KiB]
Скачиваний: 300
Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: TWI-> проблема-> помогите
СообщениеДобавлено: Чт ноя 16, 2017 00:32:57 
Потрогал лапой паяльник

Карма: 5
Рейтинг сообщений: 81
Зарегистрирован: Вс июл 29, 2012 16:25:39
Сообщений: 312
Рейтинг сообщения: 1
#define ds3231 0b11010001
"...младший бит, определяет направление пересылки данных. "Ноль" означает, что ведущий будет записывать информацию в выбранного ведомого. "Единица" означает, что ведущий будет считывать информацию из ведомого."
Т.е. ты хочешь читать из ведомого устройства. А не нужно ли ему вначале передать что хочется прочитать, адрес регистра, например?
TWCR =(1<<TWINT)|(1<<TWSTA)|(1<<TWEN)|(1<<TWIE); // старт
while (!(TWCR &( 1<<TWINT))); // ожидание подъема twint
if ((TWSR & 0xF8) != 0xF8); else PORTB |= (1 << 2); // ежели ошибка- загорится лампа
Зачем включать прерывание, если не используешь его? (TWIE)
Статус удачного старта - 0x08, т.е. для зажигания при ошибке нужно if ((TWSR & 0xF8) != 0x08) PORTB |= (1 << 2);
TWDR= addrW;
TWCR= (1<<TWINT)|(1<<TWEN);
while (!(TWCR &( 1<<TWINT))); // ожидание подъема twint
После передачи адреса устройства хорошо бы проверить результат, код успешного передачи адреса (TWSR & 0xF8) == 0x18
TWDR= addrDATA;
TWCR= (1<<TWINT)|(1<<TWEN);
while (!(TWCR &( 1<<TWINT))); // ожидание подъема twint
if ((TWSR & 0xF8) != 0xF8) ;else PORTB |= (1 << 3); // ежели ошибка- загорится лампа
Здесь, видимо, передаётся адрес регистра. Кстати, код успешной передачи данных (TWSR & 0xF8) == 0x28
Но i2c-адрес говорит "читаем из ведомого". Таким образом, ведомый начал что-то отвечать, но что?
В это же время ведущий начал что-то передавать - получили коллизию.
В общем, летит старт, летит адрес, адрес прилетает нормально, * далее летит неправильный (обычно пустой или, 4 раза генерирует некую белибирду)
i2c работает так, как ты ей сказал. А не так, как хотел чтобы оно работало. :)
В даташите описан алгоритм приема и передачи в/из ведомого.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: TWI-> проблема-> помогите
СообщениеДобавлено: Чт ноя 16, 2017 21:21:21 
Первый раз сказал Мяу!

Зарегистрирован: Вс авг 21, 2016 19:53:33
Сообщений: 34
Рейтинг сообщения: 0
Отлично, всё работает.... спасибо тебе, дружище.


Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ Сообщений: 3 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 12


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y