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

 
 
> 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
 
Start new topic
Ответов
singlskv
сообщение Jun 20 2008, 20:57
Сообщение #2


дятел
*****

Группа: Свой
Сообщений: 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
Сообщение #3


кекс
******

Группа: Свой
Сообщений: 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

Сообщений в этой теме
- 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
|- - aaarrr   Цитата(defunct @ Jun 21 2008, 02:52) Собс...   Jun 20 2008, 22:57
||- - defunct   Цитата(aaarrr @ Jun 21 2008, 01:57) Почем...   Jun 20 2008, 23:06
||- - aaarrr   Цитата(defunct @ Jun 21 2008, 03:06) Каки...   Jun 20 2008, 23:20
||- - defunct   Цитата(aaarrr @ Jun 21 2008, 02:10) SAA71...   Jun 20 2008, 23:21
|||- - aaarrr   Действительно выдает.   Jun 20 2008, 23:21
||- - defunct   Цитата(aaarrr @ Jun 21 2008, 02:20) Есть ...   Jun 20 2008, 23:28
||- - aaarrr   Цитата(defunct @ Jun 21 2008, 03:28) там ...   Jun 20 2008, 23:40
||- - defunct   Цитата(aaarrr @ Jun 21 2008, 02:40) Нет, ...   Jun 20 2008, 23:44
||- - aaarrr   Цитата(defunct @ Jun 21 2008, 03:44) Так ...   Jun 21 2008, 00:16
||- - defunct   Цитата(aaarrr @ Jun 21 2008, 03:16) На ви...   Jun 21 2008, 00:23
||- - 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


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

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 11:54
Рейтинг@Mail.ru


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