|
TWI в sam7s |
|
|
|
Jan 29 2008, 17:11
|

Частый гость
 
Группа: Свой
Сообщений: 169
Регистрация: 17-09-07
Из: Красноярск
Пользователь №: 30 600

|
Впервые для себя запускаю TWI на sam7s. Использована атмеловская lib_twi Запись Код int AT91F_TWI_WriteSingle(const AT91PS_TWI pTwi, int SlaveAddr, char *data) { unsigned int end = 0, status, err=0;
/* Enable Master Mode */ // AT91C_BASE_TWI->TWI_CR = AT91C_TWI_MSEN;
/* Set the TWI Master Mode Register */ AT91C_BASE_TWI->TWI_MMR = (SlaveAddr<<16 ) & ~AT91C_TWI_MREAD;
/* Write the data to send into THR. Start conditionn DADDR and R/W bit are sent automatically */ AT91C_BASE_TWI->TWI_THR = *data; AT91C_BASE_TWI->TWI_CR = AT91C_TWI_START;
/* NACK errata handling */ /* Do not poll the TWI_SR */ /* Wait 3 x 9 TWCK pulse (max) 2 if IADRR not used, before reading TWI_SR */ /* From 400Khz down to 1Khz, the time to wait will be in µs range.*/ /* In this example the TWI period is 1/400KHz */ AT91F_TWI_WaitMicroSecond (40);
while (!end) { status = AT91C_BASE_TWI->TWI_SR; if ((status & AT91C_TWI_NACK) == AT91C_TWI_NACK) { err++; end=1; } /* Wait for the Transmit ready is set */ if ((status & AT91C_TWI_TXRDY) == AT91C_TWI_TXRDY) end=1; } AT91C_BASE_TWI->TWI_CR = AT91C_TWI_STOP; /* Wait for the Transmit complete is set */ status = AT91C_BASE_TWI->TWI_SR; while (!(status & AT91C_TWI_TXCOMP)) status = AT91C_BASE_TWI->TWI_SR;
return err; } Инициализация (вызывается для 100кГц) Код void AT91F_TWI_Open(int TwiClock) { /* Configure TWI PIOs */ AT91F_TWI_CfgPIO ();
/* Configure PMC by enabling TWI clock */ AT91F_TWI_CfgPMC ();
/* Reset the TWI */ AT91C_BASE_TWI->TWI_CR = AT91C_TWI_SWRST;
/* Configure TWI in master mode */ AT91F_TWI_Configure (AT91C_BASE_TWI);
/* Set TWI Clock Waveform Generator Register */ //AT91C_BASE_TWI->TWI_CWGR=0x047575; AT91F_SetTwiClock(TwiClock); } Расчёт делителей Код void AT91F_SetTwiClock(int TwiClock) { unsigned int cldiv,ckdiv=1;
/* CLDIV = ((Tlow x 2^CKDIV) -3) x Tmck */ /* CHDIV = ((THigh x 2^CKDIV) -3) x Tmck */ /* Only CLDIV is computed since CLDIV = CHDIV (50% duty cycle) */ cldiv = ( (MCK/(2*TwiClock))-3 ) / pow(2,ckdiv); while ( cldiv> 255 ) { ckdiv++; cldiv = ( (MCK/(2*TwiClock))-3 ) / pow(2,ckdiv);
} AT91C_BASE_TWI->TWI_CWGR =(ckdiv<<16)|((unsigned int)cldiv << 8)|(unsigned int)cldiv; } Проблема в том, что процедура передачи просто виснит, очевидно не получая из статус регистра TXRDY. TWI инициализирован приведённой выше процедурой. Я не ошибаюсь, считая, что "железные" проблемы никак не влияют на работу модуля внутри? Пока не идёт речи о корректности передачи, лишь о факте того, что статус регистр не ведёт себя должным образом. Есть ли вероятность что модуль битый напрочь?
|
|
|
|
|
Jan 30 2008, 05:27
|

Частый гость
 
Группа: Свой
Сообщений: 169
Регистрация: 17-09-07
Из: Красноярск
Пользователь №: 30 600

|
Цитата(Хомяк @ Jan 30 2008, 11:06)  Запускал TWI на AT91SAM7A3 проблем не было. Но у меня функция AT91F_SetTwiClock() маленько по другому была. И еще что цепляется на шину? Резисторы подтягивающие стоят? Эту функцию я правил чуть чуть, думал, мало ли... Подтяжка стоит. Только влияет ли это на процесс обновления регистров самого TWI ?
|
|
|
|
|
Jan 30 2008, 10:49
|
Частый гость
 
Группа: Свой
Сообщений: 169
Регистрация: 10-11-05
Из: Воронеж
Пользователь №: 10 687

|
Сразу бросается в глаза, что Вы делаете при передаче принудительно START|STOP. По DS на at91Sam7X от октября 2007г., этого делать не надо. А может быть и нельзя. Я тоже долго мучил TWI и столкнулся с проблемой - если при передаче принудительно дернуть START, то последующая операция чтения глючит. Ни старт, ни стоп при передаче не надо включать. Цитата(Goofy @ Jan 30 2008, 08:27)  Эту функцию я правил чуть чуть, думал, мало ли...
Подтяжка стоит. Только влияет ли это на процесс обновления регистров самого TWI ? Влияет. Встречал реализацию (не помню в каком камне), когда аппаратный i2c сильно глючил без подтяжки.
|
|
|
|
|
Jan 30 2008, 11:20
|

Частый гость
 
Группа: Свой
Сообщений: 169
Регистрация: 17-09-07
Из: Красноярск
Пользователь №: 30 600

|
Цитата(gladov @ Jan 30 2008, 17:49)  Сразу бросается в глаза, что Вы делаете при передаче принудительно START|STOP. По DS на at91Sam7X от октября 2007г., этого делать не надо. А может быть и нельзя. Я тоже долго мучил TWI и столкнулся с проблемой - если при передаче принудительно дернуть START, то последующая операция чтения глючит. Ни старт, ни стоп при передаче не надо включать. Влияет. Встречал реализацию (не помню в каком камне), когда аппаратный i2c сильно глючил без подтяжки. Принудительный старт выставил ради эксперимента. Убрал обратно. Дело в том, что SCL SDA линии красоты ради были подключены через MAX3002 чтобы синхронизировать уровни с 5В, что собственно не диктуется необходимостью (выводы sam7s к 5в терпимы, подтяжка внешняя, 100К припаял для начала). Ради уменьшения глючности отрезал дорожки от MAX3002, соеденил с 5В частью шины напрямую. При инициализации выходит что ключи на ножках sam7s256 открыты, на шине нулевой уровень. Цикл так же виснит.
Сообщение отредактировал Goofy - Jan 30 2008, 11:23
|
|
|
|
|
Jan 30 2008, 12:44
|
Частый гость
 
Группа: Свой
Сообщений: 169
Регистрация: 10-11-05
Из: Воронеж
Пользователь №: 10 687

|
Цитата(Goofy @ Jan 30 2008, 14:20)  Принудительный старт выставил ради эксперимента. Убрал обратно. Дело в том, что SCL SDA линии красоты ради были подключены через MAX3002 чтобы синхронизировать уровни с 5В, что собственно не диктуется необходимостью (выводы sam7s к 5в терпимы, подтяжка внешняя, 100К припаял для начала). Ради уменьшения глючности отрезал дорожки от MAX3002, соеденил с 5В частью шины напрямую. При инициализации выходит что ключи на ножках sam7s256 открыты, на шине нулевой уровень. Цикл так же виснит.  А 100К не много? Рекомендуют от 5 до 10 ставить. А почему бы не попробовать остановить цикл во время висяка и не посмотреть что лежит в TWI_SR?
|
|
|
|
|
Jan 30 2008, 12:52
|

Частый гость
 
Группа: Свой
Сообщений: 169
Регистрация: 17-09-07
Из: Красноярск
Пользователь №: 30 600

|
Цитата(gladov @ Jan 30 2008, 19:44)  А 100К не много? Рекомендуют от 5 до 10 ставить. А почему бы не попробовать остановить цикл во время висяка и не посмотреть что лежит в TWI_SR? Обстановка изменилась. Для sam7s обязательным судя по всему является AT91C_BASE_PIOA->PIO_MDER=AT91C_PA4_TWCK|AT91C_PA3_TWD; Резисторы переставил на 10к. Однако верхний уровень сигнала явно не 5 вольт. Зависание прекратилось когда на шину подцепил приёмное устройство. Попытка заглянуть в сигнал осцилографом (25рF, TWI инициализируется под частоту 50гц) снова вешает цикл и ничего не наблюдается. Будем разбираться ...
Сообщение отредактировал Goofy - Jan 30 2008, 12:54
|
|
|
|
|
Jan 30 2008, 13:16
|
Частый гость
 
Группа: Свой
Сообщений: 99
Регистрация: 12-02-07
Из: Свердловск
Пользователь №: 25 269

|
Я на TWI вешал 24LC256 подтягивал 2к Привожу свой код Кварц 16МГц работал на частоте квалца , без ФАПЧ Код //============================================================================== // Функция : AT91F_SetTwiClock // Описание : // входные параметры : // выходные параметры : //============================================================================== void AT91F_SetTwiClock(void) { int sclock;
/* Here, CKDIV = 1 and CHDIV=CLDIV ==> CLDIV = CHDIV = 1/4*((Fmclk/FTWI) -6)*/
sclock = (10*MCK /AT91C_TWI_CLOCK); if (sclock % 10 >= 5) sclock = (sclock /10) - 5; else sclock = (sclock /10)- 6; sclock = (sclock + (4 - sclock %4)) >> 2; // div 4
AT91C_BASE_TWI->TWI_CWGR = ( 1<<16 ) | (sclock << 8) | sclock; } //============================================================================== // Функция : AT91F_TWI_Open // Описание : // входные параметры : // выходные параметры : //============================================================================== void AT91F_TWI_Open(void) { AT91F_TWI_CfgPIO(); // configure TWI PIOs AT91F_TWI_CfgPMC(); // enable clock TWI AT91F_TWI_Configure (AT91C_BASE_TWI); // configure in MASTER mode AT91F_SetTwiClock(); } //============================================================================== // Функция : AT91F_TWI_WriteByte // Описание : // входные параметры : // выходные параметры : //============================================================================== int AT91F_TWI_WriteByte(const AT91PS_TWI pTwi ,int mode, int int_address, char *data2send, int nb) { unsigned int status,counter=0,error=0;
// Set TWI Internal Address Register if ((mode & AT91C_TWI_IADRSZ) != 0) pTwi->TWI_IADR = int_address;
// Set the TWI Master Mode Register pTwi->TWI_MMR = mode & ~AT91C_TWI_MREAD; if(nb <2) { pTwi->TWI_CR = AT91C_TWI_START | AT91C_TWI_MSEN | AT91C_TWI_STOP; pTwi->TWI_THR = *data2send; } else { // Set the TWI Master Mode Register for(counter=0;counter<nb;counter++) { pTwi->TWI_CR = AT91C_TWI_START | AT91C_TWI_MSEN; if (counter == (nb - 1)) pTwi->TWI_CR = AT91C_TWI_STOP; status = pTwi->TWI_SR; if ((status & ERROR) == ERROR) error++; while (!(status & AT91C_TWI_TXRDY)) { status = pTwi->TWI_SR; if ((status & ERROR) == ERROR) error++; } pTwi->TWI_THR = *(data2send+counter); } } status = pTwi->TWI_SR; if ((status & ERROR) == ERROR) error++; while (!(status & AT91C_TWI_TXCOMP)) { status = pTwi->TWI_SR; if ((status & ERROR) == ERROR) error++; } return error; } //============================================================================== // Функция : AT91F_TWI_ReadByte // Описание : // входные параметры : // выходные параметры : //============================================================================== int AT91F_TWI_ReadByte(const AT91PS_TWI pTwi ,int mode, int int_address, char *data, int nb) { unsigned int status,counter=0,error=0;
// Set TWI Internal Address Register if ((mode & AT91C_TWI_IADRSZ) != 0) pTwi->TWI_IADR = int_address;
// Set the TWI Master Mode Register pTwi->TWI_MMR = mode | AT91C_TWI_MREAD;
// Start transfer if (nb == 1) { pTwi->TWI_CR = AT91C_TWI_START | AT91C_TWI_STOP; status = pTwi->TWI_SR; if ((status & ERROR) == ERROR) error++; while (!(status & AT91C_TWI_TXCOMP)) { status = pTwi->TWI_SR; if ((status & ERROR) == ERROR) error++; } *(data) = pTwi->TWI_RHR; } else { pTwi->TWI_CR = AT91C_TWI_START | AT91C_TWI_MSEN; status = pTwi->TWI_SR; if ((status & ERROR) == ERROR) error++;
// Wait transfer is finished while (!(status & AT91C_TWI_TXCOMP)) { status = pTwi->TWI_SR; if ((status & ERROR )== ERROR) error++; if(status & AT91C_TWI_RXRDY) { *(data+counter++) = pTwi->TWI_RHR; if (counter == (nb - 1)) pTwi->TWI_CR = AT91C_TWI_STOP; } } } return 0; } //============================================================================== // Функция : // Описание : // входные параметры : // выходные параметры : //============================================================================== void TWI_ReadByte(const AT91PS_TWI pTwi ,int mode, char *data, int nb) { unsigned int status,counter=0; // Set TWI Internal Address Register // without internal address ?????? //if ((mode & AT91C_TWI_IADRSZ) != 0) pTwi->TWI_IADR = int_address;
// Set the TWI Master Mode Register // Use MS 7 bits as mode ?????? pTwi->TWI_MMR = mode | AT91C_TWI_MREAD;
// Start transfer if (nb == 1) { pTwi->TWI_CR = AT91C_TWI_START | AT91C_TWI_STOP; status = pTwi->TWI_SR; //if ((status & ERROR) == ERROR) error++; while (!(status & AT91C_TWI_TXCOMP)); *(data) = pTwi->TWI_RHR; } else { pTwi->TWI_CR = AT91C_TWI_START | AT91C_TWI_MSEN; status = pTwi->TWI_SR; // Wait transfer is finished while (!(status & AT91C_TWI_TXCOMP)) { AT91F_DBGU_Printk("\n\rTEST_AT91F_TWI_ReadByte_1"); if(status & AT91C_TWI_RXRDY) { *(data+counter++) = pTwi->TWI_RHR; AT91F_DBGU_Printk("\n\rTEST_AT91F_TWI_ReadByte_2"); if (counter == (nb - 1)) pTwi->TWI_CR = AT91C_TWI_STOP; //AT91F_DBGU_Printk("\n\rTEST_AT91F_TWI_ReadByte_3"); } } } }
Сообщение отредактировал Хомяк - Jan 30 2008, 13:18
|
|
|
|
|
Feb 4 2008, 18:30
|
Гуру
     
Группа: Свой
Сообщений: 2 360
Регистрация: 6-03-06
Из: Кишинев
Пользователь №: 15 025

|
Цитата(Goofy @ Feb 1 2008, 07:03)  Проблема решилась. При отсутствии устройства на шине по запрашиваемому адресу, цикл виснит. Буду вводить таймауты. Какое-то время назад тут уже подымалась тема TWI. Тема для меня больная, но повторяться не буду, только выводы: Хотите иметь надежное устройство- делайте софтовый TWI. Чтобы Ваше устройство работало так, как хотите Вы и не зависало от каждой иголки на шине. Подчеркну, это мой личный выстраданный опыт, никому свое мнение навязывать не буду. Причем это я на других АРМах грыз (AT91RM9200). Но "чуйствую", что уши у проблемы те же.
|
|
|
|
|
Feb 7 2008, 11:58
|

Частый гость
 
Группа: Свой
Сообщений: 135
Регистрация: 6-04-07
Из: Бронницы
Пользователь №: 26 809

|
Цитата(gladov @ Jan 30 2008, 13:49)  Влияет. Встречал реализацию (не помню в каком камне), когда аппаратный i2c сильно глючил без подтяжки. а не в процессорах ли ST ? в подтверждение могу сказать что на STM32 при инициализации TWI в случае неправильной подтяжки мастер встает в такое кривое состояние что потом никогда не может сгенерировать start condition
--------------------
если еррата пуста - это не хорошо а плохо
|
|
|
|
|
Apr 6 2008, 21:27
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(Terrabyte @ Feb 7 2008, 15:09)  Terrabyte а может быть Вы сможете подитожить инфу по работе i2c ? и выложить ее на всеобщее обозрение в виде FAQ ? Готов выдать Вам еще несколько мыслей, но хотелось бы на выходе получить готовую апликайшен про то как нужно пользоваться i2c на samxxxxx.... Сам буду ей пользоваться.....
|
|
|
|
|
Apr 24 2008, 12:23
|

Частый гость
 
Группа: Свой
Сообщений: 169
Регистрация: 17-09-07
Из: Красноярск
Пользователь №: 30 600

|
Цитата(aaarrr @ Apr 7 2008, 13:02)  ИМХО, TWI на SAM7 все же неработоспособен. У меня есть несколько "почти работающих" вариантов, но все они благополучно сыпятся на попытке общения с SAA7113. Софтверный во сто крат лучше, поверьте  А могли бы поделиться сим софтварным и2с ? С ходу ничего не удалось нагуглить
|
|
|
|
|
Apr 24 2008, 12:43
|

Частый гость
 
Группа: Свой
Сообщений: 169
Регистрация: 17-09-07
Из: Красноярск
Пользователь №: 30 600

|
Цитата(aaarrr @ Apr 24 2008, 20:35)  Что там гуглить? Работы на пару часов максимум.
iic.rar ( 1.86 килобайт )
Кол-во скачиваний: 331Спасибо большое! У меня бы заняло намного больше времени... И получилось бы хуже. До каких частот можно спокойно раскачивать ?
|
|
|
|
|
Jun 16 2008, 22:41
|

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

|
Цитата(aaarrr @ Apr 7 2008, 08:02)  ИМХО, TWI на SAM7 все же неработоспособен. Добрался до аппаратного TWI модуля в SAM7 S. Софтверный драйвер непозволительная роскош в моем случае. На мой взгляд работать куда удобнее чем со стандартным филипковым I2C (портировал драйвер с LPC на SAM7) Проверил с рамтроновскими FM'ками и at24 серией, а также c мегой в качестве слейва, да и просто без ничего на линии. Давил линию принудительно в 0. работает.. 400kHz полет нормальный, TWI модуль не подвисает. (до "Soft reset" дело ни разу не дошло). PS: подтяжки всегда ставлю 1k (с некоторыми девайсами обеспечивает 1Mhz трансфер).
|
|
|
|
|
Jun 17 2008, 01:54
|

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

|
Да вроде нормально давил ;> Попробовал фокус с отверткой (закоротить линии) - сработал soft reset и шина задышала себе дальше. В атаче драйвер "как есть". пример применения: Код void CheckExtStorage(void) { U8 addr = 0xA0; U8 rBuf[16];
printf("Discovering storages connected to I2C bus\n"); while (addr < 0xA8) { printf("storage 0x%x...", addr); i2c_MemTransfer( addr + SLA_R, 0x00, sizeof(rBuf), rBuf); if (i2c_WaitCompleteOperation() == ACK) printf("PRESENT"); else printf("NOT present"); printf("\n"); addr += 2; }
}
.... i2c_Init(); CheckExtStorage();
Прикрепленные файлы
i2cdrv.zip ( 5.03 килобайт )
Кол-во скачиваний: 108
|
|
|
|
|
Jun 19 2008, 12:11
|

Любитель
    
Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695

|
Цитата(aaarrr @ Apr 7 2008, 09:02)  ИМХО, TWI на SAM7 все же неработоспособен. У меня есть несколько "почти работающих" вариантов, но все они благополучно сыпятся на попытке общения с SAA7113. Софтверный во сто крат лучше, поверьте  Да ладно, ребят, что-то ужасы какие-то рассказываете. Как может быть неработоспособным модуль серийного девайса? Может быть, просто есть какие-то нюансы, которые должны прекрасно обходиться. Ну а если "тыкать" отвёрткой или паяльником по выводам работающего чипа, так тут не только TWI заглючит, а вообще всё погореть может...
|
|
|
|
|
Jun 19 2008, 12:28
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(sonycman @ Jun 19 2008, 16:11)  Да ладно, ребят, что-то ужасы какие-то рассказываете. Ужасы.Цитата(sonycman @ Jun 19 2008, 16:11)  Как может быть неработоспособным модуль серийного девайса? Может. У SAM7 это один из PLL и I2C slave. Цитата(sonycman @ Jun 19 2008, 16:11)  Может быть, просто есть какие-то нюансы, которые должны прекрасно обходиться. Поверьте, я с атмеловскими ARM'ами имею дело уже 7 лет, и бился с I2C до последнего, но эта ж. может работать лишь с ограниченным набором I2C устройств.
|
|
|
|
|
Jul 4 2008, 00:51
|
Участник

Группа: Свой
Сообщений: 65
Регистрация: 15-11-07
Из: Taipei, TW
Пользователь №: 32 356

|
И снова TWI в AT91SAM7S256. Это нормально, что стандартный пример AT91SAM7S256-BasicTWI-IAR4_30A-1_21 не хочет компилится? Говорит Код Error[Pe018]: expected a ")" D:\iararm5\AT91SAM7S-Interrupt\Src\lib_twi.c 74 Error[Pe018]: expected a ")" D:\iararm5\AT91SAM7S-Interrupt\Src\lib_twi.c 74 Error[Pe018]: expected a ")" D:\iararm5\AT91SAM7S-Interrupt\Src\lib_twi.c 78 и так далее, до 130 строчки, на безобидные с виду if ((status & ERROR) == ERROR) error++;. Работа только в режиме Master, компилер IAR ARM 5.11.
Сообщение отредактировал ЕшТ - Jul 4 2008, 00:52
|
|
|
|
|
Sep 3 2008, 23:09
|
Участник

Группа: Свой
Сообщений: 65
Регистрация: 15-11-07
Из: Taipei, TW
Пользователь №: 32 356

|
товарищи, у кого нибудь вообще тви аппаратный работает в сам7с? скиньте кусочки кода с функциями плиз. Родные с примера что-то не работают. компилятор ИАР 5.10
|
|
|
|
|
Sep 4 2008, 06:06
|
Знающий
   
Группа: Свой
Сообщений: 583
Регистрация: 7-06-06
Из: Таганрог
Пользователь №: 17 840

|
Цитата(ЕшТ @ Sep 4 2008, 03:09)  товарищи, у кого нибудь вообще тви аппаратный работает в сам7с? скиньте кусочки кода с функциями плиз. Родные с примера что-то не работают. компилятор ИАР 5.10 У меня работает. Периферия Texas TLV320, EEProm, ForteMedia. CrossWorks 1.5 Работа по прерываниям, обработчик на асме.
|
|
|
|
|
Jan 12 2010, 23:10
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(aaarrr @ Jun 17 2008, 02:01)  Плохо давили, значит. Не верю  С 24-ми и у меня работал, но отвертка, воткнутая между SDA и SCL, с какой-то попытки модуль все равно завешивала. А все таки TWI победить можно... даже при связи с слейвами на МК... во-первых нужно ставить обязательно PIO_MDER на SCL и SDA ну а дальше просто при подвисании шины(таймауйт например) выключаем TWI и через PIO щелкаем 9 тактов на SCL на макс скорости(400КГц) включаем снова TWI и все ОК. и никакая отвертка между SDA и SCL ничто не завесит...
|
|
|
|
|
Jan 13 2010, 10:08
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(aaarrr @ Jan 13 2010, 02:50)  Не вижу смысла программно реанимировать откровенно корявое железо. Ерраты и раздела Troubleshooting AT91-AN01 должно быть достаточно для принятия единственно верного решения - отказаться от TWI. В противном случае придется подтачивать напильником драйвер под некоторые слейвы. А в какой-то момент даже для самого супер-пупер круто написанного драйвера такая необходимость все равно возникнет, и не факт, что потраченные на разборки часы приведут к положительному результату. Поверьте моему опыту. Вся эта возня с TWI от безысходности, нужно поддерживать старые разработки. Тут на объекте поймали эфект(видимо помехи) сходный с закороткой отверткой SDA и SCL, модуль TWI просто подвисал после длительной работы. Использовать софтовый I2C там невозможно из-за довольно приличного трансферта который должен идти в фоне. Пришлось искать решение по реанимированию TWI. В новых разработках TWI на SAM7 просто не используем, и никому не посоветую использовать.
|
|
|
|
|
Jan 16 2010, 08:10
|
Группа: Участник
Сообщений: 13
Регистрация: 14-01-10
Пользователь №: 54 820

|
Цитата(singlskv @ Jan 13 2010, 01:10)  А все таки TWI победить можно... даже при связи с слейвами на МК... во-первых нужно ставить обязательно PIO_MDER на SCL и SDA ну а дальше просто при подвисании шины(таймауйт например) выключаем TWI и через PIO щелкаем 9 тактов на SCL на макс скорости(400КГц) включаем снова TWI и все ОК. и никакая отвертка между SDA и SCL ничто не завесит...  Такого метода по реанимации TWI я еще не пробывал )), кстати, у меня была дурная идея переписать весь SAM7S TWI под прерывания, чтобы избавиться от глюков. В итоге сделал софтовый и все работает без проблем. Аппаратный же... после зависания никаким образом, даже ресетом всего усройства, не выводился из этого состояния, тока выключение питания ((.
|
|
|
|
|
Jan 6 2014, 11:07
|
Частый гость
 
Группа: Свой
Сообщений: 124
Регистрация: 2-01-07
Из: Russia
Пользователь №: 24 042

|
Цитата(singlskv @ Jan 13 2010, 13:08)  Вся эта возня с TWI от безысходности, нужно поддерживать старые разработки. Тут на объекте поймали эфект(видимо помехи) сходный с закороткой отверткой SDA и SCL, модуль TWI просто подвисал после длительной работы. Использовать софтовый I2C там невозможно из-за довольно приличного трансферта который должен идти в фоне. Пришлось искать решение по реанимированию TWI.
В новых разработках TWI на SAM7 просто не используем, и никому не посоветую использовать. С микросхемой часов PCF__ TWI заработал, извиняюсь за стиль. Благодаря документации находящейся по ссылке "Описание модулей SAM", в теме NACK_in_TWI_SRно программно только как Slave. В последних версиях at91 с I2C не должно быть проблем.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|