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

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> SAM7 + Mega8 и I2C
singlskv
сообщение Mar 11 2007, 01:42
Сообщение #16


дятел
*****

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



Цитата
Цитата

основная проблема TWI на SAM7 это то, что он работает в "синхронном" режиме То есть ему глубоко наплевать на то что мега держит линию SCL в 0(пока данные не готовы)и у него (SAM7) весь трансфер происходит "синхронно"то есть SAM7 вобще не мониторит состояние линии SCL перед тем как начать передачу!

Опс! Спасибо за наколку. Как-то внимания не обращал.

А они(Atmel) нигде об этом прямо и не пишут
У них есть только одна фраза на этот счет в документации:
"Модуль TWI прекрасно подходит для обмена информацией с EEPROM производства Atmel"
примерно так smile.gif

>> if(hTimer_1ms) hTimer_1ms();
>> if(hTimer_1s) hTimer_1s();
Насколько бысторо выполняются эти 2 функции ?
Цитата
Цитата

Я бы в Вашем коде тоже кое-что поменял.

Согласен, код писан 3 года назад и с тех пор кочует по проектам. Вижу косяки, только руки не доходят преписать.

Код
        case TWS_DATAW_ACK:
            //SLAVE has been transmit a byte and got ACK
            //SLAVE transmit next byte
            {
            break;
            }

любая транзакция(прерывание) по i2c должна заканчиваться записью TWINT в TWCR
иначе будем бесконечно ловить прерывания
по этому в конце switch обязательно должно быть:
default:
TWCR=(1<<TWINT)|(1<<TWEN)|(1<<TWEA)|(1<<TWIE);

так же обязательно ловить код
#define I2C_BUS_ERROR 0xF8

примерно так:
case (I2c_BUS_ERROR):
TWCR= (1<<TWINT)|(1<<TWSTO)|(1<<TWEN)|(1<<TWEA)|(1<<TWIE);

продолжение следует ....
Go to the top of the page
 
+Quote Post
singlskv
сообщение Mar 11 2007, 02:23
Сообщение #17


дятел
*****

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



Цитата(beer_warrior @ Mar 10 2007, 23:34) *
А какой формат обмена у вас?
адрес -> внутренний адрес-> данные
или
адрес -> вычитывание большого блока

скорее вот этот
адрес -> вычитывание большого блока

на самом деле много байтиков туда(SAM->mega)
и много байтиков обратно (SAM<-mega)
внутреняя адресация в SAM не используется

SAM->mega вобще без проблем
mega->SAM с вышеописанным глюком
Go to the top of the page
 
+Quote Post
beer_warrior
сообщение Mar 11 2007, 11:18
Сообщение #18


Профессионал
*****

Группа: Свой
Сообщений: 1 065
Регистрация: 8-10-05
Из: Kiev, UA
Пользователь №: 9 380



Цитата
"Модуль TWI прекрасно подходит для обмена информацией с EEPROM производства Atmel"примерно так

Это заметно И пожалуй больше не для чего. sad.gif Насколько хорош TWI у мег, настолько паскуден у АРМов. А казалось бы одна контора, могли использовать одинаковый IP-блок.

Цитата
>> if(hTimer_1ms) hTimer_1ms();>> if(hTimer_1s) hTimer_1s();Насколько бысторо выполняются эти 2 функции ?

в милисекундном стоит счетчик на 50 мс. В нем сдвиг бегущего бита и чтение порта. В секундном - мигание светодиодом.


Цитата
любая транзакция(прерывание) по i2c должна заканчиваться записью TWINT в TWCRиначе будем бесконечно ловить прерыванияпо этому в конце switch обязательно должно быть:

Вы об этом? Так я ж сказал - поскипано для ясности. Отрабатываются все возможные состояния - general call,arbitration lost итд, default тоже есть. Предусмотрена работа с раздельными буферами приема и передачи, софтовый байт статуса с флагами занятости и ошибки. А вот написано местами весьма неоптимально - весь файл представляет собой switch на 300 строк.

Цитата
скорее вот этот адрес -> вычитывание большого блока

Мне кажется это генетическое. В прошлом году делал проект, где из EEPROM вытягивалась программа в эдаком байт-коде и передавалась на исполнение. Я на вытягивание программы убил вдвое больше времени, чем на отладку интепретатора. Терялись биты в конце. Было два решения - либо ставить холостой байт в конце каждого блока либо брать меньшими порциями. Побил вычитку на блоки по 32 байта - все работает без вопросов и живет в серии.


--------------------
Вони шукають те, чого нема,
Щоб довести, що його не існує.
Go to the top of the page
 
+Quote Post
singlskv
сообщение Mar 15 2007, 03:08
Сообщение #19


дятел
*****

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



Цитата(beer_warrior @ Mar 11 2007, 11:18) *
Это заметно И пожалуй больше не для чего. sad.gif Насколько хорош TWI у мег, настолько паскуден у АРМов. А казалось бы одна контора, могли использовать одинаковый IP-блок.
в милисекундном стоит счетчик на 50 мс. В нем сдвиг бегущего бита и чтение порта. В секундном - мигание светодиодом.
Вы об этом? Так я ж сказал - поскипано для ясности. Отрабатываются все возможные состояния - general call,arbitration lost итд, default тоже есть. Предусмотрена работа с раздельными буферами приема и передачи, софтовый байт статуса с флагами занятости и ошибки. А вот написано местами весьма неоптимально - весь файл представляет собой switch на 300 строк.
Мне кажется это генетическое. В прошлом году делал проект, где из EEPROM вытягивалась программа в эдаком байт-коде и передавалась на исполнение. Я на вытягивание программы убил вдвое больше времени, чем на отладку интепретатора. Терялись биты в конце. Было два решения - либо ставить холостой байт в конце каждого блока либо брать меньшими порциями. Побил вычитку на блоки по 32 байта - все работает без вопросов и живет в серии.

Код
//SLAVE TRANSMIT
        case TWS_SLAR_ACK:
            //SLAVE device has been addressed by SLAR
            {
            TWDR = 0x55;
            TWCR;                              // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
            TWCR = TW_EXE_NACK;    //generate NACK
            break;
            }

Это то же такое "специальное" знание smile.gif

Вероятно в режиме мастера в каком-то состоянии нужно сделать нечто подобное
Go to the top of the page
 
+Quote Post
_dem
сообщение Aug 3 2007, 15:12
Сообщение #20


Местный
***

Группа: Свой
Сообщений: 263
Регистрация: 2-02-07
Из: CN, Ukraine
Пользователь №: 24 970



Кстати, решение по остановке TWI у SAM есть - просто выключаем его в PMC на необходимое время.

Если конкретно, то в таком цикле вычитки из EEPROM :

Код
    while (size-- >1){

        // Wait THR Holding register to be empty
        while (!(pTwi->TWI_SR & AT91C_TWI_TXRDY));
        /*
        AT91C_BASE_PMC->PMC_PCDR = (1<< AT91C_ID_TWI);
        sleep(10);
        AT91C_BASE_PMC->PMC_PCER = (1<< AT91C_ID_TWI);    
        */
        // Send first byte
        pTwi->TWI_THR = *(data2send++);
        
    }


приведенный финт ушами прекрасно работает
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Aug 3 2007, 19:04
Сообщение #21


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Забавно иногда смотреть. Разные программисты в разных городах и часовых поясах используют очень близкие решения. smile.gif

Я недавно бился со связкой двух мег по I2C. m640+m48. Где м48 использовалась в качестве часов+чтение датчиков, а с точки зрения м640 была 24с01. smile.gif И проблемы всплыли толь при уходе от байтового режима в страничный. На этой же шине сидели 2 микрухи 24с512.

Так вот вычислил такой момент. У меня м48 практически постоянно находилась в IDLE. Просыпалась по часам и TWI. Работала от внутреннего генератора 8MHz. Процедуры обработки - минимальны.

У меня м48 не успевала правильно обработать шину i2c в режиме слэйв с частотой свыше 150кГц. Наверное где-то не успевала просыпаться и что-то упускала. Как результат мешала работе 24с512. При снижении частоты ниже 150 - всё прекрасно заработало.

К сожалению подробности не выяснял. Как обычно - некогда. 05.gif


Кстати. Один раз я использовал для связи двух AVR SPI обмен. Плотность 8000 байт в секунду. smile.gif Всё работало совершенно устойчиво. Никаких сбоев и коллизий. Правда микрухи стояли с двух сторон одной и той же платы. То есть длина проводников - 1см. smile.gif В серию не пошло. Мы потом всё таки выкинули вторую и впёрли всю обработку в одну.
Go to the top of the page
 
+Quote Post
singlskv
сообщение Aug 3 2007, 22:14
Сообщение #22


дятел
*****

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



Цитата(SasaVitebsk @ Aug 3 2007, 23:04) *
Кстати. Один раз я использовал для связи двух AVR SPI обмен. Плотность 8000 байт в секунду. smile.gif Всё работало совершенно устойчиво. Никаких сбоев и коллизий. Правда микрухи стояли с двух сторон одной и той же платы. То есть длина проводников - 1см. smile.gif В серию не пошло. Мы потом всё таки выкинули вторую и впёрли всю обработку в одну.

В том проекте по связке SAM7+mega8 мне удалось получить устойчивую связь даже
на частоте i2c 600KHz при этом реальный(полезный) поток получился ~27000 байт/сек.
При 400KHz i2c трансфер был ~22Kb/sek
Быстрее мега не успевала готовить данные, она там еще много чем полезным занималась
(до 16 дискретных вxодов/выходов с фильтрацией, SPI, PWM, запись во
внутреннюю EEPROM, и тд ) smile.gif
И все работало на частоте меги 8MHz. smile.gif
На 16Mhz трансфер наверное был бы повыше, правда SAM7 начинал уже подтормаживать smile.gif
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Aug 4 2007, 18:52
Сообщение #23


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Мужчина! biggrin.gif
Go to the top of the page
 
+Quote Post
singlskv
сообщение Aug 4 2007, 19:26
Сообщение #24


дятел
*****

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



Цитата(SasaVitebsk @ Aug 4 2007, 22:52) *
Мужчина! biggrin.gif
Это Вы о чем ? 07.gif
Познакомиться ? biggrin.gif biggrin.gif biggrin.gif
Go to the top of the page
 
+Quote Post
Kirill Frolov
сообщение Aug 6 2007, 23:33
Сообщение #25


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

Группа: Новичок
Сообщений: 111
Регистрация: 10-02-07
Из: St.Petersburg, Russia
Пользователь №: 25 241



Цитата(beer_warrior @ Mar 10 2007, 21:35) *
Работаю со связкой - SAM7 + Mega8.


Мне сабж всю душу вымотал. Вот именно в аналогичной конфигурации.
Если вкратцее -- у at91sam7x256 недоделанный и глючый TWI. Сбоит и
зависает от любой помехи на шине. И без костылей и подпорок ™ в виде
таймаутов, принудительных сбросов и принудительной же, ручной, манипуляции сигналами с целью освободить шину от "зависших" в таком состоянии slave -- зависает вусмерть. Благо что программно сбрасывается (причём где-то за несколько десятков микросекунд -- какие там процессы при этом внутри происходят, одному Билу Гейцу известно).
При том, что сам протокол I2C так интересно устроен, что отвалившийся
невовремя мастер в свою очередь вводит в неадекватное состояние
подчинённых (TWC если когда пропал невовремя), см. выше. С AVR проще, за ним
неадекватностей не замечено, за исключением того (у меня их много),
что арбитраж в режиме slave они "умеют" (именно, что в кавычках) только
на байтовом уровне. Требуют аккуратного обращения с флагом подтверждения обработки прерывания (ВНИМАНИЕ!) и, похоже, запись в CR без паузы в пару тактов иногда не имеет действия. В итоге -- у меня работает, вроде...

А, да, ещё в догонку. AR91SAM7 не умеет "repeated start condition" (для SMBUS),
впрочем ARV их толком и не распознаёт...

Цитата
SAM7 пишет управляющий байт и читает байт статуса.
И вот интересная картина получается. Поставил как возврат статуса константу 0x55.
1. После включения питания первое чтение 0x55, второе 0xFF, все последующие - 0x55.
2. После записи первое чтение 0xFF, все последующие - 0x55.


90%, что забыл, что в конце последнего байта NACK давать надо.

А, ещё одно. Перед установкой MREAD прочитай RHR...


--------------------
[ZX]
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 - 06:37
Рейтинг@Mail.ru


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