Например TDA7294

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





Текущее время: Чт апр 25, 2024 13:29:04

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


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



Начать новую тему Ответить на тему  [ Сообщений: 10 ] 
Автор Сообщение
Не в сети
 Заголовок сообщения: TWI (I2C)
СообщениеДобавлено: Пн мар 13, 2017 10:40:38 
Поставщик валерьянки для Кота
Аватар пользователя

Карма: 20
Рейтинг сообщений: 648
Зарегистрирован: Пт май 31, 2013 17:14:38
Сообщений: 2081
Откуда: Украина, Винница
Рейтинг сообщения: 0
Здравствуйте. Посоветуйте хорошую библиотечку для организации I2C мастера. Спасибо.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: TWI (I2C)
СообщениеДобавлено: Пн мар 13, 2017 10:43:40 
Поставщик валерьянки для Кота
Аватар пользователя

Карма: 41
Рейтинг сообщений: 1209
Зарегистрирован: Ср фев 23, 2011 12:12:31
Сообщений: 2352
Рейтинг сообщения: 0
Медали: 1
Получил миской по аватаре (1)
Библиотеку для чего? В чём пишите?
А так, в районную можно сходить, может и найдутся книги...

_________________
Глупый не задает вопросы. Глупый и так все знает.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: TWI (I2C)
СообщениеДобавлено: Пн мар 13, 2017 11:28:53 
Ум, честь и совесть. И скромность.
Аватар пользователя

Карма: 97
Рейтинг сообщений: 2058
Зарегистрирован: Чт дек 28, 2006 08:19:56
Сообщений: 18030
Откуда: Новочеркасск
Рейтинг сообщения: 1
Медали: 2
Получил миской по аватаре (1) Мявтор 3-й степени (1)
Рекомендую библиотечку Peter Fleury
Неоднократно пользовался, доволен полностью.

_________________
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!


Вернуться наверх
 
PCBWay - всего $5 за 10 печатных плат, первый заказ для новых клиентов БЕСПЛАТЕН

Сборка печатных плат от $30 + БЕСПЛАТНАЯ доставка по всему миру + трафарет

Онлайн просмотровщик Gerber-файлов от PCBWay + Услуги 3D печати
Не в сети
 Заголовок сообщения: Re: TWI (I2C)
СообщениеДобавлено: Пн мар 13, 2017 12:12:13 
Поставщик валерьянки для Кота
Аватар пользователя

Карма: 20
Рейтинг сообщений: 648
Зарегистрирован: Пт май 31, 2013 17:14:38
Сообщений: 2081
Откуда: Украина, Винница
Рейтинг сообщения: 0
упс :))) извините. в плюсах пишу, но можно и просто сишную. так-то взял на гитхабе - вроде прицепилась к иаровскому проекту, пробую запустить.

Добавлено after 41 minute 3 seconds:
ARV писал(а):
Рекомендую библиотечку Peter Fleury
Неоднократно пользовался, доволен полностью.

Спасибо. Скачал, посмотрел. Пока что гитхабовская в проект подключена - если скомпрометирует себя, то возьмусь за Вашу.
DiHalt-овское чудо пытался использовать когда-то. Тогда я мало понимал в С-ях и это было кошмаром :)) .
P.S. А разница то совсем небольшая между либой Питера и выложеной на гитхабе


Вернуться наверх
 
Выбираем схему BMS для заряда литий-железофосфатных (LiFePO4) аккумуляторов

Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.

Подробнее>>
Не в сети
 Заголовок сообщения: Re: TWI (I2C)
СообщениеДобавлено: Вт мар 14, 2017 03:46:10 
Вымогатель припоя

Зарегистрирован: Вт ноя 02, 2010 17:46:37
Сообщений: 574
Рейтинг сообщения: 0
Цитата:
Неоднократно пользовался, доволен полностью.

ARV, а как вы производите обработку ошибок ? или перезагрузку модуля ? Если произошло замыкание на линии то встала вся программа ?


Вернуться наверх
 
Новый аккумулятор EVE серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)

Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре. Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.

Подробнее>>
Не в сети
 Заголовок сообщения: Re: TWI (I2C)
СообщениеДобавлено: Вт мар 14, 2017 10:19:28 
Ум, честь и совесть. И скромность.
Аватар пользователя

Карма: 97
Рейтинг сообщений: 2058
Зарегистрирован: Чт дек 28, 2006 08:19:56
Сообщений: 18030
Откуда: Новочеркасск
Рейтинг сообщения: 0
Медали: 2
Получил миской по аватаре (1) Мявтор 3-й степени (1)
pokk писал(а):
а как вы производите обработку ошибок ? или перезагрузку модуля ? Если произошло замыкание на линии то встала вся программа ?
а если случится ядерная война - устройство должно продолжать работать?

я всегда оцениваю вероятность тех или иных событий. если б я делал военное изделие, я бы думал о том, как поступить при КЗ шины и2ц на землю или еще при каком-то форсмажоре. но если я делаю, допустим, часы - что должно случиться с часами, чтобы это КЗ возникло, и надо ли стремиться сохранить работоспособность остальной части электроники в этом случае?

допустим, в телевизоре у вас есть и2ц память с настройками. и вот у вас телек перестал включаться - есть ли для вас, как потребителя, разница: вышел из строя центральный процессор телека или "просто КЗ" на шине и2ц?

по-моему, ваши опасения надуманы. хотя, может быть, как раз вы военные изделия и разрабатываете... :dont_know: во всяком случае я вообще никак не обрабатываю ошибки, если это не требуются протоколом обмена.

_________________
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: TWI (I2C)
СообщениеДобавлено: Вт мар 14, 2017 14:22:05 
Поставщик валерьянки для Кота
Аватар пользователя

Карма: 20
Рейтинг сообщений: 648
Зарегистрирован: Пт май 31, 2013 17:14:38
Сообщений: 2081
Откуда: Украина, Винница
Рейтинг сообщения: 0
pokk писал(а):
а как вы производите обработку ошибок ? или перезагрузку модуля ? Если произошло замыкание на линии то встала вся программа ?

В данном случае, эти проблемы должен решать софт, который использует драйвер. Я пишу функции которые возвращают код ошибки в зависимости от того, какая функция драйвера возвратила ошибку. Допустим функция должна передать последовательность байт. Она сперва делает старт с посылкой адреса и режима. Вернула 1? Тогда делаем ретурн из нашей функции и возвращаем ошибку i2c_NO_RESPONSE, например. И так далее. Дело Вашей фантазии сколько ошибок наопределять и какие ветвления по-настраивать. Но это софтверные решения - код ждет пока байт отправится, придет аск/нот-аск. Как я уже писал выше, есть достаточно изначально запутанный драйвер на прерываниях и тот подход будет по-профессиональней. Но у меня задача попроще.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: TWI (I2C)
СообщениеДобавлено: Ср мар 15, 2017 17:26:59 
Поставщик валерьянки для Кота
Аватар пользователя

Карма: 20
Рейтинг сообщений: 648
Зарегистрирован: Пт май 31, 2013 17:14:38
Сообщений: 2081
Откуда: Украина, Винница
Рейтинг сообщения: 0
я тут в своем гитхабовском драйвере неприятный момент обнаружил. Там стоят программные затычки вида while(!(TWCR&(1<<TWINT)) ); и если у нас слейв заглючит, или линии уйдут в 0 то получаем зависание программы. Пока что грешу на это, т-к протеус уже полчаса лопатит программу без зависаний.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: TWI (I2C)
СообщениеДобавлено: Пт мар 17, 2017 01:14:22 
Родился

Зарегистрирован: Пт янв 06, 2017 14:03:22
Сообщений: 11
Рейтинг сообщения: 0
Всем привет, возникла такая проблема, разбираюсь с TWI ,написал обработчик прерываний с выводом сообщений о прерываниях на UART(не удите за столь длинные Chr-вские массивы) , вроди бы все проходит как надо , есть ответ после старта , после передачи , после приемы и после према последнего байта. Но!!! Вот беда , после чтения регистра TWDR я вижу НУЛЬ!!!!!!!!! Подскажите, что не так ? Забыл , подключаю датчик Minimu 9 v3 Giro к Atmega 8 через аппаратный TWI. Код прилагаю ниже , а так же скриншоты терминала. Подскажите что не так уже месяц голову ломаю. На скринах данные идут после 3го с конца бита 0x3A в Hex, кстати , функция передачи работатет, проверят записывая вместо TWDR константу.
Код:
/*
 * GccApplication1.c
 *
 * Created: 15.03.2017 19:38:13
 *  Author: user
 */
            
#define Giro 0b01101011
#define Accel 0b00011101
#define F_CPU 8000000
#define SCL_F 100000
#define BAUD 9600UL // Скорость обмена данными
#define UBRR ((F_CPU/(BAUD*16))-1)
#include <avr/io.h>
#include <avr/interrupt.h>

volatile uint8_t buffer[];
volatile uint8_t size_buf;
volatile uint8_t pointer;
volatile uint8_t pointerforREAD;
volatile char buffer_read[];
volatile uint8_t writeread;
volatile uint8_t ar[];


void initUART() //задаем скорость обмена по uart
{
   UBRRL = UBRR;       //Младшие 8 бит UBRR
   UBRRH = UBRR>>8;  //Старшие 8 бит UBRR
   //RXCIE - разрешаем прерывание по завершению приема данных
   //TXCIE - разрешаем прерыванеи по завершению передачи
   //UDRIE - разрешаем прерывание по освобождению регистра данных
   //RXEN  - разрешаем работу приемника
   //TXEN  - разрешаем работу передатчика
   //UCSZ2 - указываем размер данных
   UCSRB = (0<<RXCIE)|(0<<TXCIE)|(0<<UDRIE)|(1<<RXEN)|(1<<TXEN)|(0<<UCSZ2);
   //URSEL - записываем UCSRC
   //UMSEL - асинхронный режим передачи
   //UPM1,0 -запрет париета
   //USBS  - 1 стоповый бит
   //UCSZ1,2,3- задаем размер посылки
   UCSRC = (1<<URSEL)|(0<<UMSEL)|(0<<UPM1)|(0<<UPM0)|(1<<USBS)|(1<<UCSZ1)|(1<<UCSZ0);

}
void send_UartChar(char strng[])//   Отправка байта
{
   
   for (int i=0; strng[i] !='\0'; i++)
   {
      UDR = strng[i];
      while(!(UCSRA&(1<<UDRE)));  //  Устанавливается, когда регистр свободен
   }
   
}
void send_UartInt(uint8_t strng[],uint8_t Tsize)//   Отправка байта
{
   
   for (int i=0; i <=Tsize; i++)
   {
      UDR = strng[i];
      while(!(UCSRA&(1<<UDRE)));  //  Устанавливается, когда регистр свободен
   }
   
}

void twi_Init(void)
{
   TWBR = ( ( (F_CPU)/(SCL_F)-16 ) /2 ) ;
   TWSR = 0; //Очищаются биты TWPS0 и TWPS1
}
void start()
{
    TWCR = (1<<TWEN)|(1<<TWIE)|(1<<TWINT)|(1<<TWSTA);
 }
void stop()
{
   //формируем состояние СТОП, сбрасываем флаг, запрещаем прерывания
   TWCR = (1<<TWEN)|(1<<TWINT)|(1<<TWSTO)|(0<<TWIE);
}
void not_interrupt()
{
   TWCR = (1<<TWEN)|(0<<TWIE)|(0<<TWINT)|(0<<TWEA)|(0<<TWSTA)|(0<<TWSTO)|(0<<TWWC); //запретить прерывание   
}
/*данная функция производит подготовку буффера для интерфейса TWI , после чего запускает Start
массив заполняется в соответсвии с битом записи чтения
если поступил бит чтеня , то записывается только первый байт данных
иначе записываетя весь массив до size*/
void set_array_TWI(uint8_t array_a[],uint8_t size,uint8_t wr)//в size указываем размер массива без SLA , тоесть количесво байт для приема или же передачи
{
    uint8_t i;
    while(TWCR & (1<<TWIE)); // ;ждем освобождения модуля TWI
    //методом проверки флага разрешения прерывания , который
    //сбрасывается после СТОП
    writeread=wr;
    buffer[0]=array_a[0] ;
   size_buf=size;
    if ((array_a[0]==(Accel<<1)) || (array_a[0]==(Giro<<1)))
    {  //если задано ЗАПИСЬ , то сохраняем весь массив
       for (i=1; i<=size;i++)
       {
          buffer[i]=array_a[i] ;
       }
    } start();}   
       
ISR(TWI_vect)
{
   switch (TWSR & 0xf8)
   {
      case 0x08://сигнал START передан
      send_UartChar("Start ");
      TWDR=buffer[0]; //передаем SLA+W or SLA+R
      pointerforREAD=0;
      pointer=1;
      TWCR = (1<<TWEN)|(1<<TWIE)|(1<<TWINT); //сбрасываем флаг TWINT
      break;
      
      case 0x10://сигнал REPEATED START передан
      send_UartChar("RepeatedStart ");
      pointerforREAD=0;
      pointer=1;//сбросили указатель массива (буффера)
      TWDR=buffer[0]; //послали SLA+RW
      TWCR = (1<<TWEN)|(1<<TWIE)|(1<<TWINT); //сбрасываем флаг TWINT      
      break;
      
      case 0x30: //— Байт отправлен, ACK не получен
      send_UartChar("ByteSendNACK ");
      TWDR=buffer[pointer]; //повторно отпраляем бай данных
      TWCR = (1<<TWEN)|(1<<TWIE)|(1<<TWINT); //сбрасываем флаг TWINT
      break;
      
      case 0x18://Адрес для записи передан, ответ (ACK) получен
      send_UartChar("SLA+W,ACK ");
      if (pointer<=size_buf)
      {
         TWDR=buffer[pointer];
         TWCR = (1<<TWEN)|(1<<TWIE)|(1<<TWINT); //сбрасываем флаг TWINT
         pointer++;
      }
      break;
      
      case 0x28:// Байт отправлен, ACK получен
      send_UartChar("ByteSend,ACK ");
      if (pointer<=size_buf)
      {
         TWDR=buffer[pointer];
         TWCR = (1<<TWEN)|(1<<TWIE)|(1<<TWINT); //сбрасываем флаг TWINT
         pointer++;
      }
      else
      {
         switch(writeread)
         {
            case 1:
            stop();
            default:
            not_interrupt();
         }
      }
      break;
      
      case 0x40://Адрес для чтения передан, ответ (ACK) получен
      if (pointer<size_buf)
      {
          TWCR = (1<<TWEN)|(1<<TWIE)|(1<<TWINT)|(1<<TWEA);//если это не предпоследний принятый байт, формируем подтверждение
      }
       else {
          TWCR = (1<<TWEN)|(1<<TWIE)|(1<<TWINT);            //если приняли предпоследний байт, подтверждение не формируем
       }
       send_UartChar("SendSLA+R,ACK");
       break;
      
       case 0x50: // — Данные получены, ACK передан
      buffer_read[pointerforREAD]=TWDR;
      pointerforREAD++;
      send_UartChar("GetByteACK:");
      if (pointerforREAD<size_buf-1)
      {
         TWCR = (1<<TWEN)|(1<<TWIE)|(1<<TWINT)|(1<<TWEA);//если это не предпоследний принятый байт, формируем подтверждение
      }
      else {
         TWCR = (1<<TWEN)|(1<<TWIE)|(1<<TWINT);            //если приняли предпоследний байт, подтверждение не формируем
      }
      break;
      
       case 0x58:// — Данные получены, ACK не передан<
      buffer_read[pointerforREAD]= TWDR;
      send_UartChar("GetByteNACK:");
      send_UartInt(buffer_read,pointerforREAD);
      stop();
      break;
      
      case 0x48:// — Адрес для чтения передан, устройство не откликнулось
      case 0x20:// — Адрес для записи передан, устройство не откликнулось
      case 0x38:// — Контроллер потерял шину (вылез еще один контроллер)
      default:
      send_UartChar("error");
      not_interrupt();
      break;
   }   
}      
      
int main(void)
{  twi_Init();
   initUART();
   sei();   
   ar[0]=Accel<<1;
   ar[1]=0b00100100; //00011000
      set_array_TWI(ar,1,0);
   ar[0]=(Accel<<1)+1;
   ar[1]=0x0F;
   set_array_TWI(ar,2,1);

   while(1)
    {
        //TODO:: Please write your application code
    }
}


Вложения:
Комментарий к файлу: Это скрин в HEX
Снимок1.PNG [17.81 KiB]
Скачиваний: 430
Комментарий к файлу: Это скрин в ASCI
Снимок.PNG [13.79 KiB]
Скачиваний: 444
Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: TWI (I2C)
СообщениеДобавлено: Пт мар 17, 2017 05:27:45 
Вымогатель припоя

Зарегистрирован: Вт ноя 02, 2010 17:46:37
Сообщений: 574
Рейтинг сообщения: 0
Вот посмотрите, может чем поможет, на AVR с I2С не имел дело.
http://www.avrfreaks.net/forum/i2c-state-machine


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

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


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

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


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

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


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