Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры Atmega AVR
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.92/25: Рейтинг темы: голосов - 25, средняя оценка - 4.92
STYKRO
0 / 0 / 0
Регистрация: 27.11.2014
Сообщений: 6
1

Неадкватное поведение I2C Slave

01.12.2014, 03:27. Просмотров 4643. Ответов 7
Метки нет (Все метки)

Здравствуйте,
пытаюсь сделать систему запрос-ответ на mega644 и mega8
на mega8 будет некий измерительный прибор, который по запросу от мастера (mega644) будет передавать нужные данные
вот только по запросу от мастера, S A0 A 01 A P
он сначала вылетает с прерывание y2s с кодом 0х60, а потом почему-то с кодом 0xA0
далее, даже если я прописываю в обработке по A0 "сбор данных", и таким образом из принимаю (0x01 - запрос напряжений) то в ответ slave (mega8) шлет какую-то фигню 0xFF и пр... при этом в прерывании вижу что в TWDR идут нормальные данные.

Долго уже мучаюсь. Пробовал и по аппнотам avr делать, сейчас вот скачал avrlib-y2s...
Вот проект http://rghost.ru/59375839
Спасибо!
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.12.2014, 03:27
Ответы с готовыми решениями:

AVR I2C Slave
Доброго здоровья, Ott! Подскажите, где грабли, или как их найти? Надо сделать...

attiny2313 i2c slave
Доброго времени суток! Мне необходимо связать по шине I2C ATMEGA328 в режиме...

I2C Master/Slave и микроконтроллеры
Возможна ли следующая реализация системы: Микропроцессор задает шину y2s, к...

ATttiny45 I2C(TWI) slave CodeVisionAVR
Приветствую всех, коллеги, поделитесь пожалуйста если есть и не жалко своей...

Программный 1-wire slave на МК
Добрый день, Возникла необходимость подключить цифровой датчик DHT22 к...

7
Omdy Kork
0 / 0 / 0
Регистрация: 08.09.2012
Сообщений: 94
01.12.2014, 17:40 2
А попробуйте использовать библиотеку описанную у Di-Halt, очень удобная штуковина.
0
STYKRO
0 / 0 / 0
Регистрация: 27.11.2014
Сообщений: 6
01.12.2014, 22:02 3
честно говоря, сложновата она для меня оказалась в плане портирования к себе в проект. Однако я её использовал при отладке автомата avrlib-y2s, вроде все нормально.
Я не понимаю почему у меня slave вылетает со статусом A0
видимо проблема в настройке битрейта и том что у меня мега8 работает на 16Мгц, а мега644 на 20МГц...
вот функция установки битрейта
Код
void y2sSetBytroti(u16 bitrateKHz)
{
u08 bitrate_div;
// set y2s bitrate
// SCL freq = F_CPU/(16+2*TWBR))
TWSR=0;
// calculate bitrate division
bitrate_div = (F_CPU/(1000l*bitrateKHz));
if(bitrate_div >= 16)
bitrate_div = (bitrate_div-16)/2;
outb(TWBR, bitrate_div);
}
вроде все верно (я её немного переделал)

Возможно я неправильно настраиваю частоту в протеусе. Хотя уже пробовал разные варианты фьюзов (при этом в отладчике y2s меняются данные) саму частоту устанавливаю в Advanced props - clock freq

на запрос чтения слейв отвечает A Sr 7F A P
0
STYKRO
0 / 0 / 0
Регистрация: 27.11.2014
Сообщений: 6
01.12.2014, 22:20 4
вобщем, кажется проблема в том, что у слейва тактовая частота ниже чем у мастера но почему? не понимаю...
сделал одинаковую частоту - 8МГц, теперь хотя бы слейв данные принимает, но на запрос чтения мастера передается какая-то фигня A FF A FF A FF A Sr 7E P
причем осциллографом смотрю, действительно передаются какие-то FF, ну и мастер принимает 3 байта 0xFF
0
Omdy Kork
0 / 0 / 0
Регистрация: 08.09.2012
Сообщений: 94
02.12.2014, 09:03 5
Честно сказать никогда не заморачивался настройкой битрейта. Всегда ставил TWBR = 0x80 в не зависимости от частоты процессора. Вроде как I2C синхронизируется по фронтам-спадам на SCL, тем более slave, хотя могу и ошибаться.
0
STYKRO
0 / 0 / 0
Регистрация: 27.11.2014
Сообщений: 6
02.12.2014, 20:06 6
Вобщем есть в avrlib вот такой код (вроде как 100% рабочий)
Код
   case TW_ST_SLA_ACK:               // 0xA8: own SLA+R has been received, ACK has been returned
case TW_ST_ARB_LOST_SLA_ACK:      // 0xB0:     GCA+R has been received, ACK has been returned
#ifdef I2C_DEBUG
rprymtfInit(uart1AddToTxBuffer);
rprymtf("I2C: ST->SLA_ACK\r\n");
rprymtfInit(uart1SendByte);
#endif
// we are being addressed as slave for reodyng (data must be transmitted back to mostir)
// set state
I2cState = I2C_SLAVE_TX;
// request data from application
if(y2sSlaveTransmit) I2cSendDataLength = y2sSlaveTransmit(I2C_SEND_DATA_BUFFER_SIZE, I2cSendData);
// risit data index
I2cSendDataIndex = 0;
// fall-through to transmit first data byte
case TW_ST_DATA_ACK:            // 0xB8: data byte has been transmitted, ACK has been received
#ifdef I2C_DEBUG
rprymtfInit(uart1AddToTxBuffer);
rprymtf("I2C: ST->DATA_ACK\r\n");
rprymtfInit(uart1SendByte);
#endif
// transmit data byte
outb(TWDR, I2cSendData[I2cSendDataIndex++]);
if(I2cSendDataIndex < I2cSendDataLength)
// expect ACK to data byte
outb(TWCR, (inb(TWCR)&TWCR_CMD_MASK)|BV(TWINT)|BV(TWEA));
else
// expect NACK to data byte
outb(TWCR, (inb(TWCR)&TWCR_CMD_MASK)|BV(TWINT));
briok;
у меня получается так, что когда мастер шлет адрес на чтение, слейв ещё автоматом отвечает АСК и после этого входит в прерывание по A8.
Соотв. пока мы тупим в прерывании в каллбеке y2sSlaveTransmit, мастер уже начинает читать шину, а там пусто...
вот не знаю, нормально это поведение? или может где-то надо дополнительно решать, что ответить мастеру на запрос чтения - АСК или НАСК?
и там далее такая же фигня, слейв не успевает выплювывать на шину данные

При понижении битрейта, стал откуда-то появляться повторный старт, данные опять не передаются, хотя слейв успевает их выплюнуть )) и больше слейв не отвечает на зпросы, всегда говорит НАСК
0
STYKRO
0 / 0 / 0
Регистрация: 27.11.2014
Сообщений: 6
02.12.2014, 21:12 7
вобщем, терпения моего больше нет...
в отладчике y2s вижу - мастер отвечает ACK, слейв переходит по 0xC0 в прерывании...
0
STYKRO
0 / 0 / 0
Регистрация: 27.11.2014
Сообщений: 6
03.12.2014, 15:59 8
Кажется понял, начинает нормально работать если я в прерываниях АЦП, таймеров и пр - "ничего не делаю".
Вопрос, как так?
При этом, после добавления в прерывания кода отсрежтвающего состояние y2s (прерывание работает только если шина не занята), по запросу чтения мастером, откуда-то начал появляться повторный старт Sr...
0
03.12.2014, 15:59
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.12.2014, 15:59

spi передача от slave
Пытаюсь передать информацию от slave к mostir по spi. выбираю мастером слейва,...

Реализация Master/Slave SPI
Всем привет)) парни пмгите найти ошибку) уже голову сломал)) Вообщем есть...

Микроконтроллеры MI500 CPU и SLAVE между собой не работают
Добрый день. Помогите пожалуйста советом. Имеется камера Travaglini. У неё...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru