Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: twi atmega 128
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Oleg_DI
помогите разобраться с twi функция работает на 16 меге а на 128 jtag выдаёт ошибку условия старт.Аппаратно на двух разных платах тоже самое.
TWI_BIT_RATE= 1; //Bit Rate 100 kBit/s
TWI_STATUS = 0x00; //Prescaler 1:1
TWI_CONTROL = 0x04; //enable twi
TWAR = 0x0d;
старт TWCR = 0xa4;
korobov_michael
Цитата(Oleg_DI @ Jan 11 2009, 18:42) *
TWI_BIT_RATE= 1; //Bit Rate 100 kBit/s
TWI_STATUS = 0x00; //Prescaler 1:1
TWI_CONTROL = 0x04; //enable twi
TWAR = 0x0d;
старт TWCR = 0xa4;


Расскажи, что такое TWI_BIT_RATE, TWI_STATUS и пр. Твое устройство работает как Slave? Приведи полный кусок инициализации
Oleg_DI
мастер
//TWSR=0x00;
//TWBR=0x42;
//TWAR=0x0d;
//TWCR=0x04;
korobov_michael
1. На всякий случай, фьюзы соответствуют друг другу?

2. Можешь прилинковать проект?
Oleg_DI
Да фьюзы соответствуют
//===================================================
//Error code I2C Bus
//===================================================
#define ERROR_START 0x10
#define ERROR_MASTER_ASK 0x11
#define ERROR_MT_DATA_ASK 0x12
#define ERROR_START_REPEAT 0x13
#define ERROR_ASK_READ 0x14
#define ERROR_ASK_DATA_READ 0x15
#define NO_ERROR 0x00
//===================================================
#define HARD_START_CONDITION 0xA4
#define HARD_STOP_CONDITION 0x94
#define HARD_RESTORE_REG 0x84
#define HARD_RESTORE_ASK 0xC4

//================================================================
// Инициализация RTC
//================================================================
void hardRTCInit(void)
{ unsigned char r;
r = i2cReadBlock(ADDRES, 0x0E, sizeof(testDS), (unsigned char *)&testDS);
r = 0x40;
i2cWriteBlock(ADDRES, 0x0E, 1, &r);
r = i2cReadBlock(ADDRES, 0x02, sizeof(testDS), (unsigned char *)&testDS);
}

//================================================================
//Read block data from I2C Bus
//Чтение блока данных по шине I2C
//================================================================
unsigned char i2cReadBlock(unsigned char addres, unsigned char subaddres, unsigned char size, unsigned char *data)
{
static unsigned char _size;
_size = size;
//Start condition
TWCR = HARD_START_CONDITION;
while (!(TWCR & 0x80));
if ((TWSR & 0xF8) != _START)
{
TWCR = HARD_STOP_CONDITION; return ERROR_START;
}
//Send addres
TWDR = addres;
TWCR = HARD_RESTORE_REG;
while (!(TWCR & 0x80));
if ((TWSR & 0xF8) != _MT_SLA_ACK)
{
TWCR = HARD_STOP_CONDITION; return ERROR_ASK_READ;
}
//Send subaddres
TWDR = subaddres;
TWCR = HARD_RESTORE_REG;
while (!(TWCR & 0x80));
if ((TWSR & 0xF8) != _MT_DATA_ACK)
{
TWCR = HARD_STOP_CONDITION; return ERROR_MT_DATA_ASK;
}
//Start condition
TWCR = HARD_START_CONDITION;
while (!(TWCR & 0x80));
if ((TWSR & 0xF8) != _START_REPEAT)
{ TWCR = HARD_STOP_CONDITION; return ERROR_START;
}
//Send addres
TWDR = addres+1;
TWCR = HARD_RESTORE_REG;
while (!(TWCR & 0x80));
if ((TWSR & 0xF8) != _MT_SLA_ACK_READ)
{ TWCR = HARD_STOP_CONDITION; return ERROR_ASK_READ;
}
//Recive data
TWCR = HARD_RESTORE_ASK;
while (!(TWCR & 0x80));
if ((TWSR & 0xF8) != _MT_DATA_ACK_READ)
{ TWCR = HARD_STOP_CONDITION; return ERROR_ASK_DATA_READ;
}
if(size)
{ *data = TWDR;
++data;
_size--;
}
else _size = TWDR;
while(_size--)
{ if(!_size)
{//Send one byte of block
TWCR = HARD_RESTORE_REG;
while (!(TWCR & 0x80));
if ((TWSR & 0xF8) != _MT_DATA_NOT_ACK_READ)
{ TWCR = HARD_STOP_CONDITION; return ERROR_ASK_DATA_READ;
}
*data = TWDR;
++data;
}
else
{ TWCR = HARD_RESTORE_ASK;
while (!(TWCR & 0x80));
if ((TWSR & 0xF8) != _MT_DATA_ACK_READ)
{ TWCR = HARD_STOP_CONDITION; return ERROR_ASK_DATA_READ;
}
*data = TWDR;
++data;
}
}
TWCR = HARD_STOP_CONDITION;
return NO_ERROR;
}
Александр Куличок
Внешние подтяжки присутствуют? SDA, SCL на землю не засажены?
З.Ы. если Ваше устройство работает только как мастер и не переключается в режим slave, то TWAR Вам не нужен.
Oleg_DI
резисторы 4.7к . Две разные платы с мегой 128 не работают плата с мегой 16 работает
Александр Куличок
Проверьте на всякий случай, все ли ножки питания/массы мег128 подсоединены
Частоты 16 и 128 мег одинаковые?
Цитата
выдаёт ошибку условия старт

В каком месте? там, где start или repeated start?
Oleg_DI
Первый старт Я думаю что он его не формирует, проверяет линию и уходит в ошибку.

Да частоты одинаковые 14 745 кгц
Александр Куличок
А что находится в TWSR при этом?

P.S. Частая ошибка при работе с TWi - подача СТАРТ сразу после подачи СТОП.
Возникает оттого, что при инициации выдаче на шину условия СТОП бит TWINT в TWCR выставляется сразу, не дожидаясь
завершения формирования данного сигнала на шине. По этой причине перед подачей очередного старта нужно проверять,
завершена ли формировка ни шине условия "стоп", т.е. проверкой бита TWSTO в TWCR

P.P.S.
Пересмотрел даташит - вроде бы контроллер после записи в TWCR условия "старт" дожидается освобождения линии и
подает старт. Т.е. поссле этого контроллер может либо "зависнуть" на строке
while (!(TWCR & 0x80));
либо в TWSR может быть 2 кода - подан старт (0x08) или подан repeated start (0x10).
Oleg_DI
находится в TWSR=0
TWСR=0x94

Вопрос без slev устройства одни резисторы стоит пробовать (чтобы исключить линию появится другая ошибка все вперёд)
Александр Куличок
А что у Вас в TWAR?? случайно не адрес устройства, к которому Вы обращаетесь?
Судя по всему, случай TWSR = 0x00 возникает в режиме slave (т.е. когда адрес на шине совпал с TWAR) при ошибочном обнаружении (не генерации) на линии старта/стопа
Так что инициализцию TWAR лучше уберите.

Цитата
Вопрос без slev устройства одни резисторы стоит пробовать

Можно попробовать. Но в данном случае, думаю, это ничего не даст. Хотя могу и ошибаться.
Кстати, при отладке I2C после сброса контроллера нужно как-то сбрасывать и слейв-устройства (вернее, состояние ихнего интерфейса)
Наиболее простой способ - снятие питания. Или же програмным способом. Причина и методы решения - в http://www.analog.com/static/imported-file...7414AN686_0.pdf
Лично я делаю ДО включения аппаратного TWI так (правда, на асме):
Код
TWI_Master_Initialise:
;*            
;-    RESET I2c        
    cbi    SCL_PORT,SCL
    cbi    SDA_PORT,SDA
    cbi    SCL_DDR,SCL
    cbi    SDA_DDR,SDA    // SDA = high
    call    Wait5us


    ldi    Cnt,10
i2cNextSCL:
    sbi    SCL_DDR,SCL    // push SCL low
    call    Wait5us        // wait 5 us
    cbi    SCL_DDR,SCL    // release SCL high
ii2cWt1:    sbis    SCL_PIN,SCL    // wait SCL
    rjmp    ii2cWt1
    call    Wait5us        // wait 5 us
    dec    Cnt
    brne    i2cNextSCL



И еще.
В даташите на атмегу128, стр. 201 указано, что нельзя посылать стоп сразу после старта или повторного старта:
ATMega128, pg201:
A transmission basically consists of a START condition, a SLA+R/W, one or more data packets
and a STOP condition. An empty message, consisting of a START followed by a STOP condition,
is illegal.

Поэтому TWCR = HARD_STOP_CONDITION в строках
if ((TWSR & 0xF8) != _START) {TWCR = HARD_STOP_CONDITION; return ERROR_START;}
и
if ((TWSR & 0xF8) != _START_REPEAT) {TWCR = HARD_STOP_CONDITION; return ERROR_START;}
я бы убрал.

У меня появились еще вопросы: Ошибка возникает при первом проходе данного участка (после сброса) или при последующих?
Oleg_DI
при первом проходе сразу после инициализации twi
Александр Куличок
Цитата
при первом проходе сразу после инициализации twi

Ну, тогда уж и не знаю sad.gif
Инициализацию TWAR убрали?
Проверьте тестером (или лучше осциллографом) уровень на ножках SDA,SCL перед выполнением первой строки
TWCR = HARD_START_CONDITION;
Может, еще раз выложите проект с изменениями, включая секцию инициализации TWI. Только или вложенным файлом, или используя теги вставки кода
Oleg_DI
Разобрался по умолчанию в меге 128 стоит запрет внутрисхемной отладки .Jtag работал как будто всё делал. Александр большое спасибо пришлось отработать все версии.

сыплю голову пеплом
kanzler
Цитата(Oleg_DI @ Jan 12 2009, 09:19) *
Разобрался по умолчанию в меге 128 стоит запрет внутрисхемной отладки .Jtag работал как будто всё делал. Александр большое спасибо пришлось отработать все версии.

сыплю голову пеплом

Олег, надобыло обратиться, за разъяснениями, ко мне ... всё таки автор кода я :-)
korobov_michael
Цитата(Oleg_DI @ Jan 12 2009, 06:19) *
по умолчанию в меге 128 стоит запрет внутрисхемной отладки.


То есть таки во фьюзах была проблема. Тогда еще вопрос вдогонку. а ошибки TWI Вы ловили с помощью JTAG? Насколько я понимаю, при запрете внутрисхемной отладки невозможно устанавливать брейкпоинты, т.е. устанавливать можно, но вопрос, как в них попасть.
kanzler
Цитата(korobov_michael @ Jan 12 2009, 11:37) *
То есть таки во фьюзах была проблема. Тогда еще вопрос вдогонку. а ошибки TWI Вы ловили с помощью JTAG? Насколько я понимаю, при запрете внутрисхемной отладки невозможно устанавливать брейкпоинты, т.е. устанавливать можно, но вопрос, как в них попасть.

Приведённый выше кусок кода был разработан мной, все ошибки были отловлены с помощью JTAG. Если запретить внутрисхемную отладку, то она будет не возможна.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.