Atmega 128 / I2C / Ведомый - Передатчик, Мастер - Приемник

14-12-2014, 17:27 От: admin Посмотрели: 366
Здравствуйте.. Нужно, чтобы ведомый отправлял мастеру 1 байтовое число, а тот выводил его на любой из портов..

2 ATmega 128... Логика написания кода вроде мне ясна.



Мастер:   



1) Отправка "Старт"

2) Отправка адреса подчиненного

3) Ожидание подтверждения

4) Прием данных

5) Отправка стоп



Ведомый:

1) Запись своего адреса в TWAR

2)  TWCR = 0b01000100

3) Ожидание собственного адреса от мастера

4) Отправка подтверждения

5) Отправка данных



Почему он может не работать??



//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>Master:



#define F_CPU 1000000UL

#include <avr/io.h>

#include <util/delay.h>



#define RTC_ADDR 0b11111111 // Адрес ведомого, с которым хотим общаться

#define SLA_R   RTC_ADDR|0b00000001 // 7 бит адреса ведомого + 1 бит чтения

#define SLA_W   RTC_ADDR&0b11111110 // 7 бит адреса ведомого + 1 бит записи



unsigned char I2C_GetStatus(void) // Чтение регистра статуса

{

unsigned char status; //переменная хранения

status = TWSR & 0xF8; //маска

return status;

}



void Master_start(){ // формирование условия "СТРАТ"

  TWCR = (1<<TWINT)|(0<<TWEA)|(1<<TWSTA)|(0<<TWSTO)|(0<<TWWC)|(1<<TWEN)|(0<<TWIE);

  while(!(TWCR & (1<<TWINT))); // Ожидание выполнения (флаг прерывания модуля TWI)

  }



void Master_restart(){ // формирование условия "РЕСТАРТ"

TWCR = (1<<TWINT)|(0<<TWEA)|(1<<TWSTA)|(0<<TWSTO)|(0<<TWWC)|(1<<TWEN)|(0<<TWIE);

while(!(TWCR & (1<<TWINT))); // Ожидание выполнения (флаг прерывания модуля TWI)

}



void Master_stop(){ // Формирование условия "СТОП"

TWCR = (1<<TWINT)|(0<<TWEA)|(0<<TWSTA)|(1<<TWSTO)|(0<<TWWC)|(1<<TWEN)|(0<<TWIE);

  }



void MASTER_SLA_R(){ // Отправка адреса ведомого + 1 бит чтения

  TWDR = SLA_R;

  TWCR = (1<<TWINT)|(0<<TWEA)|(0<<TWSTA)|(1<<TWSTO)|(0<<TWWC)|(1<<TWEN)|(0<<TWIE);

  while (!(TWCR & (1<<TWINT))); // Ожидание выполнения (флаг прерывания TWI)  

  }



void MASTER_OPERATION (){ //

Master_start();

MASTER_SLA_R();



if(I2C_GetStatus()==0x58) //пришли данные от ведущего

  {

  PORTA=TWDR;//читаем значение

  TWCR|=(1<<TWEN);//сбрасываем флаг

  }



Master_stop();

}



int main(void){

   DDRA=0xFF; //порт на выход

while(1){

MASTER_OPERATION();

}

  }



++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++





//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>Slave:





#define F_CPU 1000000UL

#include <avr/io.h>

#include <util/delay.h>

#include <avr/interrupt.h>



//адрес на который отвечает приемник

#define ME_ADDR 0b11111111



unsigned char I2C_GetStatus(void) // Чтение регистра статуса

{

unsigned char status; //переменная хранения

status = TWSR & 0xF8; //маска

return status;

}





void Slave_ALL_ready(){ // Инициализация ведомого передатчика

  TWBR = 0xFF;

  TWAR = ME_ADDR;

  TWCR = (0<<TWINT)|(1<<TWEA)|(0<<TWSTA)|(0<<TWSTO)|(0<<TWWC)|(1<<TWEN)|(0<<TWIE); // Подтверждение

  }



void UPload(){

if(I2C_GetStatus()==0xA8){ // Если был принят собственный адрес и передано подстверждение

TWDR = 0b10100101;

TWCR = (1<<TWINT)|(0<<TWEA)|(0<<TWSTA)|(0<<TWSTO)|(0<<TWWC)|(1<<TWEN)|(0<<TWIE);

while(!(TWCR & (1<<TWINT))); // Ожидание выполнения (флаг прерывания модуля TWI)

  }

}





int main(void){

Slave_ALL_ready();

  while(1){

  UPload();

  _delay_ms(500);

   }

  }



Не  судите строго, я только недавно изучаю МК

Прикрепленные миниатюры





  • Снимок.PNG





Раздел: Школьникам и студентам

Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь.
Мы рекомендуем Вам зарегистрироваться, либо войти на сайт под своим именем.

Обсудить на форуме


На момент добавления Atmega 128 / I2C / Ведомый - Передатчик, Мастер - Приемник все ссылки были рабочие.
Все публикации статей, книг и журналов, представлены на этом сайте, исключительно для ознакомления,
авторские права на эти публикации принадлежат авторам статей, книг и издательствам журналов!
Подробно тут | Жалоба
Информация
Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.


Опрос

Ваши предпочтения в TRX


Одинарное преобразование
Двойное преобразование
Прямое преобразование
SDR
Другое
Мне всё равно

Популярные новости
Календарь новостей
«    Май 2024    »
ПнВтСрЧтПтСбВс
 12345
6789101112
13141516171819
20212223242526
2728293031