Всем привет! Есть ARM7 – Samsung s3c44b0x и DS3904- небольшой элемент, который содержит в себе 3 переменных резистора(128 позиций): http://datasheets.maxim-ic.com/en/ds/DS3904-DS3905.pdf Связаны они по I2C интерфейсу. Проблема в том, что после START проходит некоторое время до того, как начнется передача данных, и это время каждый раз очень отличается. Т.е. все работает, но может сразу все отработать, а может секунд 10 ждать. Все сделал как в даташите описано, уже перебрал весь диапазон Tx clock’ов Там при попадании в обработчик прерывания в ком порт записываю символ, чтоб знать что попали в обработчик, а когда обработчик вызван ответом slave устройства, то дописывается еще один символ. Так, например, вот лог записи нового значения резистора: qqqqqqqqqqqqqqqqqqq…qqqqqqqqqqqqqqqqqqqqqeqeqe Так почему вызываеться столько “ненужных” прерываний?? Смотрел JTAG отладчиком, как все регистры одинаковы во время “нужных” и “ненужных” прерываний – разница только в бите, отвечающем за ACK. Смотрел исходники Линукса ,так там вроде также… Посмотрите, кому не лень, плз. PS В архиве то, что на данный момент написал, правда, там чтение значения еще некорректно работает.
Vov4ick Не совсем. Нет подтягивающих резисторов на SDA и SCL (по 4.7 кОм) и конденсатора. Правда, это не я собирал. А может быть из за этого? Тогда почему срабатывает через 10-100 раз, тогда ведь должно вообще не работать?
На И2Ц шине резисторы должны быть по спецификации, возможно, что из-за этого. Срабатывать может из-за наводок. Вот её спецификация http://www.nxp.com/acrobat_download/literature/9398/39340011.pdf
Vov4ick Спасибо, посмотрел. Сейчас попробую подключить резисторы. Там вот что еще. Питание на Vcc (3 нога) 5 вольт, а сам проц подает при высоком уровне на SDA и SCL 3.3В. Сам элемент содержит 3 резистора - 2 из них на яркость/контраст, а через третий подключена эта 3-я нога (Vcc) к 5 вольтам. Т.е. получается можно регулировать напряжение питания этого DS3904. Т.е. если на линии "5В" где-то 5В, то сейчас на 3-ю ногу подается 4.9В. Пробовал менять значение этого резистора, чтоб получить 3.3В на Vcc, но оно почему-то не меняется, и напряжение то же остается. Т.е. вроде как меняется (судя из лога), но напряжение не меняется. А напряжение при высоком уровне на SDA и SCL обязательно должно быть равным Vcc? (в даташите и спецификации ничего по этому не написано, вроде, или это и так понятно должно быть?)
У большинства логических схем высокий уровень напряжения примерно равен напряжению питания. На И2Ц выходе контроллера напряжения быть и не должно (относительно общего провода). Высокий уровень напряжения на шине обеспечивается подтягивающими резисторами, а низкий - открывающимися выходными транзисторами контроллера. ЗЫ А какова цель разработки, может можно сделать проще, без контроллера и микросхемы с резисторами и АЦП?
Vov4ick Ха! Работает! Теперь все стабильно - за один раз только 3 прерывания, и все сразу отрабатывает! Все дело было все-таки в этих подтягивающих резисторах - подключил их, и все заработало. Спасибо за внимание. С помощью этого контроллера управляется уровень контраста/яркости ЖК монитора. Выводы этих резисторов подключаются к еще двум контроллерам - к LT1615ES5 (формирование напряжения контраста) и к LTC1697EMS (питание CCFL лампы подсветки).