|
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
|
|
|
|
Сообщений в этой теме
Goofy TWI в sam7s Jan 29 2008, 17:11   cebotor Цитата(gladov @ Jan 30 2008, 13:49) Влияе... Feb 7 2008, 11:58 Хомяк Я на TWI вешал 24LC256
подтягивал 2к
Привожу свой... Jan 30 2008, 13:16 Goofy Проблема решилась.
При отсутствии устройства на ши... Feb 1 2008, 05:03  Ruslan1 Цитата(Goofy @ Feb 1 2008, 07:03) Проблем... Feb 4 2008, 18:30   Terrabyte всё будет хорошо господа! читайте документ:
h... Feb 7 2008, 11:09    singlskv Цитата(Terrabyte @ Feb 7 2008, 15:09) всё... Apr 6 2008, 21:27 pan_oleg вот у меня такая ситуация, на STM32 не может сгене... Apr 4 2008, 11:40 aaarrr ИМХО, TWI на SAM7 все же неработоспособен. У меня ... Apr 7 2008, 05:02 Goofy Цитата(aaarrr @ Apr 7 2008, 13:02) ИМХО, ... Apr 24 2008, 12:23  aaarrr Цитата(Goofy @ Apr 24 2008, 16:23) А могл... Apr 24 2008, 12:35   Goofy Цитата(aaarrr @ Apr 24 2008, 20:35) Что т... Apr 24 2008, 12:43    aaarrr Цитата(Goofy @ Apr 24 2008, 16:43) До как... Apr 24 2008, 12:49 defunct Цитата(aaarrr @ Apr 7 2008, 08:02) ИМХО, ... Jun 16 2008, 22:41 sonycman Цитата(aaarrr @ Apr 7 2008, 09:02) ИМХО, ... Jun 19 2008, 12:11  aaarrr Цитата(sonycman @ Jun 19 2008, 16:11) Да ... Jun 19 2008, 12:28 JeDay Работал с TWI в SAM7SE. Проблемы которые были в SA... Apr 8 2008, 10:06 aaarrr Да, исправляют потихоньку. Еще выпущен SAM9261S - ... Apr 8 2008, 10:31 aaarrr Плохо давили, значит. Не верю
С 24-ми и у меня р... Jun 16 2008, 23:01 singlskv Цитата(aaarrr @ Jun 17 2008, 02:01) Плохо... Jan 12 2010, 23:10  aaarrr Не вижу смысла программно реанимировать откровенно... Jan 12 2010, 23:50   singlskv Цитата(aaarrr @ Jan 13 2010, 02:50) Не ви... Jan 13 2010, 10:08    Terrabyte Цитата(singlskv @ Jan 13 2010, 13:08) Вся... Jan 6 2014, 11:07  EugenB2 Цитата(singlskv @ Jan 13 2010, 01:10) А в... Jan 16 2010, 08:10 defunct Да вроде нормально давил ;>
Попробовал фокус с ... Jun 17 2008, 01:54 sonycman Хм, что-же, приму к сведению, когда буду пробовать... Jun 19 2008, 14:34 ЕшТ И снова TWI в AT91SAM7S256. Это нормально, что ста... Jul 4 2008, 00:51  ЕшТ товарищи, у кого нибудь вообще тви аппаратный рабо... Sep 3 2008, 23:09   DmitryM Цитата(ЕшТ @ Sep 4 2008, 03:09) товарищи,... Sep 4 2008, 06:06 aaarrr Выше посмотреть не пробовали? Sep 4 2008, 05:51
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|