|
|
  |
DS1307Z +AtMega128, Нет старта на TWI |
|
|
|
Jul 11 2011, 20:44
|
Частый гость
 
Группа: Участник
Сообщений: 79
Регистрация: 10-08-09
Пользователь №: 51 828

|
Здравствуйте! Столкнулся с проблемой. Модуль TWI отказывается инициировать на шине состояние START. Точнее я не знаю, может оно и создается, но только после установки флага TWINT в TWCR в регистр TWSR почему то загружается значение (0xEC) вместо обещанного (0x08). Я в шоке. Чего я только не пробовал. Сразу приведу функцию установки состояния START. Если кто сталкивался с подобной проблемой подскажите в чём тут дело? Код //Инициализация i2c шины. TWBR |= 1<<TWBR6|1<<TWBR5|1<<TWBR1|1<<TWBR0; //Резонатор 14.7456МГц. TWSR &= (~((1<<TWPS1)|(1<<TWPS0))); TWAR |= 1<<TWA0|1<<TWA1|1<<TWA3|1<<TWA5; //задано произвольно просто чтоб было. МК - мастер. TWAR &= (~((1<<TWGCE))); //запрещаю всякие там общие вызовы моего МК. DDRD |= 1<<PD0|1<<PD1; //SDA и SCL делаю как выходы + PullAp. PORTD |= 1<<PD0|1<<PD1;
//************************************************* //А это сама функция старт i2c соединения //************************************************* static unsigned char i2c_start(void) { TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN); //Устанавливается состояние START while (!(TWCR & (1<<TWINT))); //Задержка до установки флага TWINT. Он означает что //состояние START было передано if ((TWSR & 0xF8) == START) //Проверяем значение в TWI Status Register {WriteDisplay(0x30); return(0);} else {WriteDisplay(0x31); WriteIndLed(TWSR); return(1);} } Почему то после прогона МК этой функции светодиоды зажигаются так, что это соответствует коду (0xEC). Значение "0" на дисплее не видел ни разу хоть умри. Кстати для чистоты эксперимента выпаял с шины все девайсы кроме DS1307Z - часы.
Сообщение отредактировал IgorKossak - Jul 12 2011, 07:29
Причина редактирования: Оформление кода
|
|
|
|
|
Jul 12 2011, 04:59
|
Местный
  
Группа: Участник
Сообщений: 298
Регистрация: 26-01-09
Из: Пермь
Пользователь №: 43 940

|
1. Инициализировать регистры надо полностью, избавьтесь от &= и |= Код TWBR = (1<<TWBR6) | (1<<TWBR5) | (1<<TWBR1) | (1<<TWBR0); TWSR = 0; TWAR = 0; 2. i2c_start() вызывается в цикле или однократно? питание DS1307 скорее всего не скидывается? Можно предположить, что ваши светодиоды зажигаются другой полярностью и ((~0xEC) & 0xF8)=0x10 - Restart transmitted Значения 0xEC вообще нет в таблицах статусных кодов TWI 3. перепишите условие так: Код #define START 0x08 #define RESTART 0x10 ...... ...... unsigned char st; ...... ...... st = TWSR & 0xF8; if ((st== START) || (st==RESTART)) ........ 4. осциллом что видно на шине?
|
|
|
|
|
Jul 12 2011, 10:44
|

Профессионал
    
Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339

|
Не знаю , конечно , но вот эти строчки мне абсолютно не нравятся. Цитата TWBR |= 1<<TWBR6|1<<TWBR5|1<<TWBR1|1<<TWBR0; TWSR = 0; //&= (~((1<<TWPS1)|(1<<TWPS0))); Поставька вместо них формулу TWBR|=SYSCLK/(2*SCL_Freq)-8 ;TWI Bit Rate Register - TWBRSYSCLK=14.7456МГц SCL_Freq= 100Khz В итоге в TWBR пишется 0х41 так, что ещё и прескалер нафинг не нужон TWSR = 0; //&= (~(( 0<<TWPS1)|( 0<<TWPS0)));
--------------------
Закон Мерфи:
Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
|
|
|
|
|
Jul 12 2011, 21:30
|
Частый гость
 
Группа: Участник
Сообщений: 79
Регистрация: 10-08-09
Пользователь №: 51 828

|
Цитата(ILYAUL @ Jul 12 2011, 14:44)  Не знаю , конечно , но вот эти строчки мне абсолютно не нравятся.
Поставька вместо них формулу TWBR|=SYSCLK/(2*SCL_Freq)-8 ;TWI Bit Rate Register - TWBR SYSCLK=14.7456МГц SCL_Freq= 100Khz В итоге в TWBR пишется 0х41 так, что ещё и прескалер нафинг не нужон TWSR = 0; //&= (~((0<<TWPS1)|(0<<TWPS0))); Да согласен так лучше. Видать ассемблер во мне еще не совсем переломался. Очень по деловому замутчено. Я поменял МК на мегу 64 и то же самое почти осталось за исключением кода в TWSR. Теперь в нем код стал читабельным и светодиоды его высветили как $A0, что, насколько я понимаю, означает "Было обнаружено состояние СТАРТ или ПОВСТАРТ в то время, когда устройство было адресовано в качестве ведомого". Всетаки 128 Мегу я чем то кайфанул  . Да, но теперь, когда я от шины i2c откинул все ноги - шина сейчас пустая! Как может быть 0xA0?
Сообщение отредактировал MaksimYrievich - Jul 12 2011, 22:02
|
|
|
|
|
Jul 13 2011, 06:06
|

Профессионал
    
Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339

|
Цитата(MaksimYrievich @ Jul 13 2011, 01:30)  Да согласен так лучше. Видать ассемблер во мне еще не совсем переломался. Очень по деловому замутчено. Я поменял МК на мегу 64 и то же самое почти осталось за исключением кода в TWSR. Теперь в нем код стал читабельным и светодиоды его высветили как $A0, что, насколько я понимаю, означает "Было обнаружено состояние СТАРТ или ПОВСТАРТ в то время, когда устройство было адресовано в качестве ведомого". Всетаки 128 Мегу я чем то кайфанул  . Да, но теперь, когда я от шины i2c откинул все ноги - шина сейчас пустая! Как может быть 0xA0? Ну и что я увидел в приложенном коде Цитата TWSR = 0; //&= (~((1<<TWPS1)|(1<<TWPS0))); а что было написано чуть выше? Ну и проц заменен , тогда и это надо менять #include "AtMega128_PHR_04_02_Init.h"ЗЫ Кстати формула взята из проекта на asm ЗЫ ЗЫ И вот ещё Цитата DDRD |= 1<<PD0|1<<PD1; //PORTD |= 1<<PD0|1<<PD1; Шина TWI она же I2C требует внешних PULL резисторов - приблизительно 4,7 Ком поэтому внутренняя подтяжка (строчка 2) ей пофинг. Они у Вас есть? Внутренние ~ 30 Kom Портам ,в режиме альтернатыных функций , например TWI - плевать как сконфигурирован порт (кроме специально обговорённых режимов- читать DS) . Вход он или выход, начхать, так что удаляйте эти две строки и если резисторов нет - "вешайте"
--------------------
Закон Мерфи:
Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
|
|
|
|
|
Jul 13 2011, 09:27
|
Частый гость
 
Группа: Участник
Сообщений: 79
Регистрация: 10-08-09
Пользователь №: 51 828

|
Цитата(ILYAUL @ Jul 13 2011, 10:06)  Шина TWI она же I2C требует внешних PULL резисторов - приблизительно 4,7 Ком поэтому внутренняя подтяжка (строчка 2) ей пофинг. Они у Вас есть? Внутренние ~ 30 Kom Да внешние резисторы висят 4.7 кОм. Всё равно пишет что устройство уже адресовано код я тоже переделал. А может быть это какая нибудь наводка на шину идет? Может конденсаторы на нее прилепить?
|
|
|
|
|
Jul 13 2011, 09:48
|
Частый гость
 
Группа: Участник
Сообщений: 79
Регистрация: 10-08-09
Пользователь №: 51 828

|
Цитата(ILYAUL @ Jul 13 2011, 13:45)  Вы прескалер убрали? Да я Убрал прескаллер
Сообщение отредактировал MaksimYrievich - Jul 13 2011, 09:49
|
|
|
|
|
Jul 13 2011, 10:28
|

Профессионал
    
Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339

|
Цитата(MaksimYrievich @ Jul 13 2011, 13:48)  Да я Убрал прескаллер Вы , что старый код положили? Цитата //Инициализируем i2c шину. TWBR |= SYSCLK/(2*SCL_Freq)-8 ; //TWSR &= (~((1<<TWPS1)|(1<<TWPS0))); здесь деление частоты на 64 - эта строчка должна быть удалена. Это прескалер и где Вы его убрали? TWAR |= 1<<TWA0|1<<TWA1|1<<TWA3|1<<TWA5; //TWAR &= (~((1<<TWGCE))); //DDRD |= 1<<PD0|1<<PD1; //PORTD |= 1<<PD0|1<<PD1; Эти две тоже - удалить В asm ,раз уж Вы его знаете, это всё что нужно для инит I2C (TWI): Код ;************************************************** ;* ;;/Init Bit Rate fot TWI;;* * ;************************************************** ldi temp,SYSCLK/(2*SCL_Freq)-8 ;TWI Bit Rate Register - TWBR sts TWBR,temp ;+ TWI=384 Khz ;************************************************** А так выглядит START и ПОВСТАРТ: Код ;************************************************** ;* ;;+Подпрограмма Init TWI_START;;* * ;* ;;+Формирование START и проверка ответа.;;* * ;************************************************** TWI_START: ldi temp,(1<<TWINT)|(1<<TWSTA)|(1<<TWEN) sts TWCR,temp ; формирование режима START waitST: lds temp,TWCR ; Проверка бита TWINT sbrs temp,TWINT rjmp waitST ; Не получен -цикл lds temp,TWSR ; Проверка кода ответа cpi temp,START breq RETURN ; Правильный код -выход из подпрограммы cpi temp,REPSTART brne TWI_START ; Нет - повтор. RETURN: ret
--------------------
Закон Мерфи:
Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
|
|
|
|
|
Jul 13 2011, 10:38
|
Частый гость
 
Группа: Участник
Сообщений: 79
Регистрация: 10-08-09
Пользователь №: 51 828

|
Цитата(ILYAUL @ Jul 13 2011, 14:28)  Вы , что старый код положили? Так они же закоментированы?
Сообщение отредактировал MaksimYrievich - Jul 13 2011, 10:41
|
|
|
|
|
Jul 13 2011, 10:44
|

Профессионал
    
Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339

|
Цитата(MaksimYrievich @ Jul 13 2011, 14:38)  Так они же закоментированы? Да,не обратил внимание. SCL SDA не перепутали? И закоментируйте Цитата TWAR |= 1<<TWA0|1<<TWA1|1<<TWA3|1<<TWA5; И это почему осталось старой , если проц уже другой Цитата #include "AtMega128_PHR_04_02_Init.h"
--------------------
Закон Мерфи:
Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
|
|
|
|
|
Jul 13 2011, 10:46
|
Частый гость
 
Группа: Участник
Сообщений: 79
Регистрация: 10-08-09
Пользователь №: 51 828

|
Цитата(ILYAUL @ Jul 13 2011, 14:44)  SCL SDA не перепутали? Нет не перепутал. причем даже если ноги у МК оторвать от шины то всё равно в TWSR 0xA0 получается
|
|
|
|
|
Jul 13 2011, 11:04
|

Профессионал
    
Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339

|
Цитата(MaksimYrievich @ Jul 13 2011, 14:46)  Нет не перепутал. причем даже если ноги у МК оторвать от шины то всё равно в TWSR 0xA0 получается Да, нужен осцил . У Вас питания проца и DS не разные случайно? И судя по коду 0xA0 проц находится в режиме "ведомого приемника". И это из-за TWAR т.к. Вы внесли в него адрес А как только в TWCR Вы устанавливаете TWEA и TWEN - он вкл. режим "Ведомый приемник" и ждёт когда его адресуют TWAR - заносится личный адрес процессора на шине TWI, если процессоров в проекте не один и они могут адрресовать друг друга - в режиме с одним процем и если он должен быть мастером там должны быть 00000000
--------------------
Закон Мерфи:
Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|