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

 
 
> 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

Сообщений в этой теме
- 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
- - singlskv   Цитата(mungo @ Jun 19 2008, 14:10) Много ...   Jun 20 2008, 20:57
|- - defunct   Цитата(singlskv @ Jun 20 2008, 23:57) рас...   Jun 20 2008, 22:52
|- - 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 Текстовая версия Сейчас: 18th July 2025 - 10:00
Рейтинг@Mail.ru


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