Доброго времени суток!
Вопрос про реализацию twi интерфейса в микроконтроллерах mega8. Реализовываю передачу между контроллерами ATMega8(12МГц) и ATMEga8L(8МГц). РЕжим передачи - от главного к ведущему. Вот инициализация и функция передачи на главном контроллере:
Код:
|
/* I2C Init */
//SCL - 100 kHz
TWSR = ( 1 ‹‹ TWPS1 )|( 1 ‹‹ TWPS0 );
TWBR = 252;
int twi_write(char cmd){
//start
TWCR = (1‹‹TWINT)|(1‹‹TWSTA)|(1‹‹TWEN);
while (!(TWCR & (1‹‹TWINT)));
if ((TWSR & 0xF8) != 0x08) return 1;
//address transmit
TWDR = MOTOR_ADDRESS;
TWCR = (1‹‹TWINT)|(1‹‹TWEN);
while (!(TWCR & (1‹‹TWINT)));
if ((TWSR & 0xF8) != 0x18) return 1;
//data transmit
TWDR = cmd;
TWCR = (1‹‹TWINT)|(1‹‹TWEN);
while (!(TWCR & (1‹‹TWINT)));
if ((TWSR & 0xF8) != 0x28) return 1;
//stop
TWCR = (1‹‹TWINT)|(1‹‹TWEN)|(1‹‹TWSTO);
return 0; |
Вот инициализация и функция(по прерыванию) приема данных:
Код:
|
/* I2C Init */
TWAR = 0x02; //address
TWCR = (1‹‹TWEA)|(1‹‹TWEN)|(1‹‹TWIE);
ISR( TWI_vect ){
switch (TWSR & 0xF8){
case 0x60: //address
TWCR = (1‹‹TWINT)|(1‹‹TWEN)|(1‹‹TWEA)|(1‹‹TWIE);
break;
case 0x70: //generall call
TWCR = (1‹‹TWINT)|(1‹‹TWEN)|(1‹‹TWEA)|(1‹‹TWIE);
break;
case 0x80: //data recieve
cmd = TWDR;
OCR1AL = cmd;
OCR1BL = cmd;
TWCR = (1‹‹TWINT)|(1‹‹TWEN)|(1‹‹TWEA)|(1‹‹TWIE);
break;
case 0xA0: //stop
count = 0;
break;
default:
break;
}
} |
Может быть ошибся где, хотя вроде все по даташиту.
Есть сомнение по поводу скорости приемника (8МГц). Может быть маленькая частота??
UPD: Проблема решена. Если кому интересно, в приемнике после детектирования стоп сигнала необходимо установить биты. Вот кусок кода приемника:
Код:
|
case 0xA0: //stop
TWCR = (1‹‹TWINT)|(1‹‹TWEN)|(1‹‹TWEA)|(1‹‹TWIE);
count = 0;
break; |