Jump to content

    
Sign in to follow this  
DpInRock

Прикручивание DS2482S к TWI arm Atmel

Recommended Posts

Смыл обращения к DS2482 состоит в том, что первоначальная команда записи должна поменяться на команду чтения после повторного старта.

 

И вот тут как угадать, когда именно перенастраивать TWI?

 

Делал по всякому.

Например так

 

TWI0->TWI_THR = 0x87; -- передается два байта, признак стоп не установлен.
while(!TWI_ByteSent());
TWI0->TWI_THR = bit7;
while(!TWI_ByteSent()); -- тут еще не закончился передаваться байт

TWI0->TWI_MMR = (0 << 8) | TWI_MMR_MREAD | (0x18 << 16); --- а я уже перестариваю на чтение у устанавливаю СТАРТ.
TWI0->TWI_CR=1;

do {
     while (!TWI_ByteReceived());
     a=TWI_ReadByte();
     
    } while ((a&1)!=0);

 

Какие-то команды так выполняются, например Сброс 1-wire. Четко видно. И возвращается нужный статус.

А вот команда чтения байта - фигня какая-то.

СУдя по всему всегда читается байт статуса. Вне завимости от команды....

 

Ктоб направил на путь. А то писать руками программный I2c при наличии аппаратного как-то не очень.

 

Короче разобрался.

ПАузы между командами должны быть. И не смотреть на описание этой микросхемы. Его составляли враги.

Edited by DpInRock

Share this post


Link to post
Share on other sites

Обычно после отсылки чего нибудь куда нибудь ждут флажок в регистре статуса TWI что , что-то куда-то ушло , а уж затем делают следующие действие. А не делают паузы.

 

Share this post


Link to post
Share on other sites
Обычно после отсылки чего нибудь куда нибудь ждут флажок в регистре статуса TWI что , что-то куда-то ушло , а уж затем делают следующие действие. А не делают паузы.

Дело в том, что мне нужно сформировать Repeated Start. Но уже с командой ЧТЕНИЯ (относительно содержимого младшего бита I2C).

Поэтому происходит такая ситуация - байт все еще идет (но его уже нет в буфере), а я должен перестроить командный регистр на операцию чтения, датть старт операции чтения, да еще и одновременно с этим дать СТОП, поскольку от чтения мне нужен только один байт.

 

И это в то время, когда передатчик как таковой не закончил работу.

 

В TWI такая проблема решается с помощью регистров IADDR, в которые надо подсунуть данные, которые надо передать с флагом записи. При этом сам TWI настраивается на чтение.

 

В общем, не нравился мне даллас никогда.

Share this post


Link to post
Share on other sites

я так понимаю Вы про это время The idle time is needed for the 1-Wire function to complete. Или

Поэтому происходит такая ситуация - байт все еще идет (но его уже нет в буфере), а я должен перестроить командный регистр на операцию чтения, датть старт операции чтения, да еще и одновременно с этим дать СТОП, поскольку от чтения мне нужен только один байт.

TWI или I2C так не работает. Это автомат состояний. Пока вы не получите ACK/NOACK следующую операцию Вы не сможете сделать и так каждый шаг Вашей цитаты. Ткните страницу DS , что Вы пытались сделать.

Разберём ее по частям , а то на пальцах сложно.

Share this post


Link to post
Share on other sites

Дело в том, чтобы получить повторный старт, или закончить передачу, я должен дать команду СТОП ДО начала передачи байта как такового (Или ДО НАЧАЛА ПРИЕМА, если нужен один байт). ДО НАЧАЛА ПЕРЕДАЧИ.

 

И вот проблема решилась с помощью IADDR.

Но в большинстве случаев с помощью обычной задержки между операциями.

==

И тут уже дело не в TWI как таковом, а в том, что микросхема дает готовность 1-wire почему-то существенно раньше чем надо.

А в случае DS2482 это выливается в то, что автомат этой микросхемы виснет намертво. Т.е. линия SDA валится в 0 пожизненно. Пока питание не перевключишь. А с точно выверенными задержками работает как часы.

 

Т.е. микросхема очень чувствительна к последовательностям. Ни одной такой I2C микросхемы до сих пор не встречал. Т.е. обычно, валишь любую чушь по I2C - без проблем. Рано или поздно будет все хорошо. В данной микросхеме как-то все не так. Почему не сделали как у людей - с обычными адресуемыми регистрами - непонятно.

 

Ну дал бы команду. А потом спокойно читал регистр состояния до посинения. А тут - стоит произойти несоответствию твоих (пусть идиотских) действий и состоянию 1-wire как таковой - можешь получить железный вис.

 

Вот пока такие впечатления. Первый раз в жизни употребил программную задержку. Но потратил на оживление этой микросхемы целых 2 дня. И пока оставил ее в покое. Типа, работает устойчиво - не трогай. Но осадок - остался, что всё не так.

 

 

 

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this