реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> I2C (аппаратная реализация) PIC18F6680, Как обрабатывать коллизии?
Dimmy
сообщение Jun 22 2007, 15:10
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 106
Регистрация: 12-09-05
Пользователь №: 8 503



Господа!
Заказчик предовставил для разработки модули 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)" ничего нет... Какова последовательность разрешения коллизии?
Go to the top of the page
 
+Quote Post
rezident
сообщение Jun 22 2007, 15:34
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Вас теоретический аспект разрешения коллизий I2C интересует или практический в применении к конкретному МК? Если теоретический, то почитайте I2C BUS Specification.
Go to the top of the page
 
+Quote Post
Dimmy
сообщение Jun 22 2007, 17:27
Сообщение #3


Частый гость
**

Группа: Участник
Сообщений: 106
Регистрация: 12-09-05
Пользователь №: 8 503



Буду краток - Практический
Go to the top of the page
 
+Quote Post
rezident
сообщение Jun 22 2007, 19:08
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Тогда увы, с PICами я практически не знаком.
Go to the top of the page
 
+Quote Post
Dimmy
сообщение Jun 22 2007, 20:16
Сообщение #5


Частый гость
**

Группа: Участник
Сообщений: 106
Регистрация: 12-09-05
Пользователь №: 8 503



Цитата(rezident @ Jun 22 2007, 22:08) *
Тогда увы, с PICами я практически не знаком.

Та же проблема... crying.gif

Сообщение отредактировал Dimmy - Jun 22 2007, 20:17
Go to the top of the page
 
+Quote Post
rezident
сообщение Jun 22 2007, 20:53
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Кстати, а вы не задумывались откуда на шине могут возникнуть коллизии, если мастер один? И тем более что указанные вами как слейвы м/с SCL не "растягивают".
Go to the top of the page
 
+Quote Post
Dimmy
сообщение Jun 23 2007, 06:38
Сообщение #7


Частый гость
**

Группа: Участник
Сообщений: 106
Регистрация: 12-09-05
Пользователь №: 8 503



В том-то вся и проблема - что сам не могу понять. В контроллере есть 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'ом все проще - никогда такого гимору не было...
Go to the top of the page
 
+Quote Post
rezident
сообщение Jun 23 2007, 12:50
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



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

#define i2cBusCollision() PIR2_BCLIF

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

Если в программе правильно (с опросом всевозможных флагов) написана процедура передачи, то WCOL и не должен устанавливаться. Флаг внешних коллизий вполне разумно используется, т.к. в общем случае не известно, будут или нет подключены к шине другие мастера. Так что пока я не вижу несуразностей.
А вот откуда берутся коллизии на шине при одном мастере, мне совершенно непонятно. Может там с самой шиной нелады какие-нибудь? Pull-up резисторы слишком большой величины стоят или емкость шины больше максимально допустимой по спецификации? Попробуйте поиграться с pull-up резисторами, уменьшив их номинал на 20-30%.
Go to the top of the page
 
+Quote Post
Dimmy
сообщение Jun 23 2007, 13:07
Сообщение #9


Частый гость
**

Группа: Участник
Сообщений: 106
Регистрация: 12-09-05
Пользователь №: 8 503



Полностью с вами согласен!
Pull-up=4k7 (как по доке),
Только вот одна проблема - модули серийные, их никто перепаивать не будет... Тем более заказчик (он ваще не знает что такое паяльник).
Мне нуна научится правильно обработать коллизию, чтобы повторно произвести требуемое действие. Ща раскопал (с боооольшим трудом) мануал 00735а.pdf (Using the PICmicro® MSSP Module for Master I2CTM Communications). Может че проясню...
Go to the top of the page
 
+Quote Post
dac
сообщение Aug 9 2007, 04:54
Сообщение #10


Знающий
****

Группа: Свой
Сообщений: 600
Регистрация: 27-05-05
Пользователь №: 5 482



Цитата(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 Ом когда на длинных межплатных соединениях иголки слишком большие были.

вообще проблемы были только с слейвом при чужом адресе (торомзил чуток, уже не помню как обошел)
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 29th June 2025 - 21:20
Рейтинг@Mail.ru


Страница сгенерированна за 0.01419 секунд с 7
ELECTRONIX ©2004-2016