Цитата(dfyz.s @ Feb 8 2013, 19:04)

Сейчас происходит так.
Шлет старт -> Отсылает адрес(нормально приходит) -> Дальше бы надо послать адрес регистра, а он переходит на проверку BTF, который пока точно не придет.
Если предполагается операция [START]-[ADDR]-[WRITE]-[RESTART]-[READ]-[STOP], то автомат должен сработать так:
После старта попадаем в:
case I2C_EVENT_MASTER_MODE_SELECT: // MASTER, (RE)START sent: BUSY, MSL and SB are set
где (ctrl->wcnt) будет больше нуля, поэтому вызовется
I2C_SEND_ADDR(i2c, ctrl->ptr[0] & ~I2C_Direction_Receiver);
для посылки адреса устройства со сброшенным битом чтения, то есть, будет начата операция записи! После этого автомат должен попасть в
case I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED: // ADDR sent with /W bit
и лишь после посылки байта там (если не DMA)
I2C_WRITE_NEXT(ctrl, ctrl->ptr[ctrl->indx++]); // .wnt-- inside...
когда-то попадем в
case I2C_EVENT_MASTER_BYTE_TRANSMITTING: // Data being SENT; TRA, BSY, MSL and
где после ожидания BTF прямиком далее в
case I2C_EVENT_MASTER_BYTE_TRANSMITTED: // Data byte's been SENT; TRA, BSY, MSL and
Если посылался только один байт в режиме [WRITE], то (ctrl->wcnt == 0), посему будет выдан рестарт
I2C_START(i2c);
И т.д.
ВНИМАНИЕ! Отладчик нарушает временные характеристики на шине I2C с точки зрения SLAVE, что может приводить к странным результатам! Я заметил также, что отладчик может считывать регистр статуса, что приводит к преждевременному сбросу бита ADDR.
Сообщение отредактировал IgorKossak - Feb 9 2013, 18:15
Причина редактирования: лишние пробельные строки!!!