Столкнулся с проблемой и не вижу где же я ошибся. Прошу помочь подсказать кто может:)
Суть в следующем, есть МК Атемега32(по сути не важно какая) и датчик влажности/температуры SHT21. Пытаюсь подружить их по шине I2C. проверяю аботу в протеусе 8 версии. и вот тут получаю ошибки в чтении с датчика.
Ниже участок кода для работы с I2C
Спойлер
Код: Выделить всё
//Функция СТАРТ TWI (I2C)
void I2C_StartCondition(void)
{
TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);
while(!(TWCR&(1<<TWINT)));//подождем пока установится TWIN
}
//-----------------------------------------------------
//Функция СТОП TWI (I2C)
void I2C_StopCondition(void)
{
TWCR = (1<<TWINT)|(1<<TWSTO)|(1<<TWEN);
}
//-----------------------------------------------------
//Функция для передачи байта в шину TWI (I2C)
void I2C_SendByte(unsigned char c)
{
TWDR = c;//запишем байт в регистр данных
TWCR = (1<<TWINT)|(1<<TWEN);//включим передачу байта
while (!(TWCR & (1<<TWINT)));//подождем пока установится TWIN
}
//----------------------------------------------------
//Функция чтения с шины TWI (I2C)
unsigned char I2C_Read(void)
{
TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWEA);//включим прием данных
while(!(TWCR & (1<<TWINT)));//подождем пока установится TWIN
return TWDR;
}
//------------------------------------------------------
//Функция чтения с шины TWI (I2C) ПОСЛЕДНЕГО БАЙТА
unsigned char I2C_ReadLastByte(void)
{
TWCR = (1<<TWINT)|(1<<TWEN);//включим прием данных
while(!(TWCR&(1<<TWINT)));//подождем пока установится TWIN
return TWDR;
}
//--------------------------------------------------------
//*********************************************************
//Основной код
int main(void)
{
port_ini(); //Инициализируем порты
I2C_Init(); //Инициализируем шину TWI (I2C)
while (1)
{
I2C_StartCondition(); //Отправим условие START
I2C_SendByte(0b10000000); //Кидаем на линию адрес устройства
I2C_SendByte(0b11100101); //выбор измерения RH в нормальном режиме
//_delay_ms(1000);
I2C_StartCondition();
I2C_SendByte(0b10000001); //чтение с датчика
I2C_Read() ;
I2C_ReadLastByte();
I2C_StopCondition(); //Отправим условие STOP
//data = data1+data2;
}
}
см вложение.
Как видно из скрина, то ответы от датчика идут через один.
ответ 95 и 12 - корректный
следом за этим идут данные 12 и 12 - и это уже бред. и так по кругу.
Где то есть ошибка, вопрос где? прошу помочь
Добавлено after 2 hours 27 minutes 7 seconds:
Опытным путем, пришел к выводу что проблема где то тут
Спойлер
Код: Выделить всё
//Функция чтения с шины TWI (I2C)
unsigned char I2C_Read(void)
{
TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWEA);//включим прием данных
while(!(TWCR & (1<<TWINT)));//подождем пока установится TWIN
return TWDR;
}
//_______- Вложения
-
- Безымянный.jpg
- (124.53 КБ) 291 скачивание


