В том-то вся и проблема - что сам не могу понять. В контроллере есть 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'ом все проще - никогда такого гимору не было...
|