|
Помогите по i2c, вопрос по asm, Подскажите начинающему, не ясны некоторые моменты |
|
|
|
Jul 2 2008, 13:51
|

Участник

Группа: Участник
Сообщений: 17
Регистрация: 9-04-08
Из: Украина, Запорожье
Пользователь №: 36 598

|
В свое время разбирался с I2C и в атмеловском avr300 нашел ошибку. Точно в каком месте уже не помню. В конце концов все заработало. На шине висели часы DS1307 и AT24C512. Максимальная частота шины для часов 100 кГц, поэтому все устройства на шине работали на 100 кГц. Пристегиваю кусок ассемблерного кода (почти аналог avr300). Может поможет разобраться.
--------------------
Ковчег был построен дилетантом, профессионалы построили Титаник
|
|
|
|
|
Jul 2 2008, 19:34
|
Местный
  
Группа: Свой
Сообщений: 256
Регистрация: 6-03-06
Из: Украина, г. Винница
Пользователь №: 15 017

|
Цитата то получится ожидаемая комбинация 08 Не получается, так как слишком уж короткий импульс. А здесь либо глюк протеуса, либо что-то в Вашей программе. Попробуйте сначала выяснить, почему программа запрашивает лишний байт по i2c. Возможно, в процессе и предыдущую ошибку устраните. Цитата А в чем работаете Вы, в чем моделируете схемы? JTAG + осциллограф (При написании кода своих ошибок достаточно. А вылавливать глюки еще и симуляторов не охота  ) Цитата В свое время разбирался с I2C и в атмеловском avr300 нашел ошибку Подтверждаю, ошибка была. Тоже исправлял. Правда, давно это было. Позавчера бегло сравнивал авр300 со своим (немного переработанным) кодом - различий с ходу не нашел. Поэтому предположил, что ее исправили. Но на всякий случай еще раз пересмотрю Добавлено: Пересмотрел, нашел ошибку в авр300. Она приводит к тому, при чтении что все байты, кроме первого (после адреса слейва) читаются как 0x00. Это связано с тем, что при выдачи мастером ACK в ответ на чтение 1-го байта линия SDA засаживается контроллером на "0" и остается в этом состоянии на протяжении всех последующих чтений. Для исправления этой ошибки в i2c_read "отпускаю" SDA после спада SCL Код i2c_read: rol i2cstat; store acknowledge ; (used by i2c_put_ack) ldi i2cdata,0x01; data = 0x01 i2c_read_bit:; do sbi DDRD,SCLP; force SCL low
;******** Добавлено****************************** nop; даем время опуститься SCL (300ns) nop cbi DDRD,SDAP; отпускаем SDA ;******** ***************************************
rcall i2c_hp_delay; half period delay
cbi DDRD,SCLP; release SCL rcall i2c_hp_delay; half period delay
clc; clear carry flag sbic PIND,SDAP; if SDA is high sec; set carry flag
rol i2cdata; store data bit brcc i2c_read_bit; while receive register not full 2 V000va:А почему у Вас над цифрой 1 сигнал SCL "затянут" в сосоянии лог."1"? Вы что, между выдачей на шину адреса slave+i2crd и чтением байта от slave делаете паузу порядка 1/2 такта SCL?
|
|
|
|
|
Jul 3 2008, 07:15
|
Частый гость
 
Группа: Участник
Сообщений: 87
Регистрация: 23-06-08
Пользователь №: 38 503

|
Цитата(Александр Куличок @ Jul 2 2008, 22:34)  А почему у Вас над цифрой 1 сигнал SCL "затянут" в сосоянии лог."1"? Вы что, между выдачей на шину адреса slave+i2crd и чтением байта от slave делаете паузу порядка 1/2 такта SCL? Нет не далаю я пауз. Это ожидание ack от slave, это он тормозит видимо, а может и Proteus . Nack от master идет без пауз. Спасибо за советы всем откликнувшимся  . Буду собирать рабочий макет и тестить. Александр Куличок
Сообщение отредактировал V000va - Jul 3 2008, 07:17
|
|
|
|
|
Jul 3 2008, 08:17
|
Местный
  
Группа: Свой
Сообщений: 256
Регистрация: 6-03-06
Из: Украина, г. Винница
Пользователь №: 15 017

|
Цитата Это ожидание ack от slave, это он тормозит видимо Если слейв не успевает (вводит цикл одидания), то он затягивает низкий уровень на сигнале SCK, и мастер должен считывать ACK/NACK только после того, как вырастет сигнал на SCL. То есть, схема чтения ACK/NACK выглядит так: Мастер 1. садит SCL на "0" 2. отпускает SDA 3. задержка 1/2 периода 4. отпускает SCL 5. ждет, когда состояние пина SCL станет равным 1 6. Считывает SDA (собственно ACK/NACK от слейва) 7. задержка 1/2 периода Слейв, если не успевает обработать запрос, удерживает сигнал SCL в "0", то есть отпускание мастером SCL на 4 шаге НЕ приводит фронту сигнала на физической линии SCL. Поэтому мастер на 5 шаге и ждет, когда слейв отпустит SCL. Это, кстати, может привести к "зависанию" микроконтроллера на данном участке кода, если по каким-либо причинам линия SCL удерживается в "0" Дальше вопрос к знающим. Сам не разбирался, а подробно перечитывать документацию от филипса было лень  : Слейв в соответствии со стандартом может затягивать SCL только при выдаче ACK/NACK или же когда ему вздумается (например, в процессе чтения из него битов данных)?
|
|
|
|
|
Jul 25 2008, 14:16
|

Местный
  
Группа: Свой
Сообщений: 234
Регистрация: 28-02-06
Из: Иркутск
Пользователь №: 14 771

|
Цитата(V000va @ Jul 25 2008, 15:44)  Подскажите, пишу прогу для работы с ds1307. ПО должно читать время из 1307 и выводить его на дисплей. Собрал аппаратную часть уже. Прогу разбил на 2 части : вывод на дисплей и собственно процедура получения данных по i2c от 1307. Подпрограмму индикации проверил - работает. Добавил туда еще подпрограмму для чтения по i2c - ничего не выодит. Даже подпрограмма индикации не работает. Эмуляция в Proteus кое-как работает, но выводит не понятно что. На аппаратной платформе проверяю - совсем другой результат. Как можно посмотреть чего там по i2c принимается, чего в голове у процессора происходит? Слышал про Jtag, но как и через что его с tiny2313 связать, пока не знаю. Подскажите плз. С тинькой будут проблемы... Там USI полусофтовый полужелезный монстр. Он не особо хорош в отладке. Рекомендую посмотреть вот этот проект и его исходники: http://ahtoxa.net/micros/tiny/leds/Там есть "ошибочка"... а потому посмотрите вот тут: http://electronix.ru/forum/index.php?showtopic=50210Там ведомый но думаю направление будет ясно )) Также рекомендую сходить на AVRFreaks.net
|
|
|
|
|
Jul 25 2008, 15:33
|
Гуру
     
Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521

|
Шина простая до безобразия и, фактически статическая, (если не использовать мультимастер и всё такое что вам не нужно). Наверное поэтому и завоевала такую популярность. Реализовывал на всех процах. Никаких проблем не вызывает. Обычно пишешь - работает.
Если отсутствуют средства отладки, то делашь просто. Паяешь два светодиода, точку останова программную и кнопочку. И пошла родная..... Ещё проще в отладчике - ставишь точку останова и смотришь соответствующие биты порта. Реализация простейшая если программная (аппаратная под AVR фактически не сложнее).
Пишешь Start, Stop, AskW, AskR, ReadB, WriteB + задержку. Далее работа с любым IIC устройством составляется из данных кирпичиков.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|