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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> twi atmega 128, twi atmega 128
Oleg_DI
сообщение Jan 11 2009, 16:42
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 49
Регистрация: 15-10-07
Из: г.Екатеринбург
Пользователь №: 31 379



помогите разобраться с 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;
Go to the top of the page
 
+Quote Post
korobov_michael
сообщение Jan 11 2009, 17:12
Сообщение #2


Частый гость
**

Группа: Свой
Сообщений: 118
Регистрация: 11-03-07
Из: Украина, Харьков
Пользователь №: 26 059



Цитата(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? Приведи полный кусок инициализации
Go to the top of the page
 
+Quote Post
Oleg_DI
сообщение Jan 11 2009, 17:32
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 49
Регистрация: 15-10-07
Из: г.Екатеринбург
Пользователь №: 31 379



мастер
//TWSR=0x00;
//TWBR=0x42;
//TWAR=0x0d;
//TWCR=0x04;
Go to the top of the page
 
+Quote Post
korobov_michael
сообщение Jan 11 2009, 17:41
Сообщение #4


Частый гость
**

Группа: Свой
Сообщений: 118
Регистрация: 11-03-07
Из: Украина, Харьков
Пользователь №: 26 059



1. На всякий случай, фьюзы соответствуют друг другу?

2. Можешь прилинковать проект?
Go to the top of the page
 
+Quote Post
Oleg_DI
сообщение Jan 11 2009, 17:51
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 49
Регистрация: 15-10-07
Из: г.Екатеринбург
Пользователь №: 31 379



Да фьюзы соответствуют
//===================================================
//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;
}
Go to the top of the page
 
+Quote Post
Александр Куличо...
сообщение Jan 11 2009, 17:59
Сообщение #6


Местный
***

Группа: Свой
Сообщений: 256
Регистрация: 6-03-06
Из: Украина, г. Винница
Пользователь №: 15 017



Внешние подтяжки присутствуют? SDA, SCL на землю не засажены?
З.Ы. если Ваше устройство работает только как мастер и не переключается в режим slave, то TWAR Вам не нужен.
Go to the top of the page
 
+Quote Post
Oleg_DI
сообщение Jan 11 2009, 18:07
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 49
Регистрация: 15-10-07
Из: г.Екатеринбург
Пользователь №: 31 379



резисторы 4.7к . Две разные платы с мегой 128 не работают плата с мегой 16 работает
Go to the top of the page
 
+Quote Post
Александр Куличо...
сообщение Jan 11 2009, 18:11
Сообщение #8


Местный
***

Группа: Свой
Сообщений: 256
Регистрация: 6-03-06
Из: Украина, г. Винница
Пользователь №: 15 017



Проверьте на всякий случай, все ли ножки питания/массы мег128 подсоединены
Частоты 16 и 128 мег одинаковые?
Цитата
выдаёт ошибку условия старт

В каком месте? там, где start или repeated start?
Go to the top of the page
 
+Quote Post
Oleg_DI
сообщение Jan 11 2009, 18:25
Сообщение #9


Участник
*

Группа: Участник
Сообщений: 49
Регистрация: 15-10-07
Из: г.Екатеринбург
Пользователь №: 31 379



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

Да частоты одинаковые 14 745 кгц
Go to the top of the page
 
+Quote Post
Александр Куличо...
сообщение Jan 11 2009, 18:36
Сообщение #10


Местный
***

Группа: Свой
Сообщений: 256
Регистрация: 6-03-06
Из: Украина, г. Винница
Пользователь №: 15 017



А что находится в TWSR при этом?

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

P.P.S.
Пересмотрел даташит - вроде бы контроллер после записи в TWCR условия "старт" дожидается освобождения линии и
подает старт. Т.е. поссле этого контроллер может либо "зависнуть" на строке
while (!(TWCR & 0x80));
либо в TWSR может быть 2 кода - подан старт (0x08) или подан repeated start (0x10).
Go to the top of the page
 
+Quote Post
Oleg_DI
сообщение Jan 11 2009, 19:09
Сообщение #11


Участник
*

Группа: Участник
Сообщений: 49
Регистрация: 15-10-07
Из: г.Екатеринбург
Пользователь №: 31 379



находится в TWSR=0
TWСR=0x94

Вопрос без slev устройства одни резисторы стоит пробовать (чтобы исключить линию появится другая ошибка все вперёд)
Go to the top of the page
 
+Quote Post
Александр Куличо...
сообщение Jan 11 2009, 19:49
Сообщение #12


Местный
***

Группа: Свой
Сообщений: 256
Регистрация: 6-03-06
Из: Украина, г. Винница
Пользователь №: 15 017



А что у Вас в 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;}
я бы убрал.

У меня появились еще вопросы: Ошибка возникает при первом проходе данного участка (после сброса) или при последующих?
Go to the top of the page
 
+Quote Post
Oleg_DI
сообщение Jan 11 2009, 20:13
Сообщение #13


Участник
*

Группа: Участник
Сообщений: 49
Регистрация: 15-10-07
Из: г.Екатеринбург
Пользователь №: 31 379



при первом проходе сразу после инициализации twi
Go to the top of the page
 
+Quote Post
Александр Куличо...
сообщение Jan 11 2009, 20:59
Сообщение #14


Местный
***

Группа: Свой
Сообщений: 256
Регистрация: 6-03-06
Из: Украина, г. Винница
Пользователь №: 15 017



Цитата
при первом проходе сразу после инициализации twi

Ну, тогда уж и не знаю sad.gif
Инициализацию TWAR убрали?
Проверьте тестером (или лучше осциллографом) уровень на ножках SDA,SCL перед выполнением первой строки
TWCR = HARD_START_CONDITION;
Может, еще раз выложите проект с изменениями, включая секцию инициализации TWI. Только или вложенным файлом, или используя теги вставки кода
Go to the top of the page
 
+Quote Post
Oleg_DI
сообщение Jan 12 2009, 04:19
Сообщение #15


Участник
*

Группа: Участник
Сообщений: 49
Регистрация: 15-10-07
Из: г.Екатеринбург
Пользователь №: 31 379



Разобрался по умолчанию в меге 128 стоит запрет внутрисхемной отладки .Jtag работал как будто всё делал. Александр большое спасибо пришлось отработать все версии.

сыплю голову пеплом
Go to the top of the page
 
+Quote Post

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

 


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


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