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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> AT91SAM7X I2C, Просто хотел поделиться...
mungo
сообщение Jun 19 2008, 10:10
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 63
Регистрация: 21-09-07
Из: СССР
Пользователь №: 30 719



Много раз читал тут, что у людей аппаратный и-квадрат в этом камне не работает. Видел софтовые реализации.
Однажды я наткнулся на пример от атмела и сделал свою реализацию. Работает уже год без проблем.
Сначала запуск железа:
Код
AT91F_PMC_EnablePeriphClock(AT91C_BASE_PMC,(1<<AT91C_ID_TWI));
*AT91C_TWI_CWGR=0x033C3C;

Ну ессно и ножки включить, тут думаю каждый справится.
Далее собсна чтение:
Код
void    ReadI2C(char *s,unsigned count,char dev,word iaddr)
{
unsigned    i,stt,j;
if (count==0) return;
*AT91C_TWI_CWGR=0x030F0F;
*AT91C_TWI_CR=AT91C_TWI_MSEN;
stt=*AT91C_TWI_SR; while (!(stt&AT91C_TWI_TXCOMP)) {stt=*AT91C_TWI_SR;}
if (dev==0xD0) i=AT91C_TWI_IADRSZ_1_BYTE; else i=AT91C_TWI_IADRSZ_2_BYTE;
*AT91C_TWI_IADR=iaddr;
*AT91C_TWI_MMR=(dev<<15)|i|AT91C_TWI_MREAD;
if (count==1) {
*AT91C_TWI_CR=AT91C_TWI_START|AT91C_TWI_STOP;
stt=*AT91C_TWI_SR; while (!(stt&AT91C_TWI_TXCOMP)) {stt=*AT91C_TWI_SR;}
s[0]=*AT91C_TWI_RHR;
*AT91C_TWI_CR=AT91C_TWI_MSDIS;
return;
} else *AT91C_TWI_CR=AT91C_TWI_START;
s[0]=*AT91C_TWI_RHR;
for (i=0; i<count; i++) {
stt=*AT91C_TWI_SR; j=10000; while (!(stt&AT91C_TWI_RXRDY)&&--j) {stt=*AT91C_TWI_SR;}
if (!j) {error|=NOEEP; return;}
s[i]=*AT91C_TWI_RHR;
}
*AT91C_TWI_CR=AT91C_TWI_STOP;
stt=*AT91C_TWI_SR; while (!(stt&AT91C_TWI_TXCOMP)) {stt=*AT91C_TWI_SR;}
*AT91C_TWI_CR=AT91C_TWI_MSDIS;
}

И запись:
Код
void    WriteI2C(char *s,unsigned count,char dev,word iaddr)
{
unsigned    i,stt,j;
if (count==0) return;
switch (dev) {
    case    0xEE: i=AT91C_TWI_IADRSZ_NO; *AT91C_TWI_CWGR=0x033C3C; break;
    case    0xD0: i=AT91C_TWI_IADRSZ_1_BYTE; *AT91C_TWI_CWGR=0x030F0F; break;
    case    0xA6:
    case    0xA0: i=AT91C_TWI_IADRSZ_2_BYTE; *AT91C_TWI_CWGR=0x030F0F; break;
}
*AT91C_TWI_CR=AT91C_TWI_MSEN;
stt=*AT91C_TWI_SR; j=20000; while (!(stt&AT91C_TWI_TXCOMP)&&--j) {stt=*AT91C_TWI_SR;}
*AT91C_TWI_MMR=(dev<<15)|i;
*AT91C_TWI_IADR=iaddr;
if (count==1) {
*AT91C_TWI_CR=AT91C_TWI_START|AT91C_TWI_STOP;
*AT91C_TWI_THR=s[0];
stt=*AT91C_TWI_SR; j=20000; while (!(stt&AT91C_TWI_TXCOMP)&&--j) {stt=*AT91C_TWI_SR;}
*AT91C_TWI_CR=AT91C_TWI_MSDIS;
return;
} else *AT91C_TWI_CR=AT91C_TWI_START;
for (i=0; i<count; i++) {
*AT91C_TWI_THR=s[i];
stt=*AT91C_TWI_SR; j=20000; while (!(stt&AT91C_TWI_TXRDY)&&--j) {stt=*AT91C_TWI_SR;}
if (!j) {
error|=NOEEP;
return;}
}
*AT91C_TWI_CR=AT91C_TWI_STOP;
stt=*AT91C_TWI_SR; j=20000; while (!(stt&AT91C_TWI_TXCOMP)&&--j) {stt=*AT91C_TWI_SR;}
*AT91C_TWI_CR=AT91C_TWI_MSDIS;
}


В примере записи происходит переключение скоростей под разную переферию. Используются часы, два епрома и пик. Все работает!


--------------------
Сомневаюсь, и вам советую!
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jun 19 2008, 12:16
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Без прерываний, без контроля ошибок...

Я не хочу сказать, что I2C у SAM'ов полностью неработоспособен, в некоторых случаях - и работа с EEPROM тому пример - он вполне может работать.
Только недостатков слишком уж много:
- Поддержки PDC нет, зато случается Overrun (и это в мастер режиме!).
- С NXP мы не дружим (SAA7113 просто периодически выдает NAK'и).
- Про еррату и полностью неработоспособный слейв я вообще молчу.

Ну не стал бы, поверьте, Atmel заменять полностью модуль I2C в новых кристаллах, если бы все было в порядке.
Go to the top of the page
 
+Quote Post
mungo
сообщение Jun 20 2008, 09:59
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 63
Регистрация: 21-09-07
Из: СССР
Пользователь №: 30 719



На вкус и цвет...
Суть: ЭТО действительно работает, и если кто уже столкнулся, не нужно изобретать.
А насчет прерываний - а зачем? При операции записи ещё куда ни шло, а при чтении - в любом случае нужно ждать данных.


--------------------
Сомневаюсь, и вам советую!
Go to the top of the page
 
+Quote Post
xelax
сообщение Jun 20 2008, 10:14
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 370
Регистрация: 7-11-06
Пользователь №: 22 035



Цитата(mungo @ Jun 20 2008, 13:59) *
На вкус и цвет...
Суть: ЭТО действительно работает, и если кто уже столкнулся, не нужно изобретать.
А насчет прерываний - а зачем? При операции записи ещё куда ни шло, а при чтении - в любом случае нужно ждать данных.


А все остальные задачи тоже должны ждать пока I2C освободится??? 07.gif
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jun 20 2008, 10:15
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(mungo @ Jun 20 2008, 13:59) *
А насчет прерываний - а зачем? При операции записи ещё куда ни шло, а при чтении - в любом случае нужно ждать данных.

А при записи ждать не нужно что-ли?

Насчет прерываний смотрите первый из недостатков, упомянутых мной в предыдущем посте. Не успели обслужить I2C - вылетели с треском в overrun; в многозадачной системе это более чем вероятно. Прерыванию хотя бы можно приоритет поставить повыше.
Go to the top of the page
 
+Quote Post
singlskv
сообщение Jun 20 2008, 20:57
Сообщение #6


дятел
*****

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



Цитата(mungo @ Jun 19 2008, 14:10) *
Много раз читал тут, что у людей аппаратный и-квадрат в этом камне не работает. Видел софтовые реализации.
Однажды я наткнулся на пример от атмела и сделал свою реализацию. Работает уже год без проблем.
Он как бы работает но не совсем, самая главная проблемма в работе
i2c на sam7 заключается в том, что i2c на sam7 работает практически в синхронном режиме,
те рассчитывать на то что slave может задержать транзакцию на неопределенное время не
приходиться....

то есть слейв просто должен начинать отвечать практически мгновенно...

для железок типа EEPROM это всегда выполняется...
Go to the top of the page
 
+Quote Post
defunct
сообщение Jun 20 2008, 22:52
Сообщение #7


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(singlskv @ Jun 20 2008, 23:57) *
рассчитывать на то что slave может задержать транзакцию на неопределенное время не
приходиться....

В этом есть своя прелесть, меньше шансов подвесить систему слейвом. Да и нечего слейву тормозить транзакцию. Слейв должен укладываться в клок мастера, иначе - надо снижать скорость.

Собсно программный I2C (надежный как бревно) разве чем-то отличается? Тоже синхронный.
Или кто-то мониторит SCL?
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jun 20 2008, 22:57
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(defunct @ Jun 21 2008, 02:52) *
Собсно программный I2C (надежный как бревно) разве чем-то отличается? Тоже синхронный.
Или кто-то мониторит SCL?

Почему-то с программным (и без мониторинга SCL) работают NXP'овские кристаллы, точнее, они почему-то не работают с аппаратным.
Go to the top of the page
 
+Quote Post
defunct
сообщение Jun 20 2008, 23:06
Сообщение #9


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(aaarrr @ Jun 21 2008, 01:57) *
Почему-то с программным (и без мониторинга SCL) работают NXP'овские кристаллы, точнее, они почему-то не работают с аппаратным.

Какие именно NXP кристалы не работают? И на какой скорости?
LPC в качестве слева прекрасно связывается с SAM'овским мастером на ~100kHz.

В предыдущем посте говоря (надежный как бревно) я имел в виду действительно надежный. Вместо бревно лучше сказать "скала" - нечто большое и прочное. ;>

Цитата
самая главная проблемма в работе i2c на sam7 заключается в том, что i2c на sam7 работает практически в синхронном режиме

На мой взгляд это не проблема, и даже не фича, а то как должно быть.
Не успевает слейв, значит NACK и в сад такой слейв, и освободить шину для тех кто успевает.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jun 20 2008, 23:20
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(defunct @ Jun 21 2008, 03:06) *
Какие именно NXP кристалы не работают? И на какой скорости?

SAA7113, на любой. При этом картинка на линиях вроде бы вполне себе хорошая, да вот только слейв переодически выдает NAK.

Цитата(defunct @ Jun 21 2008, 03:06) *
Не успевает слейв, значит NACK и в сад такой слейв, и освободить шину для тех кто успевает.

Есть слейвы, которые принципиально всегда держат SCL при обращении к некоторым регистрам (TVP5150, например) - так что, в сад их всех?
Go to the top of the page
 
+Quote Post
defunct
сообщение Jun 20 2008, 23:21
Сообщение #11


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(aaarrr @ Jun 21 2008, 02:10) *
SAA7113, на любой. При этом картинка на линиях вроде бы вполне себе хорошая, да вот только слейв переодически выдает NAK.

Он действительно его выдает, или так сообщает SAM'овская логика?
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jun 20 2008, 23:21
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Действительно выдает.
Go to the top of the page
 
+Quote Post
defunct
сообщение Jun 20 2008, 23:28
Сообщение #13


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(aaarrr @ Jun 21 2008, 02:20) *
Есть слейвы, которые принципиально всегда держат SCL при обращении к некоторым регистрам (TVP5150, например) - так что, в сад их всех?

там же есть I2C Timing Requirements
ставить подобающую скорость. (для TVPS5150 - 15kHz для тех регистров которые тормозят).

Цитата
Действительно выдает.

тогда проблема в слейве, или в уровнях линии, сами же говорите картинка на линиях вполне хорошая. Откуда появляются чудеса?

PS: я доверяю Вашему 7-ми летнему опыту работы с этими чипами, но и просто проверяю. Потому как взять вот так вот и принять на веру, что модуль недееспособен не могу.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jun 20 2008, 23:40
Сообщение #14


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(defunct @ Jun 21 2008, 03:28) *
там же есть I2C Timing Requirements
ставить подобающую скорость. (для TVPS5150 - 15kHz для тех регистров которые тормозят).

Согласитесь, что нормальный I2C-контроллер не должен вынуждать пользователя заниматься такими извращениями - ронять скорость обмена в 30 раз.

Цитата(defunct @ Jun 21 2008, 03:28) *
тогда проблема в слейве, или в уровнях линии, сами же говорите картинка на линиях вполне хорошая. Откуда появляются чудеса?

Нет, не в слейве, т.к. на софтверном I2C с теми же линиями на той же скорости все прекрасно работает.
Я не стал разбираться до конца, что же именно происходит, так как время дорого, а потрачено его было и так изрядно.
Go to the top of the page
 
+Quote Post
defunct
сообщение Jun 20 2008, 23:44
Сообщение #15


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(aaarrr @ Jun 21 2008, 02:40) *
Нет, не в слейве, т.к. на софтверном I2C с теми же линиями на той же скорости все прекрасно работает.

Так сигналы на линии правильные или нет?
Пока имеем из Ваших слов:

Цитата
При этом картинка на линиях вроде бы вполне себе хорошая


Значит мастер шлет правильные сигналы?
Тогда возникает вопрос - почему же при правильных сигналах:
Цитата
да вот только слейв переодически выдает NAK. (Действительно выдает.)

?
Вопрос открытый т.к.
Цитата
Я не стал разбираться до конца, что же именно происходит, так как время дорого, а потрачено его было и так изрядно.

Понимаю. Промоделировать ситуацию с NACK'ом у меня не вышло. Предполагаю, что причина может быть связана с генерацией START'a.
А по работе с i2c слейвами с которыми работаю я, SAM'овский TWI мастер меня устраивает.

Цитата
Согласитесь, что нормальный I2C-контроллер не должен вынуждать пользователя заниматься такими извращениями - ронять скорость обмена в 30 раз.

Соглашусь, не должен. (только софтверная реализация ведь еще сильнее будет бить по производительности...). А согласитесь ли Вы, что нормальный I2C слейв не должен вынуждать мастера ждать ~100mks на ровном месте?
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:49
Рейтинг@Mail.ru


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