А что у Вас в TWAR?? случайно не адрес устройства, к которому Вы обращаетесь?
Судя по всему, случай TWSR = 0x00 возникает в режиме slave (т.е. когда адрес на шине совпал с TWAR) при ошибочном
обнаружении (не генерации) на линии старта/стопа
Так что инициализцию TWAR лучше уберите.
Цитата
Вопрос без slev устройства одни резисторы стоит пробовать
Можно попробовать. Но в данном случае, думаю, это ничего не даст. Хотя могу и ошибаться.
Кстати, при отладке I2C после сброса контроллера нужно как-то сбрасывать и слейв-устройства (вернее, состояние ихнего интерфейса)
Наиболее простой способ - снятие питания. Или же програмным способом. Причина и методы решения - в
http://www.analog.com/static/imported-file...7414AN686_0.pdfЛично я делаю ДО включения аппаратного TWI так (правда, на асме):
Код
TWI_Master_Initialise:
;*
;- RESET I2c
cbi SCL_PORT,SCL
cbi SDA_PORT,SDA
cbi SCL_DDR,SCL
cbi SDA_DDR,SDA // SDA = high
call Wait5us
ldi Cnt,10
i2cNextSCL:
sbi SCL_DDR,SCL // push SCL low
call Wait5us // wait 5 us
cbi SCL_DDR,SCL // release SCL high
ii2cWt1: sbis SCL_PIN,SCL // wait SCL
rjmp ii2cWt1
call Wait5us // wait 5 us
dec Cnt
brne i2cNextSCL
И еще.
В даташите на атмегу128, стр. 201 указано, что нельзя посылать стоп сразу после старта или повторного старта:
ATMega128, pg201:
A transmission basically consists of a START condition, a SLA+R/W, one or more data packets
and a STOP condition. An empty message, consisting of a START followed by a STOP condition,
is illegal.
Поэтому TWCR = HARD_STOP_CONDITION в строках
if ((TWSR & 0xF8) != _START) {TWCR = HARD_STOP_CONDITION; return ERROR_START;}
и
if ((TWSR & 0xF8) != _START_REPEAT) {TWCR = HARD_STOP_CONDITION; return ERROR_START;}
я бы убрал.
У меня появились еще вопросы: Ошибка возникает при первом проходе данного участка (после сброса) или при последующих?