Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: I2C (аппаратная реализация) PIC18F6680
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Все остальные микроконтроллеры > PIC
Dimmy
Господа!
Заказчик предовставил для разработки модули Modtronix SBC68EC + IOR5E (www.modtronix.com) + реализованный уже WEB-сервер в исходниках. Жуть редкая - разводка платы оставляет желать, есть схемотехнич. ошибки (например, последовательный резистор в цепи SDA 2,7k). Вобщем - при работе страшно глючит I2C. На шине - 24C512 и часы реального времени DS1307.
Чтение более-менее наладил, но вот запись... Перевел шину в 100кГц - не помогло.
В фирменных подпрограммах работы с шиной I2C начисто отсутствует обработка коллизий. Подпрограммы тупо возвращают значение бита BCLIF ( Bus Collision Interrupt Flag bit) из регистра PIR2 и никак не отрабатывают факт его установки. В даташите кроме фразы "A bus collision occurred while the SSP module (configured in I2C Master mode) was transmitting (must be cleared in software)" ничего нет... Какова последовательность разрешения коллизии?
rezident
Вас теоретический аспект разрешения коллизий I2C интересует или практический в применении к конкретному МК? Если теоретический, то почитайте I2C BUS Specification.
Dimmy
Буду краток - Практический
rezident
Тогда увы, с PICами я практически не знаком.
Dimmy
Цитата(rezident @ Jun 22 2007, 22:08) *
Тогда увы, с PICами я практически не знаком.

Та же проблема... crying.gif
rezident
Кстати, а вы не задумывались откуда на шине могут возникнуть коллизии, если мастер один? И тем более что указанные вами как слейвы м/с SCL не "растягивают".
Dimmy
В том-то вся и проблема - что сам не могу понять. В контроллере есть 2 флага, которые выставляются при возникновении коллизий:
1.
BCLIF: Bus Collision Interrupt Flag bit 1 = A bus collision occurred while the SSP module (configured in I2C Master mode) was transmitting (must be cleared in software) - это флаг прерывания в регистре PIR2

2.
WCOL: Write Collision Detect bit In Master Transmit mode: 1 = A write to the SSPBUF register was attempted while the I2C conditions were not valid for a transmission to be started (must be cleared in software) - это чисто флажок в регистре SSPCON1, который обрабатывается программно.
Судя из описания, выставляются они слегка разным причинам - первый - при возникновении чисто внешней коллизии (типа одновременной передачи двух мастеров), а второй - при внутренних коллизиях.

Так вот, по какой-то причине фирменные исходники используют в качестве индикатора коллизий только флаг BCLIF:

#define i2cBusCollision() PIR2_BCLIF

а, второй - не принимают во внимание. Т.е.предполагается, что коллизии возникают только по внешним факторам.
Действительно, когда возникает коллизия - флаг WCOL никогда еще не выставлялся (проверено в дебаггере).

P.S. С Atmel'ом все проще - никогда такого гимору не было...
rezident
Цитата(Dimmy @ Jun 23 2007, 12:38) *
Так вот, по какой-то причине фирменные исходники используют в качестве индикатора коллизий только флаг BCLIF:

#define i2cBusCollision() PIR2_BCLIF

а, второй - не принимают во внимание. Т.е.предполагается, что коллизии возникают только по внешним факторам.
Действительно, когда возникает коллизия - флаг WCOL никогда еще не выставлялся (проверено в дебаггере).

Если в программе правильно (с опросом всевозможных флагов) написана процедура передачи, то WCOL и не должен устанавливаться. Флаг внешних коллизий вполне разумно используется, т.к. в общем случае не известно, будут или нет подключены к шине другие мастера. Так что пока я не вижу несуразностей.
А вот откуда берутся коллизии на шине при одном мастере, мне совершенно непонятно. Может там с самой шиной нелады какие-нибудь? Pull-up резисторы слишком большой величины стоят или емкость шины больше максимально допустимой по спецификации? Попробуйте поиграться с pull-up резисторами, уменьшив их номинал на 20-30%.
Dimmy
Полностью с вами согласен!
Pull-up=4k7 (как по доке),
Только вот одна проблема - модули серийные, их никто перепаивать не будет... Тем более заказчик (он ваще не знает что такое паяльник).
Мне нуна научится правильно обработать коллизию, чтобы повторно произвести требуемое действие. Ща раскопал (с боооольшим трудом) мануал 00735а.pdf (Using the PICmicro® MSSP Module for Master I2CTM Communications). Может че проясню...
dac
Цитата(Dimmy @ Jun 23 2007, 10:38) *
1.
BCLIF: Bus Collision Interrupt Flag bit 1 = A bus collision occurred while the SSP module (configured in I2C Master mode) was transmitting (must be cleared in software) - это флаг прерывания в регистре PIR2

Так вот, по какой-то причине фирменные исходники используют в качестве индикатора коллизий только флаг BCLIF:


какой проц?

по описанию флаг BCLIF выставляется только в двух случаях:
1. при старте линии SCL или SDA в нуле
2. при старте линия SCL упала раньше SDA
похоже проблемы в железе, осциллограф Вам поможет smile.gif
и еще если возврщается состаяние этого бита, но он не сбрасывается в подпрограмме то это надо сделать вам
а насчет последовательного резистора тоже ставил, только 100 Ом когда на длинных межплатных соединениях иголки слишком большие были.

вообще проблемы были только с слейвом при чужом адресе (торомзил чуток, уже не помню как обошел)
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.