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

 
 
> 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
 
Start new topic
Ответов
Dimmy
сообщение Jun 23 2007, 06:38
Сообщение #2


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

Группа: Участник
Сообщений: 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
dac
сообщение Aug 9 2007, 04:54
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 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 Текстовая версия Сейчас: 26th June 2025 - 04:12
Рейтинг@Mail.ru


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