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

 
 
> USI типа I2C на Tiny45, просто не работает
alux
сообщение Feb 22 2010, 13:22
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 589
Регистрация: 24-04-05
Пользователь №: 4 447



Необходимо организовать связь между Tiny45 (Slave) и Mega324P(Master). Мега должна считывать данные с Тини и передать на ЖКИ (i2c TIC154). Попробовал использовать аппнот avr312 (USI -> I2C Slave) для Тини45, но не удается получить ответ от Тини. ЖКИ при этом тоже не работает. Анализ исходника avr312 показал, что у Тини вывод SCL настроен на выход и удерживается в низком состоянии. Настройка вывода SCL (Tiny45) на вход не решила проблему.
Есть ли у кого положительный опыт работы с данным примером?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
AHTOXA
сообщение Feb 22 2010, 16:13
Сообщение #2


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Помнится, мы нашли какой-то глюк в AVR312. Но глюк был мелкий, не приводящий к полной неработоспособности. Если что, то исправленный вариант лежит тут.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
alux
сообщение Feb 22 2010, 16:31
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 589
Регистрация: 24-04-05
Пользователь №: 4 447



Вывод SCL у Тини должен быть выходом? Тогда остальные I2C устройства (ЖКИ) не работают...
Go to the top of the page
 
+Quote Post
SysRq
сообщение Feb 22 2010, 16:57
Сообщение #4


Чайник, 1 литр
****

Группа: Свой
Сообщений: 655
Регистрация: 17-05-06
Из: Moscow
Пользователь №: 17 168



Цитата(alux @ Feb 22 2010, 19:31) *
Вывод SCL у Тини должен быть выходом?
Если у вас SCL и SDA подтянуты к VCC резисторами как положено, то с МК вы должны имитировать выход типа открытый коллектор\сток (т.е. давать высокий уровень на выход МК не должен).
Go to the top of the page
 
+Quote Post
alux
сообщение Feb 22 2010, 19:06
Сообщение #5


Знающий
****

Группа: Свой
Сообщений: 589
Регистрация: 24-04-05
Пользователь №: 4 447



Притянуты внешними 10кОм к +5В. Должен по спецификации I2C быть открытый коллектор. Получается, что этот USI нифига не совместимый с I2C?
АНТОХА, попробовал твой исходник в паре с отлаженным драйвером I2C (Мастер) на Меге. Не получается прочитать байт от Тини, хоть тресни sad.gif
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Feb 22 2010, 19:39
Сообщение #6


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата
Не получается прочитать байт от Тини, хоть тресни sad.gif

А передать байт в тиню? Там же только запись, в моём примере. И это точно работало у меняsmile.gif А другие устройства на i2c - перестали зависать?
Возможно я не всё исправил, тогда надо ждать MTh, он это (неответ) вроде поборол.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
alux
сообщение Feb 22 2010, 19:52
Сообщение #7


Знающий
****

Группа: Свой
Сообщений: 589
Регистрация: 24-04-05
Пользователь №: 4 447



Ни привета, ни ответа. В слейве даже по условию
Код
        if( USI_TWI_statusReg.dataInRxBuf )
        {
              PORTB |= (1 << LED);
                 ........

ничего не горит.
Со стороны Меги вызываю
Код
void ReadSensor()    
{
    I2c_StartWait(SENSOR_ADDR | W);         // slave address, write to sensor
    I2c_Write(TWI_CMD_MASTER_READ);  
  
    I2c_RepStart(SENSOR_ADDR | R);   // slave address + read bit, read sensor
          
    Value = (unsigned long)I2c_Read(I2C_ACK) << 24;
    Value |= (unsigned long)I2c_Read(I2C_ACK) << 16;
    Value |= (unsigned long)I2c_Read(I2C_ACK) << 8;
    Value |= (unsigned long)I2c_Read(I2C_NACK) << 0;
  
    I2c_Stop();
}
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Feb 22 2010, 20:37
Сообщение #8


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Ну тогда странно... Я сейчас и проверить-то не могуsad.gif
Вот софтовый i2c мастер для меги16, которым я проверял:
Прикрепленный файл  i2c_master_m16.zip ( 6.73 килобайт ) Кол-во скачиваний: 172


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
alux
сообщение Feb 23 2010, 08:41
Сообщение #9


Знающий
****

Группа: Свой
Сообщений: 589
Регистрация: 24-04-05
Пользователь №: 4 447



Нашел одну ошибку:
адрес слейв устройства в тини нужно инициализировать сдвинутым на 1 вправо. Т.е. из Меги передаю адрес 0х10, а в Тини TWI_SlaveAdress = 0x08. После этого начал зажигаться светодиод по условию, "буфер не пуст" и ЖКИ индикатор вроде как работает. "Вроде как" значит, что по включению питания на ЖКИ мусор и зависание, а после ресета по крайней мере проходит процедура инициализации ЖКИ. Но все-равно нет ответа от Тини sad.gif.

Короче, в топку этот недоинтерфейс USI в режиме I2C. Буду пробовать трехпроводный SPI. Надеюсь, что с ним не будет таких проблем...
Go to the top of the page
 
+Quote Post
SysRq
сообщение Feb 23 2010, 15:22
Сообщение #10


Чайник, 1 литр
****

Группа: Свой
Сообщений: 655
Регистрация: 17-05-06
Из: Moscow
Пользователь №: 17 168



Цитата(alux @ Feb 23 2010, 11:41) *
Нашел одну ошибку...
Разберитесь с адресацией (и с R\W заодно).

Обычно предлагается два подхода.

1. Адрес отделяется от признака R\W; адрес - 7 бит. При приёме вы вручную выделяете сташие 7 бит принятого байта (сдвиг на 1 вправо, отбрасываем R\W) - это и будет адрес. При передаче сдвигаете адрес на 1 влево, добавляете R\W, и отправляете байт. Микросхема "пишется" и "читается" по одному и тому же адресу.
В AVR312 именно так. Код проверки адреса:
Код
(( USIDR>>1 ) == TWI_slaveAddress

2. Адрес связан с R\W, микросхема "пишется" по одному адресу, а "читается" по другому; адрес - 8 бит. Обычно из двух этих адресов легко видно, что старшие 7 бит у них одинаковы, а младший бит адреса для "чтения" равен 1, - т.е. это просто R\W, и легко свести обмен к предыдущему подходу.
Похоже, именно так у вас master реализован.

Согласуйте подход в адресации, и должно завестись...
Go to the top of the page
 
+Quote Post
alux
сообщение Feb 24 2010, 09:28
Сообщение #11


Знающий
****

Группа: Свой
Сообщений: 589
Регистрация: 24-04-05
Пользователь №: 4 447



Цитата(SysRq @ Feb 23 2010, 19:22) *
Разберитесь с адресацией (и с R\W заодно).

Повторю еще раз. Со стороны Меги :
Код
#define SENSOR_ADDR  0x10

    I2c_StartWait(SENSOR_ADDR | W);         // slave address, write to sensor
    I2c_Write(TWI_CMD_MASTER_READ);  
  
    I2c_RepStart(SENSOR_ADDR | R);   // slave address + read bit, read sensor


Со стороны Тини:
Код
TWI_slaveAddress = 0x08;
............
    case USI_SLAVE_CHECK_ADDRESS:
      if ( ( USIDR == 0 ) || ( ( USIDR >> 1 ) == slaveAddress) )
      {
          if ( USIDR & 0x01 )
        {
          overflowState = USI_SLAVE_SEND_DATA;
        }
        else
        {
          overflowState = USI_SLAVE_REQUEST_DATA;
        }
        SET_USI_TO_SEND_ACK( );
      }
.......

И где я не прав?
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- alux   USI типа I2C на Tiny45   Feb 22 2010, 13:22
|- - AHTOXA   Да, выходом. Но не нулём: Кодvoid i2c_init(u08...   Feb 22 2010, 16:49
- - alux   Попробовал использовать USI (Tiny45) в режиме SPI ...   Feb 25 2010, 13:53
- - SysRq   Цитата(alux @ Feb 24 2010, 12:28) И где я...   Feb 26 2010, 22:57
- - alux   SPIF = SPIF; в данном случае ни при чем. Проблема...   Feb 27 2010, 14:39
- - Александр Куличок   ЦитатаА вообще, логично было бы назвать вывод MISO...   Feb 28 2010, 10:00
|- - alux   Вот именно, с точностью до наоборот. Мне, например...   Feb 28 2010, 14:47
- - alux   С USI(SPI) работает, но нужно организовывать прото...   Mar 1 2010, 06:34
- - alux   Чтобы отправить от Slave(Tiny45) длинный байт Код ...   Mar 2 2010, 09:23
- - Nuts_   Если надо то есть реальный проверенный код на ASM ...   Mar 30 2010, 11:07
|- - stells   Цитата(Nuts_ @ Mar 30 2010, 15:07) Если н...   Mar 30 2010, 13:48
- - Nuts_   код для принимающего утройтва принимает 6 байт ну ...   Apr 1 2010, 11:15
|- - stells   Цитата(Nuts_ @ Apr 1 2010, 15:15) код для...   Apr 1 2010, 11:20
- - Cursedsmite   Скажите, а примера реализации похожей задачи на ас...   Jan 24 2013, 11:31


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

 


RSS Текстовая версия Сейчас: 19th July 2025 - 12:07
Рейтинг@Mail.ru


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