Здравствуйте, господа!
Возникла у меня такая проблема - пытаюсь подключить 24C через TWI. Написал такую программу в CVAVR:
#include <mega16.h>
void init(void)
{
TWBR=0x0A;
TWAR=0x00;
TWCR=0x40;
TWSR=0x00;
DDRD=0xff;
PORTD=0;
}
void twi_start (void)
{
TWCR=0xE4; //формируем сигнал старта
while (!(TWCR & (1<<TWINT)));
TWCR=0<<5; //обнуляем бит TWSTA
while (!(TWCR & (1<<TWINT)));
}
void send_byte (char byte)
{
TWDR=byte;
TWCR=0xC4;
while (!(TWCR & (1<<TWINT)));
}
void start_tx (void)
{
send_byte(0xA0); //Настраиваем EEPROM на прием информации
}
void main (void)
{
init();
twi_start();
start_tx();
send_byte(0x00); //Посылаем первую половину адреса
send_byte(0x00); //Посылаем вторую половину адреса
send_byte(0x53); //Посылаем данные для записи
twi_start();
send_byte(0xA0); //Настраиваем устройство на запись
send_byte(0x00); //Первая половина адреса чтения
send_byte(0x00); //Вторая половина адреса чтения
twi_start(); //Рестарт
send_byte(0xA1); //Переводим EEPROM на выдачу информации
TWCR=0xC4;
while (!(TWCR & (1<<TWINT)));
PORTD=TWDR; //Выводим принятые данные на порт D
}
В процессе написания и параллельной отладки в Протеусе (6.9 SP4) обнаружил такие странности:
1. При отсылке байта с микроконтроллера почему-то никогда не приходит подтверждение (согласно регистру статуса, который так же выводил на порт, а даташит утверждает, что должны), но при этом сообщения о формировании старта воплне адекватные.
2. При чтении ячейки выдавалось 0xFF.
3. EEPROM указывал пустой файл - при отправке байта в него ничего не писалось.
Заранее благодарен за помощь.
С уважением Андрей
P.S. Смриншот со схемой прилагаю
ATmega16 и 24С32
ATmega16 и 24С32
- Вложения
-
- Schema.jpg
- (182.75 КБ) 529 скачиваний
- Реклама
Re: ATmega16 и 24С32
если уж тут atmega, 24 c b сode vision - никак не могу въехать, что делает в сv прерывание
interrupt [TWI] void twi_isr ( void )
интуитивно думал, что оно вызывается когда операция i2c аппаратного завершается (получен ankn и подобное)?
Написал код постраничной записи /чтения 24с, код работает, прерывание не вызывается. Дело в том, что мк есть другие дела, и ему некогда ждать 2-3 мс (время записи чтения от обращения до Стоп).
Теперь думаю, что прерывание это вызывается только когда общий колл или обращение к i2c м-контроллера как к слейву (ну адрес совпал)?
Даташит самого cv курил, там несколько строк и совершенно непонятно, что это прерывание делает. Из даташита к атмеге вроде следует, что мк может сгенерить прерывание, когда операция на i2c шине завершена - а тогда вопрос, как это прерывание добыть в CV?
Ну в крайнем случае конечно сделаю по службе таймеров - послал старт, ушел, вернулся через х мкс, посмотрел ответ, послал контрл байт, ушел, вернулся через у мкс, посмотрел ответ и т.д. - но хотелось бы попроще и как следствие понадежнее.
interrupt [TWI] void twi_isr ( void )
интуитивно думал, что оно вызывается когда операция i2c аппаратного завершается (получен ankn и подобное)?
Написал код постраничной записи /чтения 24с, код работает, прерывание не вызывается. Дело в том, что мк есть другие дела, и ему некогда ждать 2-3 мс (время записи чтения от обращения до Стоп).
Теперь думаю, что прерывание это вызывается только когда общий колл или обращение к i2c м-контроллера как к слейву (ну адрес совпал)?
Даташит самого cv курил, там несколько строк и совершенно непонятно, что это прерывание делает. Из даташита к атмеге вроде следует, что мк может сгенерить прерывание, когда операция на i2c шине завершена - а тогда вопрос, как это прерывание добыть в CV?
Ну в крайнем случае конечно сделаю по службе таймеров - послал старт, ушел, вернулся через х мкс, посмотрел ответ, послал контрл байт, ушел, вернулся через у мкс, посмотрел ответ и т.д. - но хотелось бы попроще и как следствие понадежнее.
Фонтаны на Outlet Village Белая Дача, г Наро- Фоминск
Цех упаковки стройматериалов
Цех пиролиза покрышек с крекингом и ректификацией
Серийные приборы "Умный Дом" Uniel
Премия первой степени "Больше чем профессия" 2016 г
Цех упаковки стройматериалов
Цех пиролиза покрышек с крекингом и ректификацией
Серийные приборы "Умный Дом" Uniel
Премия первой степени "Больше чем профессия" 2016 г
