Почему я получаю только первый байт адреса? (Протокол I2C)
Ожидая, что раб признает и вернет данные, но это не так. Это мой протокол. Это мой паспорт.
Также к вашему сведению, я нахожусь на Arduino Fio, но я не наследую библиотеку Arduino.
#include <avr/io.h>
#include <util/delay.h>
#include <stdlib.h>
#include <uart.h>
#include <i2c_master.h>
#define LED PB5
#define I2C_READ 0x5A
char buffer[1];
//char data[9];
uint16_t val = 0;
uint8_t status = 0;
void getVal()
{
if(i2c_start(I2C_READ))
{
uart_puts("Start ");
val = ((uint8_t)i2c_read_ack())<<8;
val |= i2c_read_ack();
status = ((uint8_t)i2c_read_nack());
i2c_stop();
} else
{
uart_puts("Error");
i2c_stop();
}
}
int main(void)
{
init_uart(57600);
i2c_init();
DDRB = _BV(5);
for(;;)
{
getVal();
itoa(status, buffer, 10); //convert decimal to string base 10
uart_puts(buffer);
PORTB = 0xFF;
_delay_ms(500);
PORTB = 0x00;
_delay_ms(500);
}
return 0; /* never reached */
}
@Womble, 👍3
1 ответ
▲ 1
(Признавая, что это старый вопрос.) В статье TI"Устранение неполадок протокола шины I2C" предлагается несколько распространенных причин отсутствия ACK:
1. Синхронизация
2. Отсутствующие / Неожиданные импульсы SCL
3. Неполный 8-битный блок
4. Недостающие байты
5. Ложный адрес ведомого устройства
6. Неудачное изменение адреса
,
@RowanP
Смотрите также:
- AVR (Arduino Uno) Serial.print и Serial.println печатают только 1 или 2 символа
- Прерывание переполнения таймера AVR не работает
- Работа с основной библиотекой Wire
- о том, как записать данные во весь EEprom?
- Вопрос по управлению выводами с помощью расширения ввода-вывода PCA9534PW
- Получение байтов i2c на attiny85
- устаревшее преобразование из строковой константы в 'char*'
- Отправка и получение различных типов данных через I2C в Arduino