|
AT91SAM7X I2C, Просто хотел поделиться... |
|
|
|
Jun 19 2008, 10:10
|
Участник

Группа: Участник
Сообщений: 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; } В примере записи происходит переключение скоростей под разную переферию. Используются часы, два епрома и пик. Все работает!
--------------------
Сомневаюсь, и вам советую!
|
|
|
|
|
 |
Ответов
|
Jun 20 2008, 20:57
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

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

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

|
Цитата(aaarrr @ Jun 21 2008, 01:57)  Почему-то с программным (и без мониторинга SCL) работают NXP'овские кристаллы, точнее, они почему-то не работают с аппаратным. Какие именно NXP кристалы не работают? И на какой скорости? LPC в качестве слева прекрасно связывается с SAM'овским мастером на ~100kHz. В предыдущем посте говоря (надежный как бревно) я имел в виду действительно надежный. Вместо бревно лучше сказать "скала" - нечто большое и прочное. ;> Цитата самая главная проблемма в работе i2c на sam7 заключается в том, что i2c на sam7 работает практически в синхронном режиме На мой взгляд это не проблема, и даже не фича, а то как должно быть. Не успевает слейв, значит NACK и в сад такой слейв, и освободить шину для тех кто успевает.
|
|
|
|
|
Jun 20 2008, 23:20
|
Гуру
     
Группа: Свой
Сообщений: 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, например) - так что, в сад их всех?
|
|
|
|
|
Jun 20 2008, 23:28
|

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

|
Цитата(aaarrr @ Jun 21 2008, 02:20)  Есть слейвы, которые принципиально всегда держат SCL при обращении к некоторым регистрам (TVP5150, например) - так что, в сад их всех? там же есть I2C Timing Requirements ставить подобающую скорость. (для TVPS5150 - 15kHz для тех регистров которые тормозят). Цитата Действительно выдает. тогда проблема в слейве, или в уровнях линии, сами же говорите картинка на линиях вполне хорошая. Откуда появляются чудеса? PS: я доверяю Вашему 7-ми летнему опыту работы с этими чипами, но и просто проверяю. Потому как взять вот так вот и принять на веру, что модуль недееспособен не могу.
|
|
|
|
|
Jun 20 2008, 23:40
|
Гуру
     
Группа: Свой
Сообщений: 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 с теми же линиями на той же скорости все прекрасно работает. Я не стал разбираться до конца, что же именно происходит, так как время дорого, а потрачено его было и так изрядно.
|
|
|
|
|
Jun 20 2008, 23:44
|

кекс
     
Группа: Свой
Сообщений: 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 на ровном месте?
|
|
|
|
|
Jun 21 2008, 00:16
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(defunct @ Jun 21 2008, 03:44)  Так сигналы на линии правильные или нет? На вид - да, правильные. То есть, если запустить выбор слейва в цикле (Start->Addr->Stop), то на осциллографе наблюдается стабильная картинка с периодически пропадающим ACK. И так на любой скорости. У меня этот эффект тоже вызвал недоумение. Цитата(defunct @ Jun 21 2008, 03:44)  Соглашусь. Но также согласитесь, что нормальный I2C слейв не должен вынуждать мастера ждать 100mks на ровном месте. Не соглашусь: стандарт это позволяет, значит можно  Цитата(defunct @ Jun 21 2008, 03:44)  Промоделировать ситуацию с NACK'ом у меня не вышло. Предполагаю, что причина может быть связана с генерацией START'a. Нет, START вроде как не при чем. На чтении дело обстоит еще хуже: при последовательном чтении группы регистров в какой-то момент времени SAA перестает передавать данные (скорее всего ловит STOP или NACK мастера). Цитата(defunct @ Jun 21 2008, 03:44)  А по работе с i2c слейвами с которыми работаю я, SAM'овский TWI мастер меня устраивает. Меня тоже почти все устраивало до времени. С ним у меня вполне нормально работали EEPROM'ы разных производителей, далласовские часы, TI'шные кодеки... Я даже готов был с пеной у рта доказывать, что все в порядке и просто надо читать еррату  А вот в последнем проекте пришлось перейти на софтварную реализацию.
|
|
|
|
Сообщений в этой теме
mungo AT91SAM7X I2C Jun 19 2008, 10:10 aaarrr Без прерываний, без контроля ошибок...
Я не хочу ... Jun 19 2008, 12:16 mungo На вкус и цвет...
Суть: ЭТО действительно работает... Jun 20 2008, 09:59 xelax Цитата(mungo @ Jun 20 2008, 13:59) На вку... Jun 20 2008, 10:14 aaarrr Цитата(mungo @ Jun 20 2008, 13:59) А насч... Jun 20 2008, 10:15     defunct Цитата(aaarrr @ Jun 21 2008, 02:10) SAA71... Jun 20 2008, 23:21      aaarrr Действительно выдает. Jun 20 2008, 23:21          aaarrr Цитата(defunct @ Jun 21 2008, 04:23) Очен... Jun 21 2008, 00:36           defunct Цитата(aaarrr @ Jun 21 2008, 03:36) Фронт... Jun 21 2008, 01:13  singlskv Цитата(defunct @ Jun 21 2008, 02:52) В эт... Jun 22 2008, 16:54   defunct Цитата(singlskv @ Jun 22 2008, 19:54) ИМХ... Jun 29 2008, 01:43    aaarrr Цитата(defunct @ Jun 29 2008, 05:43) Прир... Jun 29 2008, 12:15     Andrew Lekar ЦитатаЕсли придерживаться стандарта, то в софтверн... Sep 10 2009, 17:40      aaarrr Цитата(Andrew Lekar @ Sep 10 2009, 21:40)... Sep 10 2009, 17:51 aaarrr Детально я эту форму не изучал - для этого нужно з... Jun 21 2008, 10:33
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|