Почему я получаю только первый байт адреса? (Протокол 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 */
}

, 👍3


1 ответ


1

(Признавая, что это старый вопрос.) В статье TI"Устранение неполадок протокола шины I2C" предлагается несколько распространенных причин отсутствия ACK:

1. Синхронизация
2. Отсутствующие / Неожиданные импульсы SCL
3. Неполный 8-битный блок
4. Недостающие байты
5. Ложный адрес ведомого устройства
6. Неудачное изменение адреса
,